文件上传漏洞总结
什么是文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。
文件上传流程
通常一个文件以 HTTP 协议进行上传时,将以 POST 请求发送至 web 服务器
web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输 data
而一般一个文件上传过程中的检测如下图红色标记部分
常见文件上传检测以及绕过
客户端 javascript 检测 (通常为检测文件扩展名)
这类检测通常在上传页面里含有专门检测文件上传的 javascript 代码,最常见的就是检测扩展名是否合法
绕过方式:
1 前端修改允许的类型
2 burp抓包修改
3 禁用javascript(例如火狐浏览器就有禁用JS功能)
服务端检测绕过(MIME 类型检测)
主要是检测Content-Type: 字段
绕过方法:
burp抓包修改Content-Type: 为允许的字段
Content-Type: image/gif
Content-Type: image/png
Content-Type: image/jpeg
(我曾经看到过一个博客,他上传的文件会给你重命名后缀,好像就是检测的Content-Type,通过修改这个成php,最后他成功上传了php文件)
服务端检测绕过(文件扩展名检测)
黑名单检测,黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多
一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件
绕过方法:
1 文件名大小写绕过
用像 AsP,pHp 之类的文件名绕过黑名单检测
2 名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有 asa 或 cer 之类
3 特殊文件名绕过
比如发送的 http 包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式
在 windows 系统里是不被允许的,所以需要在 burp 之类里进行修改,然后绕过验证后,会
被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。
4 htaccess 文件
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测
5 写入方法
首先名字为1.php:jpg,会写入一个1.php的空文件,然后再上传一个文件,然后修改名字为3.<<<
这样就会把我们这个文件的内容写入到我们上传的那个1.php空文件中
参考:https://www.waitalone.cn/php-windows-upload.html
6 00截断绕过上传
1.php .jpg 空格二进制20改为00
还有一些图片木马之类的,需要结合文件包含漏洞来解析。
文件头检测
iis解析漏洞
1 目录解析
以*.asp命名的文件夹里的文件都将会被当成ASP文件执行。
2 文件解析
*.asp;.jpg 像这种畸形文件名在“;”后面的直接被忽略,也就是说当成 *.asp文件执行。
IIS6.0 默认的可执行文件除了asp还包含这三种 *.asa *.cer *.cdx
3 默认解析
.asp .aspx .ashx .asa .cer这是系统默默认的后缀名
Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。比如xxx.php.rar对apache来说rar是不可解析的,所以就会解析成xxx.php
nginx解析漏洞
开启cgi:SCRIPT_NAME FASTCGI:
www.xx.com/a.jpg/.php(任何不存在文件)-----可以解析为.php文件
a.jpg:
a.php%00.jpg----解析为a.php
修复建议
上传文件的存储目录禁用执行权限
文件的后缀白名单,注意0x00截断攻击
不能有本地文件包含漏洞
及时修复web上的代码
升级web server
不是很全,但是基本的应该就有了。