文件上传漏洞测试技巧

文件上传漏洞测试技巧

文件上传漏洞通常发生在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】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值