1098 字
5 分钟
第49天:WEB攻防-文件上传
WEB攻防-文件上传&存储安全&OSS对象&分站&解析安全&解码还原&目录执行

目录
一、知识点概览
- 文件上传-安全解析方案-目录权限&解码还原
- 文件上传-安全存储方案-分站存储&OSS对象
二、演示案例
- 文件-解析方案-执行权限&解码还原
- 文件-存储方案-分站存储&OSS对象
- 实例-解析存储-传输&分站&OSS存储
三、文件-解析方案-执行权限&解码还原

1、执行权限
文件上传后,存储目录不给执行权限。
原理
开启禁止目录执行,将服务器的文件上传后存储目录,取消读取和执行的权限。
操作与现象
- 未开启禁止目录执行时:由于文件上传功能未做过滤,直接上传包含后门的木马文件
1.php,上传成功后访问该文件,phpinfo被执行,文件被解析为PHP脚本。 - 开启禁止目录执行后:在小皮网址配置中,选择安全配置→开启禁止目录执行→将禁止执行的目录设置为上传目录(/1/upload);开启后再次访问上传的木马文件,报错403,文件上传漏洞无法被利用。




2、解码还原

数据做存储,解析固定(与文件后缀名无关);文件上传后利用编码传输,再进行解码还原。
核心逻辑
当服务器把上传的文件利用Base64编码转换为数据存储,从根本上解决文件上传漏洞问题——以数据形式存储时,无其他类型文件解析,即使上传后门文件,最终也会被当成图片解析,由固定协议(data:image/png;base64,base数据)解析数据。
实现代码(PHP)
<?php// 处理文件上传if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) { // 获取上传的文件信息 $file = $_FILES['file'];
// 获取文件名和临时文件路径 $filename = $file['name']; $tmpFilePath = $file['tmp_name'];
// 将文件内容转换为Base64编码 $base64Data = base64_encode(file_get_contents($tmpFilePath));
// 输出Base64编码的文件内容 echo $base64Data;
// 如果是图片文件,可以将其在页面上显示 echo '<img src="data:image/jpeg;base64,' . $base64Data . '" alt="上传的图片">';}?>


四、文件-存储方案-分站存储&OSS对象
1、分站存储
- 上传域名:
upload.xiaodi8.com(用于接收文件上传) - 存储域名:
images.xiaodi8.com(对应另一台服务器,目录权限锁死,仅提供存储服务,不提供解析服务——即使上传木马文件,连接后门也无效)


额外安全措施
存储图片的服务器上,对上传文件还会使用Base64编译为数据,进一步降低文件上传隐患。
2、OSS对象
基于Access控制的OSS对象存储,核心是Bucket对象。
核心特性
上传的文件仅作为“网盘文件”存在,不提供解析服务,只支持下载操作。


五、如何判断对应安全方案
- 判断“目录无执行权限”:若目录下已上传木马文件,访问其上传路径时报错403禁止访问,可能是文件上传后存储目录未给予执行权限。

- 判断“解码还原”:上传文件时抓取数据包,若发现数据由固定协议(
data:image/png;base64,base数据)传输,则为解码还原方案。
- 判断“分站存储”:上传图片后,查看图片URL地址的域名与目标上传地址是否一致,若不一致则为分站存储。

- 判断“OSS对象存储”:访问上传的文件路径时,仅能实现访问及下载操作,多半是OSS对象存储。

六、安全绕过
以上安全方案中,除“目录设置权限”可通过换目录解析绕过外,其他方案均无解。
绕过逻辑
控制上传文件的存储目录,绕开已开启“禁止执行”限制的目录(该绕过方式实际作用有限,属于“鸡肋”操作)。


第49天:WEB攻防-文件上传
https://konwait12.github.io/my-kon-blog/posts/049web攻防/