Swagger JSON高危漏洞被发现 Java/PHP/NodeJS/Ruby或中招

标题:

全方位防范 Swagger JSON 高危漏洞

背景介绍:

最近,一种针对 Swagger JSON 文件的高危漏洞被发现,这种漏洞可能让攻击者直接获取到应用程序的代码。这种漏洞已经影响到了 Java、PHP、NodeJS、Ruby 等多种语言,因此我们需要对此进行有效的防范。

攻击过程:

攻击者可能会通过修改Swagger文档,添加恶意逻辑来执行以下行动:

  1. 正常请求:用户正常调用应用API,恶意代码不单单返回请求结果数据,同时可能会对用户请求的返回结果进行篡改、数据拦截操作。

  2. 改动类型:攻击者感染服务端,修改对应接口或者函数类型,修改返回值,导致调用此API者抛出异常或者数据解析失败。

  3. 任意代码执行:攻击者可以通过对文档的细微修改,足以导致服务端执行恶意脚本,通过这些执行了恶意脚本,攻击者可以获取系统权限或者应用源代码。

防范措施:

  1. 尽量不要将swagger UI界面暴露在公网上。

  2. 对于Swagger静态文件的存储目录,尽量设置只读权限。

  3. 应用可以通过代码校验规避此类漏洞。

  4. 对swagger的输入参数进行校验,避免在文件载入时执行恶意代码。

下面我们详细介绍每一种防范措施的具体实现:

  1. 隐藏swagger UI

Swagger UI 经常被用来测试和浏览 API 文档,因此它会被暴露在互联网上。为了防止不必要的风险,可以将 Swagger UI 隐藏在内部网络中,或者启用身份验证机制来控制其访问。

  1. 只读权限设置

对于 Swagger 静态文件存储目录,尽量设置只读权限,以便确保在攻击者发现漏洞的情况下,他们无法轻易地修改 Swagger 文档。

  1. 代码规避

使用一些代码扫描工具,例如 CODE ANALYSIS 、FindSecBugs 等,以帮助验证 Swagger 文件的安全性。通过这些工具可以识别出 Swagger 文件中可能存在的安全漏洞,有效防范高危漏洞。

  1. 输入参数校验

在服务端代码构建之前,可以对 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或中招 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

    基于Java SSM SpringBoot+Mybatis酒庄内部管理系统设计和实现 系统需求 管理员登录管理 酒庄员工管理 酒庄原材料和产品管理 酒庄生产线管理 酒庄生产流程管理 酒庄销售管理 技术选型 后端:Spring、SpringMVC、Mybatis、SpringBoot、MySQL 前端:Bootstrap、jQuery、Ajax 系统架构 使用…

    Java 2023年5月19日
    00
  • Java按时间梯度实现异步回调接口的方法

    接下来我将详细讲解Java按时间梯度实现异步回调接口的方法的完整攻略,过程中将包含两条示例。 什么是异步回调接口 异步回调接口是一种常用的编程技术,它允许程序在后台执行任务的同时,不会阻塞主线程的进行,并在任务执行完成后异步地通知调用方。异步回调接口在Java中具有广泛的应用,例如在处理网络请求时通常使用异步回调接口来处理异步响应。 实现异步回调的方法 在J…

    Java 2023年5月20日
    00
  • Mybatis-Plus Wrapper条件构造器超详细使用教程

    下面是Mybatis-Plus Wrapper条件构造器超详细使用教程的完整攻略。 一、什么是Mybatis-Plus Wrapper条件构造器? Mybatis-Plus是Mybatis的增强工具,在实际开发中经常使用。其中Mybatis-Plus Wrapper是一个条件构造器,它能够帮助程序员拼装复杂的查询条件。 举个例子:我们需要查询表中age大于1…

    Java 2023年5月20日
    00
  • Java下载文件的4种方式总结

    以下是Java下载文件的4种方式总结的详细攻略: 一、通过URL类下载文件 Java中可以通过URL类来下载远程文件,具体步骤如下: 创建一个URL对象,指定远程文件的URL地址; URL url = new URL("http://example.com/file/file.txt"); 打开URL连接; URLConnection c…

    Java 2023年5月20日
    00
  • 很多人竟然不知道Java线程池的创建方式有7种

    当涉及到处理并发编程时,线程池是一个非常重要的主题。Java提供了创建线程池的多种方式。 什么是线程池? 在Java中,线程池代表着一组线程。它们在同一时间内以任务队列的形式运行,处理属于同一个应用程序的多个任务。线程池有助于简化多任务处理的管理并提高效率,因为它们可以重复利用资源。 如何创建线程池? Java提供了7种方式来创建线程池。这些方式分别是: E…

    Java 2023年5月19日
    00
  • Java线程协作的两种方式小结

    Java线程协作是指多个线程之间的相互协作来完成一个任务。在Java中,线程协作有两种方式:wait和notify/notifyAll。 1. wait和notify 当线程需要等待某个条件时,可以调用wait方法。调用wait方法会使线程进入等待状态,直到另一个线程调用notify或notifyAll方法来唤醒它。 示例1:wait和notify的简单使用…

    Java 2023年5月26日
    00
  • Java Http请求传json数据乱码问题的解决

    下面是关于Java Http请求传json数据乱码问题的解决攻略。 问题描述 在Java的Http请求中,当请求中传递json数据时,有时候会出现乱码问题,导致接收方无法正确解析数据,这是因为json数据中可能包含着非ASCII字符,而HTTP请求使用的是ISO-8859-1编码格式,无法正确解析含有非ASCII字符的数据。 解决方案 为了解决这个问题,我们…

    Java 2023年5月26日
    00
  • Java简单计时的实现案例(可以用来限时循环)

    让我们来详细讲解一下“Java简单计时的实现案例(可以用来限时循环)”的完整攻略。 思路概述 实现计时器的基本思路如下: 设置一个计时器变量,反映经过的时间。 确定计时器启动时刻。 定时器中执行要计时的动作(循环等)。 规定计时器结束条件,一般用时间限制或者次数限制。 计算执行完毕所需时间。 输出结果等。 根据这个思路,我们可以实现一个简单可用的计时器。 示…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部