一、PDF XSS 漏洞核心原理
PDF XSS(PDF 跨站脚本)漏洞是指攻击者通过在 PDF 文件中植入恶意 JavaScript 代码,利用 PDF 阅读器或在线预览工具的安全缺陷,实现代码执行的一类漏洞。与传统网页 XSS 不同,PDF XSS 的载体是 PDF 文件,攻击场景更隐蔽,且依赖于 PDF 处理工具的解析逻辑。
1. PDF 文件的动态特性基础
PDF 格式并非纯静态文件,其规范支持多种动态交互功能,主要包括:
-
嵌入式 JavaScript:通过
/JS
或/JavaScript
字典定义文档级脚本,可在打开 PDF 时自动执行 -
表单事件响应:支持
OnFocus
、OnMouseUp
等事件绑定脚本 -
注释与链接:可在注释或链接中嵌入脚本,点击时触发执行
-
字体与渲染逻辑:部分阅读器对字体的特殊处理可能成为代码注入点
2. 漏洞触发的核心条件
PDF XSS 漏洞的利用需同时满足三个条件:
-
存在恶意代码载体:PDF 文件中包含经过精心构造的恶意 JavaScript 代码
-
解析器安全缺陷:PDF 阅读器 / 预览工具存在沙箱绕过、权限管控不严等问题
-
执行环境允许:目标工具未禁用 JavaScript 执行功能(多数阅读器默认开启)
3. 攻击链形成过程
-
攻击者利用 PDF 编辑工具或脚本生成含恶意代码的 PDF 文件
-
通过钓鱼邮件、恶意链接等方式诱导用户下载打开
-
用户使用存在漏洞的 PDF 工具打开文件
-
恶意代码突破安全限制执行,完成信息窃取或权限提升
二、PDF XSS 漏洞分类与技术特点
1. 基于嵌入式 JavaScript 的传统漏洞
-
技术特点:直接利用 PDF 规范中的 JavaScript 支持特性
-
典型利用方式:
-
在文档级
/JS
字典中写入app.launchURL("恶意地址")
-
在表单按钮的
OnClick
事件中嵌入this.exportDataObject
下载恶意文件
-
-
代表案例:Adobe Acrobat CVE-2021-28550(JS API 权限绕过)
2. 基于渲染引擎缺陷的新型漏洞
-
技术特点:利用 PDF 解析器在处理字体、图像等资源时的逻辑漏洞
-
典型利用方式:
-
通过特殊字体指令注入代码(如 PDF.js CVE-2024-4367)
-
利用注释内容 DOM 注入(如 PDF.js CVE-2020-16042)
-
-
代表案例:PDF.js 系列漏洞(无需依赖 PDF 内置 JS 功能)
三、PDF.js CVE-2024-4367 漏洞复现
1. 漏洞环境准备
(1)基础环境
-
操作系统:Ubuntu 22.04
-
Docker 及 Docker Compose:用于部署漏洞环境
-
漏洞靶场:Vulhub 中的 PDF.js 环境
-
攻击工具:LOURC0D3 的 CVE-2024-4367 PoC 脚本
(2)环境搭建步骤
# 安装Docker sudo apt update && sudo apt install -y docker.io docker-compose sudo systemctl start docker && sudo systemctl enable docker # 获取Vulhub git clone https://github.com/vulhub/vulhub.git cd vulhub/pdfjs/CVE-2024-4367 # 启动漏洞环境 sudo docker-compose up -d # 查看环境状态(确认8080端口映射) sudo docker-compose ps
2. 恶意 PDF 生成(利用 LOURC0D3 的 PoC)
(1)获取 PoC 工具
git clone https://github.com/LOURC0D3/CVE-2024-4367-PoC.git cd CVE-2024-4367-PoC
(2)生成含 XSS payload 的 PDF
# 生成弹出 domain 的恶意PDF python3 CVE-2024-4367.py "alert(document.domain)" # 生成的文件为poc.pdf,查看文件信息 file poc.pdf
PoC 核心原理:通过修改 PDF 的FontMatrix
字段,将恶意 JavaScript 代码伪装为字体配置参数,利用 PDF.js 字体渲染时的代码编译机制执行。
3. 漏洞触发与验证
(1)上传恶意 PDF
-
访问漏洞环境:
http://靶机IP:8080
-
在上传界面选择生成的
poc.pdf
文件 -
上传成功后记录文件路径(如
../upload/xxx.pdf
)
(2)触发 XSS 漏洞
-
访问 PDF 预览地址:
http://靶机IP:8080/web/viewer.html?file=../upload/xxx.pdf
-
观察浏览器行为,成功触发时会弹出包含 domain 信息的对话框
-