关于图片Base64格式上传文件时的漏洞
代码逻辑
今天遇到一个漏洞, 是关于图片上传的, 逻辑代码大概是将图片转化为Base64后上传到服务器.
public function sendCompanyLogo(){
$imgBase64 = input('post.imgBase64/s','','trim');
if (preg_match('/^(data:\s*image\/(\w+);base64,)/',$imgBase64,$res)) {
//获取图片类型
$type = $res[2];
//图片保存路径
$new_file = "upload/";
if (!file_exists($new_file)) {
mkdir($new_file,0755,true);
}
//图片名字
$new_file = $new_file.time().'.'.$type;
if (file_put_contents($new_file,base64_decode(str_replace($res[1],'', $imgBase64)))) {
// 业务代码
} else {
// 上传失败
}
}
}
复盘
- 首先将一个
php木马文件
转化为base64
, 此时会生成一个字符串data:application/octet-stream;base64,xxxxxx
, 其中的xxxxxx
就是木马文件内容. - 将base64字符串替换成
data:image/php;base64,xxxxxx
. - 将此字符串上传后会生成一个php文件
修复代码
是在上传时进行类型检查
if(!in_array(strtolower($type),['jpg','jpeg','png','gif'])){
// 图片类型错误, 并返回
}
最后更新于 2024-04-23 17:49:11 并被添加「」标签,已有 1440 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭