我正在参加 码上掘金体验活动,详情:show出你的创意代码块
前言
最近公司一个5年的老项目要做本地化部署,预算甲方BB,那我们的项目去做软件测试(渗透测试),因为这个项目平稳运行5年了,没有人觉得会有问题,结果是发现中危漏洞1个,从安全层面来评定该系统为远程较不安全系统。😲😲😲
问题描述
存在不安全的javascript库文件(中危),jquery(3.2.1)该版本的javascript库存在多个安全漏洞。
修复建议
升级javascript库版本。
哦哦,我看明白了原来jquery存在多个安全漏洞,要升级版本,但是问题来了升级到哪个版本了?漏洞是什么了?
升级jq
这个简单可以直接去官网下载,最新的jq,官网链接如下:
jquery官网: jquery.com/
jq 漏洞是什么?
Jquery XSS漏洞(CVE-2020-11022)
漏洞详情
V 1.2.0 <= jquery < V 3.5.0中存在跨站脚本漏洞,该漏洞源于WEB应用缺少对客户端数据的正确验证。即使执行sanitize处理,也仍会执行将来自不受信任来源的HTML传递给jQuery的DOM操作方法(即html()、.append()等),攻击者可利用该漏洞执行客户端代码。
漏洞检查
在这里我想大家介绍一个网址,可以用来检查jq的版本是否有漏洞。地址如下:
漏洞分析
在html()方法中,HTML字符串将作为参数传递到 $.htmlPrefilter()方法进行处理。 $.htmlPrefilter()方法用于替换自闭合标签,有点类似标签自动补全。比如将<span/>替换为 <span></span>。
3.x 之前版本之前使用的正则为:
// 正则
rxhtmlTag =/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)/>/gi;
// 运行代码
htmlPrefilter: function( html ) {
return html.replace(rxhtmlTag, "<$1></$2>" );
}
3.x之后使用的正则为:
rxhtmlTag =/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi
因为这个特性可以构造适合jQuery3.x的payload如下:
<img alt="<x" title="/><img src=xοnerrοr=alert(1)>
因为这里的xss payload是作为属性出现,所以可以绕过sanitize规则。该payload使用html()方法执行后会变为:
<img alt="<x" title="/></x”><imgsrc=x οnerrοr=alert(1)>
该正则会将 x" 识别为标签,并新增 /x" 来闭合标签,从而执行XSS的payload。
漏洞结论
漏洞问题就是在中.html(),作为参数传递的 HTML 字符串被传递给 $.htmlPrefilter()方法。使用以下正则表达式htmlPrefilter执行替换自闭合标签的处理,如:<tagname />转换为<tagname ></tagname>。
漏洞验证
点击 Append via .html()按钮, 即可触发xss,如图:
漏洞修复
点击 Append via .html()按钮, 没有触发,如图:
总结
1、漏洞问题
- 系统使用jQuery的
html()、append()或$('<tag>')等方法处理用户输入; - 用户输入已经过
sanitize处理;
2、修复方案
- 更新jQuery到3.5.0或更高版本;
- 使用XSS清理工具清理用户输入的HTML,官方推荐:github.com/cure53/DOMP…