我应该如何缓解 mustache-security 中描述的 KnockoutJS 中的 XSS 漏洞?

信息安全 xss javascript
2021-09-03 12:55:32

Mustache-Security网站描述了 KnockoutJS 中的 XSS 漏洞......这些漏洞来自于使用 eval(或其他等价物)将 data-bind 属性中的文本转换为可执行脚本。大多数示例显示了如果将恶意脚本注入到数据绑定属性中可以执行的攻击。

示例(HTML/JavaScript/KnockoutJS):

<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="click: alert(1)"></div>
<div data-bind="value: alert(2)"></div>
<div data-bind="style: alert(3)"></div>
...
<select data-bind="options: alert(99)"></select>
<script> 
ko.applyBindings();
</script>

虽然我可以重现定义的示例,但在使用 KnockoutJS 时,我通常会避免将 JavaScript 放入数据绑定属性中。我更喜欢在 JavaScript 对象上引用 observable 属性,以将视图的行为与其布局分开。使用这种方法,我发现 JavaScript 是不可执行的。

示例(HTML/JavaScript/KnockoutJS):

<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script>
<div data-bind="value: firstName"></div>
<script> 
var ViewModel = function() {
    this.firstName = ko.observable('alert(2)');
}

var vm = new ViewModel();
ko.applyBindings(vm); 
</script>

我的应用程序是否仅仅因为我使用了 KnockoutJS 而面临 XSS 风险,或者我是否还必须找到一种方法来使用服务器端代码将不受信任的输入放入数据绑定属性中?

示例(ASP.NET/HTML/JavaScript/KnockoutJS):

<div data-bind="value: <%=Request.QueryString("id")%>"></div>

我认为如果攻击者可以使用 JavaScript 在页面中注入他们的脚本,那么他们可以直接操作 DOM,并且 KnockoutJS 不会增加我的 XSS 风险。

还有什么我想念的吗?我还需要做什么来防止作者描述的 XSS 漏洞?

1个回答

mustache-security中描述的攻击描述了绕过 Web 应用程序防火墙 (WAF),它试图通过丢弃包含 <script>标签的 HTTP 请求来阻止 XSS。如果页面正在使用 KnockoutJS,那么攻击者可以使用 a<div>而不是<script>标签来获取代码执行:

http://localhost/xss?id=<div data-bind="html: '&#x5c;x3cimg&#x5c;x20src=x&#x5c;x20onerror=alert&#x5c;x281&#x5c;x29&#x5c;x3e'"></div>

为了使上述攻击起作用,攻击者必须能够使用尖括号注入 HTML 标签<>