文章目录
任意文件上传下载漏洞原理、复现方式、防范措施
一、任意文件下载
原理
任意文件下载漏洞(Unrestricted File Download)是由于服务端未对用户请求的文件路径进行严格校验,导致攻击者可通过构造恶意路径(如目录穿越)下载系统敏感文件。常见于文件下载接口(如download.php?file=
)未限制访问范围。
一句话:服务端未对文件下载路径进行合法性校验,攻击者通过路径遍历(如../../
)或直接指定路径,下载服务器敏感文件。
示例
pikachu 网站,任意文件下载。
通过 ?filename=../../../index.php
,下载了首页的php文件。
产生原因
1.传递过来的文件名称没有做任何的过滤
2.没有限定只能在某个目录下下载文件
比如写一个绝对路径,只能在这个绝对路径下下载文件等
复现方式
1、判断是否有下载漏洞
- 判断链接
- download.php?path=
- down.php?file=
- 判断包含参数
- &src=
- &path=
- &filepath=
2、尝试下载文件
-
路径穿越攻击
- 示例:通过
filename=../../../../etc/passwd
下载Linux用户信息文件。 - 实战:攻击者利用
../
跳转至根目录,获取/etc/shadow
(密码哈希文件)或/root/.ssh/id_rsa
(SSH私钥)。
- 示例:通过
-
URL编码绕过
- 示例:将
../
编码为%2e%2e%2f
或%252e%252e%252f
(二次编码),绕过简单过滤规则。 - 实战:构造
file=..%252f..%252fetc%252fpasswd
绕过WAF检测。
- 示例:将
-
利用系统特性
- 示例:下载
/var/lib/mlocate/mlocate.db
文件(Linux全文件路径数据库),使用locate
命令快速定位敏感文件路径。 - 实战:通过
locate mlocate.db .ssh
查找SSH密钥文件。
- 示例:下载
防范措施
-
路径过滤与白名单
-
过滤
../
、./
等特殊字符,仅允许访问指定目录(如/downloads/
)。 -
代码示例:
$file = str_replace(array('../', './'), '', $_GET['file']);
-
-
配置访问限制
- 在PHP中启用
open_basedir
,限制文件访问范围(如open_basedir = /var/www/html/
)。
- 在PHP中启用
-
日志监控与权限控制
- 记录文件下载请求日志,监控异常访问(如频繁请求
/etc/passwd
)。 - 设置敏感文件权限为
600
(仅所有者读写)。
- 记录文件下载请求日志,监控异常访问(如频繁请求
二、任意文件上传
原理
任意文件上传漏洞(Unrestricted File Upload)源于服务端未对上传文件的类型、内容、路径进行有效校验,导致攻击者可上传恶意脚本(如Webshell),进而控制服务器。常见于未校验文件扩展名、MIME类型或依赖客户端检测的场景。
一句话:服务端未对上传文件类型、内容或存储路径进行严格校验,攻击者上传Webshell等恶意文件,通过访问该文件执行任意代码。
复现方式
1、寻找上传接口
只要看到有文件上传的地方都可以进行测试
2、前端js校验情况
绕过客户端检测
- 示例:删除前端JavaScript校验函数,直接上传
.php
文件。 - 实战:使用Burp拦截上传请求,修改文件名为
shell.php
。
3、服务端校验情况
检查内容情况
MIME类型欺骗
- 示例:上传PHP木马时,将
Content-Type
改为image/png
绕过服务端校验。 - 实战:构造请求头
Content-Type: image/png
上传恶意文件。
getimagesize()
- 直接伪造头部
GIF89A
copy /b test.png+muma.txt muma.png
- 使用工具增加备注写入一句话木马
利用前提:上传图片马不能直接利用,还需要配合文件包含漏洞利用。
检查后缀情况
解析漏洞利用
- 示例:利用Apache解析特性(如
test.php.abc
被解析为PHP文件)。 - 实战:上传
.htaccess
文件配置AddType application/x-httpd-php .jpg
,使所有.jpg
文件以PHP执行。
防范措施
-
检查后缀:白名单校验与文件重命名
- 仅允许上传指定扩展名(如
.jpg
,.png
),使用随机字符串重命名文件(如20250502_abc123.jpg
)。
- 仅允许上传指定扩展名(如
-
检查内容:内容检测与二次渲染
- 使用
getimagesize()
验证图片真实性,对上传图片进行二次渲染(破坏嵌入的恶意代码)。
- 使用
-
禁用危险解析配置
- 在Apache/Nginx中关闭
.htaccess
覆盖权限,避免解析漏洞(如配置php_admin_value engine Off
)。
- 在Apache/Nginx中关闭
三、综合防御策略
技术层面
-
输入过滤与输出编码
- 使用正则表达式严格校验文件名(如
/^[a-z0-9_\-]+\.(jpg|png)$/i
)。
- 使用正则表达式严格校验文件名(如
-
最小权限原则
- 上传目录设置为不可执行(如
chmod 755 uploads/
),Web服务器以低权限用户运行。
- 上传目录设置为不可执行(如
-
安全框架与组件更新
- 采用成熟框架(如Spring FileUpload)处理上传逻辑,及时修复解析漏洞(如Tomcat、Nginx补丁)。
管理层面
-
渗透测试与代码审计
- 定期扫描文件上传/下载接口,使用工具(如Burp Suite)模拟攻击路径。
-
安全意识培训
- 开发人员需掌握安全编码规范(如OWASP Top 10),避免直接拼接用户输入。
总结
任意文件上传/下载漏洞的核心在于信任用户输入与缺乏纵深防御。通过白名单校验、内容检测、权限隔离等技术手段,结合持续的安全测试与团队培训,可有效降低风险。攻防对抗中需关注新兴绕过技术(如AI生成恶意文件),动态调整防御策略。