OWASP10——文件上传漏洞
本文最后更新于 2024-07-26,文章内容可能已经过时。
文件上传漏洞
免责声明
⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠
1.文件上传基础:
什么是文件上传:
将客户端数据以文件形式封装,通过网络协议发送到服务器端,在服务器端解析数据,最终在服务器端硬盘上作为真实的文件保存。
通常一个文件以HTTP协议进行上传时,将POST请求发送到web服务器,web服务器收到请求并同意后,用户与web服务器将建立链接,并传输数据。
2.文件上传产生漏洞的原因:
1.服务器配置不当
2.文件上传限制被绕过
3.开源编辑器的上传漏洞
4.文件解析漏洞导致文件执行
5.过滤不严或者被绕过
3.文件上传漏洞的危害:
上传文件的时候,如果服务器脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。
攻击者通过上传恶意文件(如php木马)传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行,服务器文件管理,命令执行等恶意操作。从而控制整个网站,甚至是服务器,这个恶意的文件(php,asp,aspx,jsp等),又被成为webshell
4.可能存在漏洞的位置
1.图片上传功能
2.头像上传功能
3.文档上传功能
这一类的功能,往往都可能会存在上传文件验证不严格的安全缺陷。
5.文件上传的检测方式:
一般一个文件上传的过程中的检测方式有:
客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟文件extension相关内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)等、
6.文件上传绕过:
01.绕过客户端检测:
原理:通常是在上传页面中含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法。
**方法:**在本地浏览器客户端禁用JS即可,可使用火狐浏览器的NOscript插件,IE中禁用js等方式实现。
02.绕过服务端的检测:
服务端检测:
服务端的代码通常检测三个点:MIME类型,文件后缀,文件内容
03.绕过MIME类型的检测:
原理:检测图片类型文件上传过程中HTTP包的Content-Type字段的值,来判断上传文件是否合法
绕过方法:用burpsuite截取抓包并修改数据包中文件的content-type类型值进行绕过。
04.绕过文件后缀检测—黑名单
黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本。
绕过方法:
1、后缀大小写绕过:(.Php)
在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。
2、空格绕过:(.php )
如果黑名单没有对后缀名进行去空格处理,可以通过在后缀名加空格的方式进行绕过
3、点绕过:(.php.)
如果黑名单没有对后缀名进行去点处理,利用windows系统的文件名特性,会自动去掉后缀名最后的点,通过在文件名后面加一个点的方法进行绕过
4、::$DATA绕过:
如果黑名单没有对后缀名进行去::$DATA处理,利用windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过黑名单的检测。
5、配合Apache解析漏洞:
Apache解析有一个特点,解析文件是从右往左判断,如果为不可识别解析再继续往左判断,如aa.php.owsf.rar文件,Apache会判断为不可识别解析,’.owf’和’.rar‘这两个后缀,会解析成.php文件
6、 .htaccess文件
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测。
.htaccess文件(或者“分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法。即,在一个特定的文档目录中放置一个包含一个或者多个指令的文件,以作用于此目录及其所有子目录,作为用户,所能使用的命令受到限制。
列如:
新建一个.htaccess文件:(as.png是要上传的文件)
<FilesMatch “as.png”>
SetHandler application/x-httpd-php
</FileMatch>
通过一个.htaccess文件调用php的解析去解析一个文件名中只要包含“haha”这个字符串的任意文件,所以无论文件名是什么样子,只要包含“haha”这个字符串。都可以被以php的方式解析到,一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制。
05.绕过文件后缀名-----白名单
白名单策略:
文件扩展名不在白名单中为不合法,
绕过方式:
服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断
%00截断:
url发送到服务器后被服务器解码,这时候还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00
0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束,但是注意是文件的十六进制内容里的00,而不是文件名中的00
06.绕过文件内容检测:
一般通过检测文件内容来判断上传文件是否合法。
主要有两种检测方法:
1.通过检测上传文件内容开始处的文件幻数来判断。
文件格式幻数(magic number),它可以用来标记文件或协议的格式,很多文件都有幻数标志来表明该文件的格式。
通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。
2.文件加载检测:
一般是调用API或函数对文件进行加载测试,常见的是图像渲染测试,在严格点的甚至是进行二次渲染。
- 感谢你赐予我前进的力量