不安全的文件上传(Unsafe FileUpload)
不安全的文件上传是指Web应用程序在处理用户上传的文件时,没有采取足够的安全措施,导致攻击者可能利用这些漏洞上传恶意文件,进而对服务器或用户造成危害。
目录
一、文件上传基础
1.什么是文件上传
2.文件上传漏洞产生原因
3.文件上传漏洞危害
4.可能存在漏洞的位置
5.文件上传检测方式
6.文件上传绕过
二、绕过客户端检测
三、绕过服务端检测
1.服务端代码检测
2.常见MIME类型
3.绕过MIME类型检测
4.黑名单
5.白名单
1. %00截断
2. Ox00截断
6.绕过文件内容检测
文件幻数检测:
文件加载检测:
四、WEB解析漏洞简介
1.apache解析漏洞
2.IIS 6.0解析漏洞
3.IIS 7.0解析漏洞
4.Nginx解析漏洞
一、文件上传基础
1.什么是文件上传
将客户端数据以文件形式封装,通过网络协议发送到服务器端,在服务器解析数据,最终在服务端硬盘上作为真实的文件保存
2.文件上传漏洞产生原因
3.文件上传漏洞危害
上传文件的时候,如果对服务器端脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。
4.可能存在漏洞的位置
图片、头像、文档上传等功能往往都可能存在上传文件验证不严格的安全缺陷。
5.文件上传检测方式
- 客户端JavaScript检测:检查文件扩展名是否符合客户端设定的规则。例如,用户尝试上传.jpg格式的文件,客户端javascript会检查这个文件的扩展名是否为.jpg,若不是则不允许上传;
- 服务端MIME类型检测:检查文件的MIME类型是否符合服务器的期望。MIME类型是一种用于定义文件的类型和格式的标准,如text/plain表示纯文本文件、application/pdf表示PDF格式的文件等,MIME帮助浏览器识别接收到的数据应该以什么方式处理,服务器在发送文件给客户端时,会在HTTP响应的
Content-Type
头部字段中指定MIME类型,客户端根据这个信息来决定如何渲染或处理这个文件。同样,在文件上传时,服务器也可以通过检查文件的MIME类型来验证文件的格式是否符合预期; - 服务端目录路径检测:检查上传的文件路径是否尝试访问服务器上的敏感目录。例如用户尝试上传文件到
/uploads/secret/
目录。服务器检查这个路径是否在允许的上传路径列表中,如果不在,服务器会阻止这次上传,防止用户访问敏感目录; - 服务端文件扩展名检测:检查文件的扩展名是否在服务器允许的列表中;
- 服务端文件内容检测:检查文件内容是否合法,是否含有恶意代码。
6.文件上传绕过
- 信息收集:攻击者首先收集目标网站的相关信息,包括服务器配置、上传接口、文件类型限制等。
- 漏洞分析:分析目标网站的安全措施,寻找可能存在的漏洞,例如文件类型限制不严格、文件名过滤不彻底等。
- 构造恶意文件:根据分析结果,攻击者构造恶意文件,例如将恶意代码隐藏在图片文件中,或者将可执行文件伪装成允许上传的文件类型。
- 利用漏洞:利用找到的漏洞,尝试上传恶意文件。这可能包括修改HTTP请求头、使用特殊的文件名或文件扩展名等。
- 绕过安全措施:绕过服务器的安全措施,如通过修改文件扩展名、利用服务器解析漏洞等。
- 执行恶意代码:一旦恶意文件成功上传,攻击者可能会尝试执行该文件,以实现进一步的攻击,如获取服务器控制权、窃取数据等。
二、绕过客户端检测
- 禁用JavaScript:用户可以在浏览器设置中禁用JavaScript,或者使用特定的浏览器插件来实现这一目的。
- 使用浏览器插件:例如,使用火狐浏览器的NoScript插件,可以控制哪些网站可以执行JavaScript代码。
- 浏览器设置:在浏览器的高级设置中,可以找到禁用JavaScript的选项。例如,在Internet Explorer中,可以通过“Internet选项”中的“安全”设置来禁用JavaScript。
- 使用开发者工具:在浏览器的开发者工具中,可以临时禁用页面上的JavaScript代码,从而绕过客户端的检测。
- 修改本地文件:用户可以下载含有检测代码的页面,然后在本地修改JavaScript代码,移除或修改检测逻辑,再上传修改后的文件。
- 使用代理或中间件:使用代理服务器或中间件来拦截和修改客户端请求,从而绕过JavaScript检测。
- 使用其他工具:有些工具或软件可以帮助用户禁用或修改JavaScript代码,从而绕过客户端的检测。
三、绕过服务端检测
1.服务端代码检测
服务端的代码通常检测三个点:MIME类型、文件后缀、文件内容。
2.常见MIME类型
3.绕过MIME类型检测
检测文件上传过程中http包的Content-Type字段的值,来判断上传文件是否合法
4.黑名单
黑名单的本质为——“在即不合法”,文件名在黑名单中为不合法。
- 后缀大小写绕过(Php):在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式;
- 空格绕过(php ):如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过;
- 点绕过(php.):如果黑名单没有对后缀名进行去点处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的 . ,通过在文件名后加 . 进行绕过;
- ::$DATA绕过:利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA绕过对黑名单的检测;
- 配合Apache解析漏洞:Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,即如 aa.php.owf.rar 文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件
- htaccess文件:配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测。htaccess文件(分布式配置文件),全称Hypertext Access(超文本入口)提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个或多个指令的文件,以作用于此目录及其所有子目录,作为用户,所能使用的命令受到限制。
5.白名单
白名单策略:文件扩展名不再白名单中为不合法。
白名单往往比黑名单更加有效,以为黑名单只是限制了部分非法字符,难免有漏网之鱼,但白名单的逻辑为“只要不在名单上全为非法”。
这两种策略是网络安全领域中常见的文件上传漏洞利用技术,主要用于绕过服务器的文件类型检查机制。
1. %00截断
**原理**:
- `%00`是URL编码中的一个特殊字符,表示字节值为0x00的字节(即空字符)。
- 在HTTP请求中,`%00`可以被用来截断URL参数,使得URL解析器在遇到`%00`时停止解析后续的内容。
**利用方式**:
- 攻击者在文件名中加入`%00`,例如上传一个名为`test.php%00.jpg`的文件。
- 当服务器接收到这个文件名时,URL解码器会将其解码为`test.php\x00.jpg`。
- 如果服务器的文件名验证函数在解码后处理文件名,它可能会忽略`\x00`之后的字符,只处理`test.php`部分。
- 这样,攻击者上传的文件名看起来是`test.php`,但实际上是`test.php\x00.jpg`,可能被服务器错误地处理为PHP文件。
**影响**:
- 这种技术可以绕过一些简单的文件扩展名检查,使得服务器错误地将非PHP文件解析为PHP文件,从而执行恶意代码。
2. Ox00截断
**原理**:
- `0x00`是十六进制表示法中的一个特殊字符,表示字节值为0的字节。
- 在文件系统中,文件名通常以`0x00`结尾,表示文件名的结束。
**利用方式**:
- 攻击者在文件名中加入`0x00`,例如上传一个名为`test.php\x00`的文件。
- 当服务器读取文件名时,如果遇到`0x00`,可能会认为文件名已经结束。
- 这样,服务器可能会将文件名错误地识别为`test.php`,而忽略`\x00`之后的任何内容。
**影响**:
- 这种技术同样可以绕过文件扩展名检查,使得服务器错误地将非PHP文件解析为PHP文件。
- 需要注意的是,这种技术依赖于服务器在读取文件名时的处理方式,并不是所有服务器都会受到影响。
6.绕过文件内容检测
一般是通过检测文件内容来判断上传文件是否合法。
文件幻数检测:
文件格式幻数(Magic Number),可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
文件加载检测:
一般是调用API或函数去进行文件加载测试,我们常见的是图像渲染测试,严格的进行二次渲染;对渲染/加载测试的攻击方式是代码注入绕过,对二次渲染的攻击方式是攻击文件加载器自身。
简单来说:幻数就像是“身份证”,在文件开头部分有一些特定的字节序列,这些序列是文件类型的标志,比如JPEG图片文件通常以FF 08开头等。而文件幻数检测就是检查文件开头这些特定字节序列来判断文件是不是我们想要的类型;
加载就像是把文件放进一个“模拟器”里,看他能不能正常运行或者显示出来。文件加载检测就是把文件当作某种类型的文件来处理,看他是否能正常工作,比如,如果一个文件被当作图片来加载,我们就尝试用图片查看器打开它,看他是否能正常工作。
四、WEB解析漏洞简介
1.apache解析漏洞
2.IIS 6.0解析漏洞
3.IIS 7.0解析漏洞
4.Nginx解析漏洞