揭秘PDF与JS混编攻击:Polyglot文件的构造与防御

admin 2026-01-21 01:13:40 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详细阐述了利用PDF与JS解析差异构造Polyglot文件以绕过上传检测的原理与三种核心方法,并介绍了Mitra自动化工具。针对此类攻击,文章提出了严格的头部位置校验、二进制特征检测、强制Content-Type及内容清洗等多维防御建议,旨在帮助安全人员有效抵御文件上传漏洞引发的XSS与恶意代码执行风险。 综合评分: 90 文章分类: Web安全,漏洞分析,渗透测试,安全开发


cover_image

揭秘PDF与JS混编攻击:Polyglot文件的构造与防御

原创

m3x1 m3x1

梦醒安全

2026年1月20日 08:01 湖北

免责声明:本公众号内容仅用于知识分享和学习,由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号梦醒安全及作者不为此承担任何责任,一旦造成后果请自行承担!

PART.01

前言

在网络安全攻防场景中,文件上传漏洞一直是攻击者重点利用的切入点,而“Polyglot(多语言)文件”则是绕开文件检测的常用手段。其中,将JavaScript(JS)伪装为PDF的混编文件,更是攻击者实现XSS、恶意代码执行的常用招式。本文将深入解析这类Polyglot文件的构造原理、实现方法,并给出对应的防御建议,帮助安全从业者和开发者筑牢防护屏障。

PART.02

内容

一、什么是PDF/JS Polyglot文件?

Polyglot文件指的是一个文件同时满足多种文件格式的解析规则,看似是合规的某类文件(如PDF),实则包含另一类可执行代码(如JS)。PDF/JS Polyglot文件就是利用PDF和JS解析机制的差异,让文件在PDF阅读器中正常显示,却能在浏览器以脚本形式加载时执行恶意JS代码,从而绕开文件上传过滤、触发XSS等攻击。

二、PDF/JS Polyglot的核心构造原理

无论是哪种构造方法,核心逻辑都是利用不同解析器的“容错性”和“语法差异”:PDF解析器对文件头部位置、注释内容的宽容度,与JS引擎逐行执行、注释规则的差异,成为攻击者的可乘之机。主要有三种构造思路:

1. 头部偏移容错法(最常用)

原理

标准PDF解析器(如Adobe Acrobat、Chrome PDF Viewer)并非强制要求PDF魔法头%PDF-1.x出现在文件第0字节,通常会扫描文件前1024字节寻找该头部;而JS引擎则是从文件开头逐行执行代码。利用这一差异,可在文件开头编写JS代码,在1024字节内嵌入PDF头。

示例代码

var a = "Hello"; // 有效的JS代码
/*               // JS块注释开始,PDF解析器可识别注释内的PDF头
%PDF-1.4         // PDF魔法头
1 0 obj          // PDF对象起始
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] >>
endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000079 00000 n
0000000146 00000 n
trailer
<< /Size 4 /Root 1 0 R >>
startxref
200
%%EOF
*/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // JS块注释结束
alert("I am JS!"); // JS执行代码

当文件扩展名被改为.pdf,且通过

<script&nbsp;src="file.pdf">

加载时,浏览器的JS引擎会执行注释外的代码,而PDF阅读器则能正常解析注释内的PDF内容。

2. 字符串/注释包裹法

核心是用一种语言的注释/字符串语法隐藏另一种语言的代码,分为两种方向:

  • PDF藏在JS注释/字符串中

    :将完整PDF内容放入JS的块注释/* ... */或大字符串变量中(需注意PDF内容不能包含破坏JS语法的字符,如未转义的引号、*/,必要时需对PDF内容编码)。

  • JS藏在PDF注释中

    :PDF以%作为单行注释符,可在PDF对象之间插入%开头的行,写入JS代码(多用于HTML/PDF混合利用场景)。

示例(JS藏在PDF注释中)

%PDF-1.4
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
%% 这行是PDF注释,包含JS代码
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] >>
endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000079 00000 n
0000000146 00000 n
trailer
<< /Size 4 /Root 1 0 R >>
startxref
200
%%EOF

3. 多容器嵌套(HTML/PDF/JS混合)

更高级的组合方式,引入HTML作为中间层(利用浏览器解析HTML的高容错性),构造同时满足PDF和HTML规则的文件,在HTML中嵌入

<script>

标签执行JS。

原理流程

  1. 构造文件开头为PDF头(HTML解析器会将PDF二进制数据视为“乱码”,可通过CSS隐藏);
  2. 在文件中嵌入HTML结构,包含
   <script>

标签写入恶意JS;

  1. 文件可绕过PDF上传过滤,当以

    text/html渲染时,执行XSS代码。

三、自动化构建工具:Mitra

手动构造Polyglot文件需兼顾多种格式语法,效率较低,可使用Mitra工具自动生成:

1. 工具介绍

Mitra是基于Python的脚本,核心原理与手动构造一致,利用不同文件格式的解析差异,将PDF和JS文件合并为Polyglot文件。

工具获取地址在文末

2. 安装步骤

# 克隆仓库
git clone https://github.com/corkami/mitra.git

# 进入目录
cd mitra

# 安装依赖(核心为PyMuPDF,处理PDF结构)
pip install -r requirements.txt
# 若无requirements.txt,直接安装核心依赖
pip install pymupdf

3. 基础使用(生成PDF/JS Polyglot)

# 准备文件:document.pdf(正常PDF)、payload.js(恶意JS)
# payload.js示例内容:alert("XSS from PDF Polyglot!");

# 执行命令生成Polyglot文件
python mitra.py document.pdf payload.js

四、防御建议

针对PDF/JS Polyglot文件攻击,需从“文件检测”“解析控制”“内容过滤”多维度防护:

1. 严格的文件验证

  • 不只是校验文件扩展名,需验证文件魔法头(%PDF-1.x),且确保魔法头出现在文件起始位置(而非前1024字节);
  • 对文件进行二进制分析,检测是否包含JS/HTML特征代码,如
  <script>、alert(、/* */

等等

  • 限制文件大小,避免超大文件绕过检测。

2. 控制文件解析方式

  • 服务器端指定文件的Content-Type,PDF文件强制返回application/pdf,避免浏览器以text/htmlapplication/javascript渲染;
  • 禁止将上传的PDF文件通过
  <script>

标签加载,限制PDF文件的访问场景。

3. 前端与后端双重过滤

  • 前端对上传文件进行初步校验(扩展名、大小),后端再次验证;
  • 对上传的PDF文件进行重命名,避免恶意文件名触发解析漏洞;
  • 使用专业的PDF解析库清洗文件,移除注释、非标准对象等可疑内容。

4. 安全意识教育

  • 对运维、开发人员普及Polyglot文件攻击原理,避免因“文件看起来是PDF”就放松警惕;
  • 终端用户避免随意打开来源不明的PDF文件,尤其是通过浏览器直接访问的PDF链接。

五、总结

PDF/JS Polyglot文件的本质是利用不同解析器的规则差异实现“伪装”,这类攻击手法虽隐蔽,但并非无迹可寻。通过规范文件验证流程、控制解析逻辑、强化内容检测,能够有效抵御此类攻击。网络安全的核心是“打破攻击者的利用路径”,只有从解析、传输、渲染全流程把控,才能真正降低文件上传漏洞的风险。

PART.03

交流群

欢迎大家加入我的交流群:

如果链接过期,可以在公众号后台点击下方菜单“加群”添加我wx,备注“加群”

PART.04

往期推荐

往期好文

【效率翻倍】14款渗透必备插件,这款Firefox定制版帮你一键集齐

【AI靶场练习】Gandalf靶场过关wp解析

【AI靶场练习】Prompt Injection lab靶场wp解析

深挖HTTP请求走私漏洞:原理、利用与防御

自开CVE-2025-55182 漏洞检测与利用工具(GUI版)使用指南

实战利器:Burp微信小程序解包插件

Nacos系列漏洞:风险点与综合利用工具详解

PART.06

工具获取

GitHub地址:https://github.com/corkami/mitra


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:梦醒安全 m3x1 m3x1《揭秘PDF与JS混编攻击:Polyglot文件的构造与防御》

评论:0   参与:  0