中国网络渗透测试联盟
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
[打印本页]
作者:
admin
时间:
2012-12-4 11:12
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
, G8 [/ U% e2 v2 |6 }8 F9 r! f6 G
- ]7 C. E! U2 B% D* f6 p6 n& I
6 q- c6 r) } S4 ^( n; i/ T5 _
\api\StatusesApi.class.php
/ j& y7 s3 t: d% G
F0 a' y, K0 l# @7 [4 j. O
function uploadpic(){
- W$ q! b/ a9 u; i
if( $_FILES['pic'] ){
: [+ Q* r9 e8 M7 A# U9 _: s9 |3 E
//执行上传操作
: D" ^ S0 F+ p9 ~: K% P& M
$savePath = $this->_getSaveTempPath();
3 _8 T( Z3 I7 V: i
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
/ W- P% s7 a4 g3 [
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
5 b5 H$ c4 b3 N* Z' r) T3 U
{
& K( Z. K( C+ e: [0 M j6 `
$result['boolen'] = 1;
# Q3 k( Q4 P+ {) Q
$result['type_data'] = 'temp/'.$filename;
% G. e" t/ ~6 S s, ^- E
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
& C' ]& v2 I& k# h$ m6 w) d
} else {
2 [3 l5 w2 K( W6 @
$result['boolen'] = 0;
3 t, | ?9 P. |: ]
$result['message'] = '上传失败';
% ] i# o/ i3 [8 H! c! L- q
}
/ q, `+ w) W- q" p( J" @0 k7 v
}else{
6 r7 e- A) D% K; V7 M5 f) _, q, p
$result['boolen'] = 0;
2 u: D5 i* S( x( H$ s- B
$result['message'] = '上传失败';
1 v: N' @. v$ O) F# S8 g$ ]
}
0 a t" B2 Y6 B; W
return $result;
3 g# z; c( M' M. x. B
}
: w7 J$ W- s$ b" A4 I5 ~. j$ }5 J
unloadpic()方法没有对文件类型进行验证
4 I$ G* x( `' S1 i2 P2 I
8 e, J8 x' }2 u! o' y; z: p
可以构建表单, 选择任意文件, 提交到
5 _+ T# m4 Y6 ^- f1 J0 d
/index.php?app=w3g&mod=Index&act=doPost
+ Y. n" \, j/ w! k) X. S* H9 b$ z
- f' ?3 F" ~* h5 l! H7 X) P3 r1 n
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
* c2 e( i* f. y3 l
# J& m' D; ~" I
( R7 b% Q: D. N: x
在登录thinksns官方微博后,
, U" B( h) U/ r4 H2 o1 k1 D8 @
构建以下表单:
) g; t3 G9 d2 z* j
. t& I5 S5 x& v* T5 B& I
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
7 I! K9 Y: z* k
<textarea name="content">test</textarea>
, V( i) n- K: E1 k7 m1 q
file: <input id="file" type="file" name="pic" />
$ {- G7 g9 j4 P) s) E' Z/ ?+ Y1 n
<input type="submit" value="Post" />
0 F; X% D" x' y2 h0 \, }
</form>
3 k P8 V4 h( A) g6 w& |
去掉缩略图的前缀(small_ )
8 T4 B3 j" W, v3 d% |2 }6 N% {3 d
修复方案:
i' B0 v" n& b1 C5 B$ H
$ T5 b8 l `' j2 w
( N) Y! S7 Q8 s6 \# L4 b( y
\api\StatusesApi.class.php
, b* [/ w! V: i* M9 J# _- T' {
' `" ^5 V6 c |: H
function uploadpic(){
f" X, D) m. C( k8 q
/**
9 V, G! a! r! W+ a7 }2 p. G3 K
* 20121018 @yelo
H; ~: {. i+ n9 g' f; a4 |5 D: V
* 增加上传类型验证
: s6 Y3 |5 T/ R5 a- ?
*/
& m9 w: R0 e: I8 \ ?+ p
$pathinfo = pathinfo($_FILES['pic']['name']);
* H3 Y$ d8 i5 b3 ?) r8 ?
$ext = $pathinfo['extension'];
4 M. D- T& U! S4 r( `! M5 c$ W0 M
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
. b+ J7 k9 f* c: L& p8 Y0 t
: p+ v7 a+ H% _' ?6 w/ H
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
( |4 n9 q2 O7 h! ?! w" |7 Q
9 X# N! i% J0 @- n% w
if( $uploadCondition ){
) ?. q9 C) a0 `6 V4 X) N% l
//执行上传操作
2 X. V# L. A2 S& F
$savePath = $this->_getSaveTempPath();
$ W4 J6 h' m1 U" U8 s* d
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
; m. }; m6 Y' S% a! b4 d5 |/ q
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
# P6 W0 \: x- c8 q' K
{
4 C' S* j: r* Y1 P( k; p
$result['boolen'] = 1;
9 d6 @& W* C$ d* ~" }
$result['type_data'] = 'temp/'.$filename;
R1 L( o' F. p" Q% b, t4 z. }% }
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
5 S" L# }% \+ t; E/ t" H# B
} else {
% a1 R; x" P7 S! n
$result['boolen'] = 0;
2 V1 y! N3 N: L5 u: B
$result['message'] = '上传失败';
/ {+ s, q `' X" d- N$ p
}
2 s3 f0 ~" t, a# ?; z* L$ F
}else{
# R. g+ ]5 I0 H N9 w
$result['boolen'] = 0;
7 p, a1 ?$ w5 d+ t) I
$result['message'] = '上传失败';
' ?! ~% v M3 H% m
}
6 J0 O, {! u0 Z1 e: R% h
return $result;
5 c, h! k+ k/ d( }) y
}
# N6 S% t, W9 w. Y
( Q% E M% p/ c# E. N- P8 |
6 [! q4 K# n- s! Y
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2