文件上传漏洞测试技巧
文件上传漏洞通常发生在Web应用程序允许用户上传文件但未严格验证文件内容的情况下,攻击者尝试上传恶意文件(如webshell)以获取服务器控制权
现代Web应用程序通常会部署客户端和服务端的安全防御措施:
客户端防御:文件类型检查(如限制文件扩展名)、文件大小限制、MIME类型检查等。
服务端防御:文件扩展名白名单/黑名单、文件内容检查、文件重命名、存储路径隔离、权限控制等。
客户端绕过技巧
客户端验证通常发生在浏览器端(如JavaScript验证),可以通过修改请求或禁用JavaScript来绕过
修改文件扩展名
**场景:**客户端限制只能上传.jpg、.png等图片文件。
绕过方法:
将恶意文件(如shell.php)重命名为shell.jpg,然后在上传时拦截请求,将扩展名改回shell.php。
使用Burp Suite等代理工具修改HTTP请求中的文件名或MIME类型。
防御建议:
不要仅依赖客户端验证,服务端必须重新验证文件类型。
修改MIME类型
**场景:**客户端检查上传文件的Content-Type头(如只允许image/jpeg)。
绕过方法:
使用代理工具修改请求头,将Content-Type伪装为合法类型(如image/jpeg),即使文件内容是恶意脚本。
防御建议:
服务端应通过文件内容签名(如文件头)验证文件类型,而不仅仅依赖Content-Type
禁用JavaScript
**场景:**客户端通过JavaScript限制文件类型或大小。
绕过方法:
在浏览器中禁用JavaScript,或者直接构造HTTP请求,绕过客户端验证逻辑
防御建议:
客户端验证仅作为用户体验的辅助,核心验证必须在服务端完成
服务端绕过技巧
服务端防御通常更严格,但也可能存在配置错误或逻辑漏洞
扩展名黑名单绕过
**场景:**服务端使用黑名单(如禁止.php、.asp等)过滤文件扩展名。
绕过方法:
使用不常见的扩展名(如.php5、.phtml、.shtml等),这些可能未被列入黑名单但仍可被解析为脚本
使用大小写混淆(如.pHp),如果服务端验证对大小写不敏感
使用双扩展名(如shell.jpg.php),如果服务端仅检查最后一个扩展名
利用中间件解析漏洞进行绕过,具体可以看上期中间件的解析漏洞总结
防御建议:
使用严格的白名单(如只允许.jpg、.png等),并确保验证逻辑大小写敏感。
文件内容检查绕过
**场景:**服务端检查文件内容(如检查文件头是否为图片文件的魔法字节)。
绕过方法:
1、图片马注入,将Webshell代码嵌入图片元数据中:
exiftool -Comment="<?php system($_GET['cmd']); ?>" image.jpg
2、伪造文件头。魔术字节是一组位于文件开头的特定字节序列,用来识别文件格式
JPEGFF D8 FF E0(十六进制)
PNG89 50 4E 47 0D 0A 1A 0A
GIF47 49 46 38
3、混淆代码,使用编码、压缩或注释绕过正则检测:
<?php /*<?= 'GIF89a'; ?>*/ system($_GET['cmd']); ?>
4、分块编码绕过WAF对请求数据包的内容检测
通过分块传输(Chunked Encoding)打乱WAF对固定格式的检测
使用Burp Suite的 “Chunked Encoding Converter” 插件,将请求分 块发送,干扰WAF对 Content-Type
的匹配。
防御建议:
对文件内容进行全面检查,并禁止解析上传目录中的文件为脚本。
文件重命名绕过
**场景:**服务端会将上传的文件重命名(如随机文件名),但保留原始扩展名。
绕过方法:
如果服务端未正确处理文件名中的多个扩展名(如配置错误导致.php.jpg被解析为PHP),攻击者可上传类似shell.php.jpg的文件。
利用路径穿越漏洞(如上传文件名为…/…/shell.php),将文件存储到可执行目录
防御建议:
对文件名进行严格清理,禁止任何路径字符(如…/),并确保上传文件存储在不可执行目录
利用文件包含漏洞
**场景:**服务端允许上传非脚本文件(如.txt),但存在本地文件包含(LFI)漏洞。
绕过方法:
上传包含恶意代码的.txt文件,然后通过LFI漏洞
(如include($_GET[‘file’]))触发执行。
防御建议:
修复LFI漏洞,禁止用户控制的文件被包含或执行。
利用服务器解析漏洞
**场景:**某些Web服务器(如Apache、Nginx)对文件名解析存在漏洞。
绕过方法:
上传文件名为shell.php;1.jpg,IIS6.0只检查.jpg,但实际解析为.php。
利用旧版Apache的解析特性(如文件名从右向左解析,直到遇到可识别的扩展名),上传shell.php.xyz可能被解析为PHP文件。
防御建议:
禁用服务器的多扩展名解析,启用严格的文件类型验证
利用文件上传的处理逻辑
**场景:**服务端在上传后对文件进行处理(如图片压缩、格式转换)。
绕过方法:
1、利用HTTP参数污染
如发送多个同名参数filename=shell.jpg和filename=shell.php,
某些服务端框架可能取最后一个参数值,从而绕过扩展名检查。
2、如果处理逻辑存在漏洞(如ImageMagick的命令注入漏洞),可以在
图片元数据(如EXIF)中嵌入恶意代码
3、利用处理后的文件存储路径漏洞,将文件存储到可执行目录
防御建议:
对上传文件进行严格隔离,禁止存储到Web根目录,确保处理逻辑安全
其他高级技巧
在某些情况下,可以结合其他漏洞或利用环境配置问题,进一步提升绕过成功率
利用竞争条件
**场景:**服务端在验证文件后将其存储到临时目录,随后才移动到最终目录
绕过方法:
在文件验证通过但尚未删除/移动时,快速访问临时文件路径,触发执行
防御建议:
使用原子操作处理文件上传,确保验证和存储过程不可中断
利用第三方组件漏洞
**场景:**文件上传功能依赖第三方组件(如文件解析库、图片处理库)。
绕过方法:
针对第三方组件的已知漏洞(如ImageMagick的CVE漏洞),构造特定的恶意文件触发漏洞
防御建议:
及时更新第三方组件,限制上传文件的处理范围
利用配置错误
**场景:**服务器配置错误导致上传文件可被执行
绕过方法:
如果上传目录未正确设置(如未禁用脚本解析),即使上传的是.php文件,也可能被直接执行
若服务器配置允许覆盖选项(如AllowOverride All),攻击者可上传包含如下代码行的.htaccess文件,强制将.jpg解析为PHP。
AddType application/x-httpd-php .jpg
防御建议:
禁用上传目录的脚本执行权限,禁止上传.htaccess等配置文件
利用编码技巧
**场景:**服务端对文件名或内容进行过滤
绕过方法:
使用双重编码(如URL编码、Unicode编码)混淆文件名或内容,绕过过滤规则
使用NULL字节(如shell.php%00.jpg),截断服务端的文件名验证
防御建议:
对文件名和内容进行严格解码和规范化,禁止NULL字节等特殊字符
防御建议
为了防止文件上传漏洞被利用,建议从以下几个方面加强防御:
文件类型验证:
使用严格的白名单限制文件扩展名(如只允许.jpg、.png)
通过文件内容签名(如魔数)验证文件类型,而不仅仅依赖MIME类型或扩展名
文件存储隔离:
将上传文件存储到不可执行目录(如设置Nginx/Apache禁止解析上传目录中的脚本)
使用随机文件名(如UUID),避免用户控制文件名
权限控制:
限制上传文件的权限(如只读权限),防止被直接执行
确保上传目录与Web根目录分离,防止路径穿越攻击
输入验证:
对文件名和内容进行严格过滤,禁止特殊字符(如…/、\、.等)
对文件大小进行限制,避免资源耗尽攻击
安全配置:
禁用服务器的多扩展名解析,启用严格的MIME类型检查
定期检查服务器配置,确保上传目录的安全性
日志监控:
记录所有文件上传操作,便于事后审计
配置入侵检测系统(IDS)或Web应用防火墙(WAF),检测异常上传行为
接下来我将给各位同学划分一张学习计划表!
学习计划
那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:
阶段一:初级网络安全工程师
接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。
综合薪资区间6k~15k
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?
阶段二:中级or高级网络安全工程师(看自己能力)
综合薪资区间15k~30k
7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。
零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;
Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完
用Python编写漏洞的exp,然后写一个简单的网络爬虫
PHP基本语法学习并书写一个简单的博客系统
熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)
了解Bootstrap的布局或者CSS。
阶段三:顶级网络安全工程师
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
学习资料分享
当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。
