【渗透测试】任意文件上传下载漏洞原理、复现方式、防范措施

任意文件上传下载漏洞原理、复现方式、防范措施

一、任意文件下载

原理

任意文件下载漏洞(Unrestricted File Download)是由于服务端未对用户请求的文件路径进行严格校验,导致攻击者可通过构造恶意路径(如目录穿越)下载系统敏感文件。常见于文件下载接口(如download.php?file=)未限制访问范围。

一句话:服务端未对文件下载路径进行合法性校验,攻击者通过路径遍历(如../../)或直接指定路径,下载服务器敏感文件。

示例

pikachu 网站,任意文件下载。

通过 ?filename=../../../index.php,下载了首页的php文件。

产生原因

1.传递过来的文件名称没有做任何的过滤

2.没有限定只能在某个目录下下载文件

​ 比如写一个绝对路径,只能在这个绝对路径下下载文件等

复现方式

1、判断是否有下载漏洞

  1. 判断链接
    • download.php?path=
    • down.php?file=
  2. 判断包含参数
    • &src=
    • &path=
    • &filepath=

2、尝试下载文件

  1. 路径穿越攻击

    • 示例:通过filename=../../../../etc/passwd下载Linux用户信息文件。
    • 实战:攻击者利用../跳转至根目录,获取/etc/shadow(密码哈希文件)或/root/.ssh/id_rsa(SSH私钥)。
  2. URL编码绕过

    • 示例:将../编码为%2e%2e%2f%252e%252e%252f(二次编码),绕过简单过滤规则。
    • 实战:构造file=..%252f..%252fetc%252fpasswd绕过WAF检测。
  3. 利用系统特性

    • 示例:下载/var/lib/mlocate/mlocate.db文件(Linux全文件路径数据库),使用locate命令快速定位敏感文件路径。
    • 实战:通过locate mlocate.db .ssh查找SSH密钥文件。

防范措施

  1. 路径过滤与白名单

    • 过滤.././等特殊字符,仅允许访问指定目录(如/downloads/)。

    • 代码示例

      $file = str_replace(array('../', './'), '', $_GET['file']);
      
  2. 配置访问限制

    • 在PHP中启用open_basedir,限制文件访问范围(如open_basedir = /var/www/html/)。
  3. 日志监控与权限控制

    • 记录文件下载请求日志,监控异常访问(如频繁请求/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()
  1. 直接伪造头部GIF89A
  2. copy /b test.png+muma.txt muma.png
  3. 使用工具增加备注写入一句话木马

利用前提:上传图片马不能直接利用,还需要配合文件包含漏洞利用。

检查后缀情况

解析漏洞利用

  • 示例:利用Apache解析特性(如test.php.abc被解析为PHP文件)。
  • 实战:上传.htaccess文件配置AddType application/x-httpd-php .jpg,使所有.jpg文件以PHP执行。

防范措施

  1. 检查后缀:白名单校验与文件重命名

    • 仅允许上传指定扩展名(如.jpg, .png),使用随机字符串重命名文件(如20250502_abc123.jpg)。
  2. 检查内容:内容检测与二次渲染

    • 使用getimagesize()验证图片真实性,对上传图片进行二次渲染(破坏嵌入的恶意代码)。
  3. 禁用危险解析配置

    • 在Apache/Nginx中关闭.htaccess覆盖权限,避免解析漏洞(如配置php_admin_value engine Off)。

三、综合防御策略

技术层面

  1. 输入过滤与输出编码

    • 使用正则表达式严格校验文件名(如/^[a-z0-9_\-]+\.(jpg|png)$/i)。
  2. 最小权限原则

    • 上传目录设置为不可执行(如chmod 755 uploads/),Web服务器以低权限用户运行。
  3. 安全框架与组件更新

    • 采用成熟框架(如Spring FileUpload)处理上传逻辑,及时修复解析漏洞(如Tomcat、Nginx补丁)。

管理层面

  1. 渗透测试与代码审计

    • 定期扫描文件上传/下载接口,使用工具(如Burp Suite)模拟攻击路径。
  2. 安全意识培训

    • 开发人员需掌握安全编码规范(如OWASP Top 10),避免直接拼接用户输入。

总结

任意文件上传/下载漏洞的核心在于信任用户输入缺乏纵深防御。通过白名单校验、内容检测、权限隔离等技术手段,结合持续的安全测试与团队培训,可有效降低风险。攻防对抗中需关注新兴绕过技术(如AI生成恶意文件),动态调整防御策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值