[红日安全]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 常见绕过类型
- Content-Type绕过
- 前端验证绕过
- 文件解析规则绕过
- Windows环境特性绕过
- 文件名大小写绕过
- 双写绕过
- 点空格绕过
- 文件头检测绕过
- 条件竞争绕过
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 前端验证绕过
- 禁用JavaScript
- 使用Burp Suite拦截修改上传请求
- 修改文件后缀为允许类型(如jpg),但内容为恶意代码
4.1.2 .htaccess规则文件绕过
- 上传.htaccess文件,内容:
AddType application/x-httpd-php .aaa
- 上传后缀为.aaa的恶意文件,会被解析为PHP
4.1.3 文件名大小写混合绕过
上传如shell.pHp等大小写混合的文件名
4.1.4 Windows文件流特性绕过
上传文件名格式:
xxx.php::$DATA
访问时直接访问xxx.php
4.1.5 %00截断绕过
- 在白名单校验的系统中
- 上传路径可控时,使用%00截断:
upload/evil.php%00.jpg
4.1.6 文件头检测绕过
- 在恶意文件头部添加图片文件头:
- JPEG:
FF D8 FF E0 - PNG:
89 50 4E 47 - GIF:
47 49 46 38
- 上传后文件会被识别为图片但执行时作为脚本
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
- 访问
/ws_utc/config.do - 设置Work Home Dir为可写目录
- 上传webshell
- 访问上传的文件获取权限
5.2 PHPOK任意文件上传
- 后台"工具->附件分类管理"添加php类型
- 在内容管理中上传php文件
- 访问上传的文件执行代码
5.3 FCKeditor 2.4.3文件上传
- 访问上传接口:
/fckeditor/editor/filemanager/upload/php/upload.php
- 使用空格绕过黑名单:
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 其他防护措施
- 使用随机文件名并隐藏真实路径
- 文件重命名存储
- 限制上传目录执行权限
- 检查文件内容而不仅是扩展名
- 及时更新中间件和CMS版本
7. 总结
文件上传漏洞是Web安全中最常见也最危险的漏洞之一。防御需要从代码验证、系统配置、权限控制等多方面入手,采用白名单机制是最有效的防护手段。同时,开发人员应了解各种绕过技术,才能编写出更安全的文件上传功能。