中国网络渗透测试联盟
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
[打印本页]
作者:
admin
时间:
2012-12-4 11:12
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
5 E1 z. w7 a1 j
% Y& b9 d. [5 f9 m1 n
) Z# x) i( o6 E5 b5 F# @$ E
\api\StatusesApi.class.php
5 U; K4 B+ v) Z: m- t- l! p
5 j& R1 @" d; D" W- x
function uploadpic(){
! ]% }' B$ a( d# O4 p
if( $_FILES['pic'] ){
6 Q/ ?" M. R' C, F+ u, d
//执行上传操作
6 ?1 }* z/ j. E0 L
$savePath = $this->_getSaveTempPath();
& N4 b/ E. r2 Y- O
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
" q& N+ m# A. ] V I- z
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
. j, j/ f+ f6 V( B S8 u4 i( V. C
{
! G3 a e, d2 Q4 ?) M
$result['boolen'] = 1;
9 m5 R, u i7 t1 f Z
$result['type_data'] = 'temp/'.$filename;
" r/ D9 D+ y. R+ g# A; i% m
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
% a+ _1 V# E; q: m7 u
} else {
6 r1 H# z: `; g" u! c/ _
$result['boolen'] = 0;
# b) t) i% A7 ?+ c) }( T; [% c
$result['message'] = '上传失败';
1 j, J; C- I" K# F
}
8 c0 Z- A9 D2 i& f
}else{
! Y5 j5 b9 y9 E0 M/ G
$result['boolen'] = 0;
, I2 a0 b' g% k H& \
$result['message'] = '上传失败';
) \ U: z0 I7 {( n. P
}
/ L) V: N- h& m9 D
return $result;
6 p i: ?/ Q% s7 s* Y+ H
}
1 \# r0 A" o, z+ a" R" D
unloadpic()方法没有对文件类型进行验证
/ ]( v7 V1 s9 E) X1 J. Y9 j
9 C# C6 e3 z! s. r- U
可以构建表单, 选择任意文件, 提交到
; V9 p; D) _& I" b* J
/index.php?app=w3g&mod=Index&act=doPost
& I) W2 v* F3 Q1 j
6 r' S4 k- \; Q( C0 I+ r0 A
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
2 T8 t& [* P, @# M% J
& v" o& B5 `) a( s! L
0 s1 t; T4 U8 R- a
在登录thinksns官方微博后,
# \. u& N' l6 a& F D
构建以下表单:
% M- g& j: R8 ], R7 X6 A
) m( v2 G! o$ G- B' c m
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
+ [. {" J" S8 m. M1 H2 X& f
<textarea name="content">test</textarea>
+ R6 c# G& D% m/ r; ~; z
file: <input id="file" type="file" name="pic" />
: `" v/ P, _ `" Q. v2 v! ?
<input type="submit" value="Post" />
& c3 [8 d4 v9 M0 z8 L9 K
</form>
- N( P3 _8 C9 a
去掉缩略图的前缀(small_ )
" d6 o" h, B2 r6 E# s# w
修复方案:
7 J0 V0 Z' r7 b R( v. u0 g
L$ B8 j" g, m8 u1 I4 `) Z2 ^+ Y
# ?0 X+ c( z7 _9 T% O, {5 D6 N
\api\StatusesApi.class.php
8 \* f* R @5 Z" A- c1 u, R
& I8 `+ X3 | ~
function uploadpic(){
, m' L/ f* w, Q' X9 n$ q
/**
6 c# h9 l' b0 R* I' w5 v" r* _
* 20121018 @yelo
$ Z u# R7 |, C L3 e
* 增加上传类型验证
- j: r- c) { y+ a2 I$ w
*/
) L! z# g E) W0 V9 {% i
$pathinfo = pathinfo($_FILES['pic']['name']);
" G/ m( m* T* V) G8 Q
$ext = $pathinfo['extension'];
/ E0 `. ?2 |4 v$ @: N' i( P: g" c
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
4 i6 S8 j( @/ q" g
. f* O. P0 f1 A3 b b1 X
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
0 u# y; ~+ D3 }* D
# i8 } t$ k/ b# o% C
if( $uploadCondition ){
" ~7 R+ _: B3 t9 J+ l" i
//执行上传操作
( Z3 a& m* W1 i' h3 `# H
$savePath = $this->_getSaveTempPath();
! O/ m* B4 M3 t4 e- r
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
* X- {# r9 F' T. R7 l
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' i' q# L- t5 o& y% z
{
: j+ x+ T2 _; M. M8 t" N) S# X* U
$result['boolen'] = 1;
# j: |' i, m: r; ]
$result['type_data'] = 'temp/'.$filename;
! t% ~- @! ?1 a8 H
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
; b9 w) f/ J: A' P
} else {
% [( g2 F, Q% L
$result['boolen'] = 0;
/ N. j9 y% e( [: @6 E# H
$result['message'] = '上传失败';
3 l; O" h( v* T: V8 ]
}
* S+ q* e: \* `9 a# l7 y$ u/ Z
}else{
8 b8 x2 [& Q9 I1 B0 F1 L: w* I
$result['boolen'] = 0;
5 b: n: r& k' @: p
$result['message'] = '上传失败';
) i% F$ [# C6 |
}
" M% X6 y8 ?) C! c" W5 |" h: b
return $result;
6 a3 ]" I( G' k6 {) L6 T2 R
}
2 z2 r8 @( Q+ e
- g5 _% F* e" r
- L( o/ j$ Y, a( }3 F( j/ `
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2