挖漏洞之文件上传
(一)漏洞原理
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
(二)基础测试方法
一般来讲,开发者一般都会对文件上传部分,进行检测和过滤,用于检测文件类型的方法有很多种,按照下面方法,一步一步测试
1、总的测试思路
- 第一步查看前端js,如果是在前端js实现文件上传,可以删掉绑定方法,直接上传文件
- 第二步查看是否是黑白名单检测:黑名单是禁止上传文件,白名单是只允许上传文件
如果是白名单:寻找可控参数
如果是黑名单,可以尝试找非黑名单以外的有害文件,可以是大小写不同的可执行文件,比如PhP,也可以是系统配置文件,比如.htaccess文件
2、基于白名单的测试
1、针对后缀名测试,可能在逻辑上发生错误,从而引发文件上传漏洞,比如
加双后缀:变成file.php.jpg 或 file.jpg.php,绕过检测
后缀名加空格:变成file.php ,系统无法正确识别实际扩展名“.php”,从而绕过白名单检测
后缀名加点:变成file.php. 这个方法真针对window系统,win系统中对文件名后缀有点的,会省略掉,.php.就变成.php
后缀名加入%00,进行截断比如file.php,变成file.php%00,(这个方法跟版本有关,老版本可能有)
2、上传图片码,比如只允许图片上传的,把图片和木马集合在一起
3、修改检测值
文件头,比如JPEG (jpg)的文件头: FFD8FF,在图片制作的时候,修改文件
contnet-type值,修改MIME类型为符合上传格式类型,比如png是image/png
4、数组新式上传,如果系统采用数组方式上传,就自己加上一个值,进行上传
3、基于黑名单的测试
如果是黑名单检测文件上传,可以采用以下测试方法:
1、也是对文件后缀名进行测试,在逻辑上文件上传漏洞:
更改后缀大小写:比如php变成Php,有可能没有禁止Php
修改后缀名:比如php,换成php3,这是有可能php3没有被禁止
后缀名后加入::$DATA,比如file.php变成file.php::$DATA,这是NTFS交换数据流绕过,# 其中一个冒号表示创建文件,两个冒号表示写入文件内容
双写文件后缀名,比如.php 变成.pphphp,如果存在检测php文件后替换成空,可以采用这个方法
2、 修改contnet-type值,修改MIME类型为符合上传格式类型,比如png是image/png
3,上传系统文件,有时候开发者忽略网站配置文件,
php网站.htaccess,让其上传图片也可以当作文件执行
..user.ini文件,让包含一个文件
(三)进阶测试方法
有写开发者只关注禁止上传脚本文件这一点,只运行上传符合业务需求的文件,从而针对性的开发,这虽然提升了黑客上传脚本文件,直接getshell,但是忽略其他漏洞,其实由于文件上传这一个功能点,可以导致其他漏洞,如下
1)webshell,上传脚本文件可以webshell
2)xss:
文件名插入payload造成xss、
上传html文件造成xss文件(html文件里注入payload)
上传svg文件(一种图像类型),在属性中插入payload造成xss漏洞
上传gif文件(一种图片),在图片头注入payload造成xss漏洞
上传pdf文件,在文件中属性-添加编辑动作内容插入payload,造成xss
上传word文档,在xml文件部分中,选择任意文件的文件名中插入大量A,在 hexeditor中找到大量存在41(A的十六进制),把payload转为十六进制插入,上传word文档造成xss
3)xxe(docx、xlsx、svg等本质是xml文件)
上传直接上传xml文件,造成xxe
上传xlsx文件,在xlsx中找到下xml文件处插入payload,造成xxe
上传docx文件,在xml文件处插入paylaod,造成xxe
上传svg文件,造成xxe
4)命令注入
上传csv文件,在csv插入payload,在导出csv文件中,打开执行命令导致命令执行
上传图片,对图片进行二次渲染,插入命令,导致rce
5)目录遍历
上传压缩包,服务器对其加压,可能存在Zip Slip目录走访漏洞
6)ssrf
上传 .URL 文件,打开可能会Windows 上的 SSRF SMB连接,导致ssrf
导出pdf文件导致ssrf,在发票打印、行程打印、车票打印、保单下载会有导出pdf文件功能,对响应参数进行注入url导致ssrf漏洞
7)DOS攻击
上传图片,修改文件像素大小,改为无限大,导致DOS
zip递归炸弹和非递归炸弹
上传png文件,解压造成dos
8)目录遍历
将文件名注入../../../../etc/passwd等paylaod,造成目录遍历
9)注入漏洞,
对文件名注入各种payload,比如sleep(10).png,造成sql注入,注入<h1>test<h1>.png,造成html注入
具体请看:https://mp.weixin.qq.com/s/nMLoTN28WzocRLy8nkq3qw
(四)利用方法
1、上传脚本文件,直接getshell,获取目标服务器的控制权
2、造成其他攻击,参考上面的进阶测试方法
(五)防御方法
- 文件类型验证:限制允许上传的文件类型,只允许上传通过验证的文件类型,而排除可执行文件、脚本文件或其他危险类型的文件。
- 文件大小限制:限制上传文件的大小,以防止攻击者上传大文件并消耗服务器资源。
- 文件名验证与随机重命名:对上传的文件名进行验证和过滤,防止恶意文件名的使用。同时文件重命名,在保存文件时,使用随机生成的文件名替换用户上传的文件名,避免可预测的文件路径或文件名暴露
- 文件内容检查:在接收到文件后,进行文件内容的检查和分析,如通过安全扫描工具检测文件中是否包含恶意代码。
- 存储安全:将上传的文件存储在安全的位置,并确保文件无法直接执行,只有只读的权限