0x01 漏洞描述
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种漏洞是getShell最快最直接的方法之一。
0x02 审计要点
-
1. 定位文件上传代码。
任意文件上传产生的主要原因是在服务器端没有对用户上传的文件做校验或者校验不充分,导致用户可以上传恶意脚本到服务器。所以在审计过程中主要是快速定位相关的文件上传业务,然后进行相关的审计。
-
2. 关键字检索。
因为前端需要在使用包含文件上传控件的表单时,必须使用multipart/form-data这个值,所以可以通过搜索multipart/form-data,定位前端上传页面,然后找到对应的上传接口。常用关键字:upload、fileName、filePath、InputStream等。
-
3. 上传的文件后缀名。
主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单。
-
4. 文件类型。
-
5. 文件保存路径。
-
6. 文件名。
0x03 典型漏洞代码
以上代码存在以下安全漏洞:
-
文件名可被篡改:上传的文件名称来自于 $upFile['name'],这是用户提交的数据,可能包含恶意内容。攻击者可以通过更改文件名来绕过一些检查和限制。
-
文件类型可被伪造:上传的文件类型来自于 $upFile['type'],然而这个值并不可靠,因为它可以被伪造。恶意用户可以故意上传一个带有错误的MIME类型的文件,从而绕过一些基于文件类型的限制。
-
文件大小限制不够严格:虽然这段代码检查了上传文件的大小 $upFile['size'],但它没有应用足够严格的限制。例如,攻击者可以使用分块请求来上传大型文件,或将多个小文件组合成一个大文件,以绕过这种限制。
-
没有对上传文件进行完整性验证:在移动文件之前,这段代码没有对上传文件的有效质量进行任何验证。例如,攻击者可以将附加恶意代码的PHP文件上传到服务器,从而导致服务器上的安全问题。
0x04 防御方案
-
1. 文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
-
2. 判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
-
3. 使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。
-
4. 单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
-
5. 使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。
点赞,转发,在看
点击关注
学习技术
反入侵实验室
原文始发于微信公众号(反入侵实验室):0基础入门代码审计-7 文件上传
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论