标题:
标题:
全方位防范 Swagger JSON 高危漏洞
背景介绍:
最近,一种针对 Swagger JSON 文件的高危漏洞被发现,这种漏洞可能让攻击者直接获取到应用程序的代码。这种漏洞已经影响到了 Java、PHP、NodeJS、Ruby 等多种语言,因此我们需要对此进行有效的防范。
攻击过程:
攻击者可能会通过修改Swagger文档,添加恶意逻辑来执行以下行动:
-
正常请求:用户正常调用应用API,恶意代码不单单返回请求结果数据,同时可能会对用户请求的返回结果进行篡改、数据拦截操作。
-
改动类型:攻击者感染服务端,修改对应接口或者函数类型,修改返回值,导致调用此API者抛出异常或者数据解析失败。
-
任意代码执行:攻击者可以通过对文档的细微修改,足以导致服务端执行恶意脚本,通过这些执行了恶意脚本,攻击者可以获取系统权限或者应用源代码。
防范措施:
-
尽量不要将swagger UI界面暴露在公网上。
-
对于Swagger静态文件的存储目录,尽量设置只读权限。
-
应用可以通过代码校验规避此类漏洞。
-
对swagger的输入参数进行校验,避免在文件载入时执行恶意代码。
下面我们详细介绍每一种防范措施的具体实现:
- 隐藏swagger UI
Swagger UI 经常被用来测试和浏览 API 文档,因此它会被暴露在互联网上。为了防止不必要的风险,可以将 Swagger UI 隐藏在内部网络中,或者启用身份验证机制来控制其访问。
- 只读权限设置
对于 Swagger 静态文件存储目录,尽量设置只读权限,以便确保在攻击者发现漏洞的情况下,他们无法轻易地修改 Swagger 文档。
- 代码规避
使用一些代码扫描工具,例如 CODE ANALYSIS 、FindSecBugs 等,以帮助验证 Swagger 文件的安全性。通过这些工具可以识别出 Swagger 文件中可能存在的安全漏洞,有效防范高危漏洞。
- 输入参数校验
在服务端代码构建之前,可以对 Swagger 的输入参数进行校验。通过校验输入参数,可以避免在文件载入时执行恶意代码,从而防止高危漏洞的发生。
示例说明:
以下代码演示了如何在 Node.js 中读取并验证 Swagger 文件的内容,避免其执行恶意代码:
const YAML = require("yamljs");
const fs = require("fs");
const filename = "swagger.yml";
const data = YAML.parse(fs.readFileSync(filename).toString());
if (data.securityDefinitions) {
for (let [, value] of Object.entries(data.securityDefinitions)) {
if (value.in && value.in === "header") {
console.warn(
"The `securityDefinitions` section contains a scheme that uses HTTP headers for authentication. Headers cannot be set from a Web page using XMLHttpRequest, CORS is enabled on the target server, and the Access-Control-Allow-Origin header does not allow the origin of the requesting page."
);
}
}
} else {
console.warn("No security schemes were found in the `securityDefinitions` section.");
}
代码中先使用 yamljs
模块读取Swagger文件内容,然后通过 onject.entries
检查 securityDefinitions
后循环检索到所有in: header
的定义,检查后如果定义了in: header
会输出警告信息并退出程序。
本文标题为:Swagger JSON高危漏洞被发现 Java/PHP/NodeJS/Ruby或中招
基础教程推荐
- Springboot 通过FastJson实现bean对象和Json字符串互转问题 2023-04-18
- Struts1之url截取_动力节点Java学院整理 2023-07-31
- SpringBoot如何使用Undertow做服务器 2023-02-19
- JVM 运行时数据区与JMM 内存模型 2023-03-22
- Java InheritableThreadLocal用法详细介绍 2023-06-01
- java – 与JPA无关的数据库字符串比较 2023-11-03
- SpringBoot校园综合管理系统实现流程分步讲解 2023-06-02
- Java使用GZIP压缩导致HTTP请求返回乱码问题解决 2023-01-13
- Java实现监听文件变化的三种方案详解 2022-11-25
- Java方法调用解析静态分派动态分派执行过程 2023-01-29