ReDoc API文档界面暴露漏洞利用分析

本文详细分析了ReDoc API文档界面暴露的安全漏洞,介绍了Metasploit模块的检测原理和实现方法,包括如何通过HTML标记识别ReDoc实例,以及安全扫描的最佳实践。

漏洞利用:ReDoc API文档界面暴露

2025-10-24 | CVSS 7.0

模块概述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class MetasploitModule < Msf::Auxiliary
  include Msf::Auxiliary::Scanner
  include Msf::Exploit::Remote::HttpClient

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'ReDoc API Docs UI Exposed',
        'Description' => %q{
          检测公开暴露的ReDoc API文档页面。
          该模块执行安全的只读GET请求,并基于HTML标记报告可能的ReDoc实例。
        },
        'Author' => [
          'Hamza Sahin (@hamzasahin61)'
        ],
        'License' => MSF_LICENSE,
        'Notes' => {
          'Stability' => [CRASH_SAFE],  # 仅GET请求;不应使目标服务崩溃或中断
          'Reliability' => [],          # 不建立会话;此项留空是可接受的
          'SideEffects' => [IOC_IN_LOGS] # 请求可能被目标Web服务器记录
        },
        'DefaultOptions' => {
          'RPORT' => 80
        }
      )
    )

    register_options(
      [
        OptString.new('REDOC_PATHS', [
          true,
          '要探测的路径的逗号分隔列表',
          '/redoc,/redoc/,/docs,/api/docs,/openapi'
        ])
      ]
    )
  end

检测逻辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 如果响应看起来像ReDoc页面,则返回true
def redoc_like?(res)
  # 仅接受2xx或403(排除重定向;许多3xx缺少要分析的HTML)
  return false unless res && (res.code.between?(200, 299) || res.code == 403)

  # 优先进行DOM检查
  doc = res.get_html_document
  if doc && (doc.at_css('redoc, redoc-, #redoc') ||
             doc.css('script[src*="redoc"]').any? ||
             doc.css('script[src*="redoc.standalone"]').any?)
    return true
  end

  # 回退到body/title启发式方法
  title = res.get_html_title.to_s
  body = res.body.to_s
  return true if title =~ /redoc/i || body =~ /<redoc-?/i || body =~ /redoc(\.standalone)?\.js/i

  false
end

扫描执行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def check_path(path)
  redoc_like?(send_request_cgi({ 'method' => 'GET', 'uri' => normalize_uri(path) }))
end

def run_host(ip)
  vprint_status("#{ip} - 正在扫描ReDoc")

  # REDOC_PATHS是必需的并且有默认值;始终直接使用它
  paths = datastore['REDOC_PATHS'].split(',').map(&:strip)

  hit = paths.find { |p| check_path(p) }
  if hit
    print_good("#{ip} - ReDoc可能暴露在 #{hit}")
    report_service(host: ip, port: rport, proto: 'tcp', name: 'http')
  else
    vprint_status("#{ip} - 未找到ReDoc")
  end
end

技术特点

该模块具有以下技术特性:

  • 安全扫描:仅执行只读GET请求,不会对目标系统造成破坏
  • 多重检测:结合DOM检查和正则表达式匹配,提高检测准确性
  • 可配置路径:支持自定义扫描路径,适应不同的部署环境
  • 详细日志:提供不同级别的输出信息,便于调试和分析

使用说明

模块通过检测特定的HTML标记和JavaScript引用来识别ReDoc实例,包括:

  • DOM中的redoc相关元素
  • 包含"redoc"关键词的script标签
  • 页面标题和内容中的redoc特征

该工具适用于安全评估和漏洞挖掘,帮助发现意外暴露的API文档界面。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计