项目中下载方法没有安全校验,导致脚本注入,可以下载服务器任意路径下的文件。
对此总结了一下修复办法,方便大家参考,修复。
以下是漏洞的一些内容:
安全漏洞描述
任意文件下载或读取漏洞主要是由于应用系统在提供文件下载或读取功能时,在文件路径参数中直接指定文件路径的同时并没有对文件路径的合法性进行校验, 导致攻击者可通过目录跳转(..\或../)的方式下载或读取到原始指定路径之外的文件。 攻击者最终可通过该漏洞下载或读取系统上的任意文件,如数据库文件、应用系统源代码、密码配置信息等重要敏感信息,造成系统的敏感信息泄露。
重现方法
对存在文件下载或文件读取功能的页面进行测试,查看所提交的参数中是否包含文件名或文件目录,尝试提交参数值查看是否可下载或读取其他目录的文件内容;
如:
原始下载功能路径为
http://www.example.com/donwload.jsp?filename=test123456789.pdf
其中文件路径参数为filename,通过../对路径进行跳转尝试下载其他目录下的文件,修改filename参数为../../WEB-INF/web.xml尝试下载JSP网站的配置文件(测试过程中需适当增加../跳转字符串);如提交
http://www.example.com/donwload.jsp?filename=../../WEB-INF/web.xml
查看是否成功下载web.xml文件。
另一种情况如下:
http://www.example.com/donwload.jsp?filepath=uploadfile&filename=test123.pdf
该功能通过filepath以及filename指定下载目录以及下载文件名,可修改filepath参数值进行路径跳转, 同时修改filename值指定文件名;如提交
http://www.example.com/donwload.jsp?filepath=../../WEB-INF&filename=web.xml
查看是否成功下载web.xml文件。
风险等级:高
解决办法
知道了问题,一般可以通过在代码层级增加关键字符过滤来修复。 比如:
- 对path参数进行过滤,依次过滤“.”、“..”、“/”、“”等字符。
- 或者对于下载文件的目录做好限制,只能下载指定目录下的文件,
- 或者将要下载的资源文件路径存入数据库,附件下载时指定数据库中的id即可,id即对应的资源。 服务器级建议
private Pair<Boolean,String> checkFileAttack(String filePath) {
if (StringUtils.isEmpty(filePath)) {
return Pair.of(false, "文件名为空");
}
if (filePath.startsWith("/")) {
return Pair.of(false, "文件名不能以/开始");
}
// 禁止文件名中包含 “%00”,“..”,“./”,“#/” ,"~/" , "^/" Pattern pattern = Pattern.compile("(\\.\\.|~/|^/|\\./|#/|%00)");
if (pattern.matcher(filePath).matches()) {
return Pair.of(false, "文件名不合法");
}
if (!ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(filePath)))
{
return Pair.of(false, "非法格式");
}
return Pair.of(true, "校验成功");
}
或者,在服务部署的时候,通过下面的目录固化部署路径,令web请求不能逃逸到整个服务器。
- 使用chroot 命令,固化服务路径
安全无小事!!!
文档信息
- 本文作者:寒澈
- 本文链接:https://www.hancher.top/2023/06/20/http_any_file_download/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)