[红日安全]Web安全Day5 - 任意文件上传实战攻防
字数 1640 2025-08-25 22:58:28

Web安全Day5 - 任意文件上传实战攻防

1. 文件上传漏洞概述

1.1 漏洞简介

文件上传漏洞是指网站WEB应用的文件上传功能没有严格校验上传文件的后缀和文件类型,导致攻击者可以上传任意文件甚至是可执行文件后门。

1.2 漏洞原理

当上传功能的实现代码没有对上传文件进行充分验证时,恶意用户可以通过上传恶意脚本文件(如PHP、ASP、JSP等)来获取服务器控制权。

1.3 漏洞危害

  • 执行服务器端恶意代码
  • 进行数据库操作
  • 管理服务器文件
  • 执行服务器命令
  • 获取WebShell控制权限

2. 文件上传常见点与绕过技术

2.1 常见上传点

  • 上传头像
  • 上传相册
  • 上传附件
  • 添加文章图片
  • 前台留言资料上传
  • 编辑器文件上传

2.2 后缀绕过技术

PHP: php2、php3、php5、phtml、pht
ASP: asa、cer、cdx
ASPX: ascx、ashx、asac
JSP: jsp、jspx、jspf

2.3 常见绕过类型

  1. Content-Type绕过
  2. 前端验证绕过
  3. 文件解析规则绕过
  4. Windows环境特性绕过
  5. 文件名大小写绕过
  6. 双写绕过
  7. 点空格绕过
  8. 文件头检测绕过
  9. 条件竞争绕过

3. 不同系统的解析漏洞

3.1 IIS 5.x/6.0解析漏洞

目录解析漏洞:

www.xxx.com/xx.asp/xx.jpg

服务器会将xx.jpg解析为asp文件执行

文件解析漏洞:

www.xxx.com/xx.asp;.jpg

服务器会忽略分号后的内容,将文件解析为asp

3.2 Nginx解析漏洞

在低版本Nginx中存在由PHP-CGI导致的文件解析漏洞:

www.xx.com/phpinfo.jpg/1.php

PHP会认为phpinfo.jpg是SCRIPT_FILENAME,而1.php是PATH_INFO,从而将jpg文件作为PHP解析

3.3 Apache解析漏洞

Apache从右至左判断后缀,直到找到可识别后缀:

www.xxxx.com/apache.php.bbb.aaa

如果aaa和bbb都不是可识别后缀,文件会被解析为php

4. 文件上传测试方法

4.1 手工测试技术

4.1.1 前端验证绕过

  1. 禁用JavaScript
  2. 使用Burp Suite拦截修改上传请求
  3. 修改文件后缀为允许类型(如jpg),但内容为恶意代码

4.1.2 .htaccess规则文件绕过

  1. 上传.htaccess文件,内容:
AddType application/x-httpd-php .aaa
  1. 上传后缀为.aaa的恶意文件,会被解析为PHP

4.1.3 文件名大小写混合绕过

上传如shell.pHp等大小写混合的文件名

4.1.4 Windows文件流特性绕过

上传文件名格式:

xxx.php::$DATA

访问时直接访问xxx.php

4.1.5 %00截断绕过

  1. 在白名单校验的系统中
  2. 上传路径可控时,使用%00截断:
upload/evil.php%00.jpg

4.1.6 文件头检测绕过

  1. 在恶意文件头部添加图片文件头:
  • JPEG: FF D8 FF E0
  • PNG: 89 50 4E 47
  • GIF: 47 49 46 38
  1. 上传后文件会被识别为图片但执行时作为脚本

4.2 工具FUZZ测试

使用工具生成fuzz字典,如:

python upload-fuzz-dic-builder.py -n test -a jpg -l php -m apache --os win -o upload_file.txt

将字典导入Burp Suite进行批量测试

5. 实战案例

5.1 Weblogic CVE-2018-2894

  1. 访问/ws_utc/config.do
  2. 设置Work Home Dir为可写目录
  3. 上传webshell
  4. 访问上传的文件获取权限

5.2 PHPOK任意文件上传

  1. 后台"工具->附件分类管理"添加php类型
  2. 在内容管理中上传php文件
  3. 访问上传的文件执行代码

5.3 FCKeditor 2.4.3文件上传

  1. 访问上传接口:
/fckeditor/editor/filemanager/upload/php/upload.php
  1. 使用空格绕过黑名单:
shell.php[空格]

6. 漏洞修复建议

6.1 代码层面修复

$ext_arr = array('jpg','png','gif'); // 白名单
$file_ext = strtolower(substr($_FILES['file']['name'], strrpos($_FILES['file']['name'],".")+1));
if(in_array($file_ext, $ext_arr)){
    // 允许上传
}

6.2 其他防护措施

  1. 使用随机文件名并隐藏真实路径
  2. 文件重命名存储
  3. 限制上传目录执行权限
  4. 检查文件内容而不仅是扩展名
  5. 及时更新中间件和CMS版本

7. 总结

文件上传漏洞是Web安全中最常见也最危险的漏洞之一。防御需要从代码验证、系统配置、权限控制等多方面入手,采用白名单机制是最有效的防护手段。同时,开发人员应了解各种绕过技术,才能编写出更安全的文件上传功能。

Web安全Day5 - 任意文件上传实战攻防 1. 文件上传漏洞概述 1.1 漏洞简介 文件上传漏洞是指网站WEB应用的文件上传功能没有严格校验上传文件的后缀和文件类型,导致攻击者可以上传任意文件甚至是可执行文件后门。 1.2 漏洞原理 当上传功能的实现代码没有对上传文件进行充分验证时,恶意用户可以通过上传恶意脚本文件(如PHP、ASP、JSP等)来获取服务器控制权。 1.3 漏洞危害 执行服务器端恶意代码 进行数据库操作 管理服务器文件 执行服务器命令 获取WebShell控制权限 2. 文件上传常见点与绕过技术 2.1 常见上传点 上传头像 上传相册 上传附件 添加文章图片 前台留言资料上传 编辑器文件上传 2.2 后缀绕过技术 PHP : php2、php3、php5、phtml、pht ASP : asa、cer、cdx ASPX : ascx、ashx、asac JSP : jsp、jspx、jspf 2.3 常见绕过类型 Content-Type绕过 前端验证绕过 文件解析规则绕过 Windows环境特性绕过 文件名大小写绕过 双写绕过 点空格绕过 文件头检测绕过 条件竞争绕过 3. 不同系统的解析漏洞 3.1 IIS 5.x/6.0解析漏洞 目录解析漏洞 : 服务器会将xx.jpg解析为asp文件执行 文件解析漏洞 : 服务器会忽略分号后的内容,将文件解析为asp 3.2 Nginx解析漏洞 在低版本Nginx中存在由PHP-CGI导致的文件解析漏洞: PHP会认为phpinfo.jpg是SCRIPT_ FILENAME,而1.php是PATH_ INFO,从而将jpg文件作为PHP解析 3.3 Apache解析漏洞 Apache从右至左判断后缀,直到找到可识别后缀: 如果aaa和bbb都不是可识别后缀,文件会被解析为php 4. 文件上传测试方法 4.1 手工测试技术 4.1.1 前端验证绕过 禁用JavaScript 使用Burp Suite拦截修改上传请求 修改文件后缀为允许类型(如jpg),但内容为恶意代码 4.1.2 .htaccess规则文件绕过 上传.htaccess文件,内容: 上传后缀为.aaa的恶意文件,会被解析为PHP 4.1.3 文件名大小写混合绕过 上传如 shell.pHp 等大小写混合的文件名 4.1.4 Windows文件流特性绕过 上传文件名格式: 访问时直接访问xxx.php 4.1.5 %00截断绕过 在白名单校验的系统中 上传路径可控时,使用%00截断: 4.1.6 文件头检测绕过 在恶意文件头部添加图片文件头: JPEG: FF D8 FF E0 PNG: 89 50 4E 47 GIF: 47 49 46 38 上传后文件会被识别为图片但执行时作为脚本 4.2 工具FUZZ测试 使用工具生成fuzz字典,如: 将字典导入Burp Suite进行批量测试 5. 实战案例 5.1 Weblogic CVE-2018-2894 访问 /ws_utc/config.do 设置Work Home Dir为可写目录 上传webshell 访问上传的文件获取权限 5.2 PHPOK任意文件上传 后台"工具->附件分类管理"添加php类型 在内容管理中上传php文件 访问上传的文件执行代码 5.3 FCKeditor 2.4.3文件上传 访问上传接口: 使用空格绕过黑名单: 6. 漏洞修复建议 6.1 代码层面修复 6.2 其他防护措施 使用随机文件名并隐藏真实路径 文件重命名存储 限制上传目录执行权限 检查文件内容而不仅是扩展名 及时更新中间件和CMS版本 7. 总结 文件上传漏洞是Web安全中最常见也最危险的漏洞之一。防御需要从代码验证、系统配置、权限控制等多方面入手,采用白名单机制是最有效的防护手段。同时,开发人员应了解各种绕过技术,才能编写出更安全的文件上传功能。