element.setAttribute在什么情况下可以允许XSS?

信息安全 xss dom 打嗝套件
2021-08-12 05:55:12

Burp 发现了一个潜在的 DOM XSS 漏洞:

应用程序可能容易受到基于 DOM 的跨站点脚本的攻击。从 window.location.href 读取数据并传递给 DOM 元素的“setAttribute()”函数

在这个例子中,易受攻击的代码是这样的(为了保密,我不能包括实际的原始代码):

var thing = windows.location.href;
...
element.setAttribute("fill", thing);

OWASP DOM XSS 备忘单说“ JavaScript Escape Before Inserting Untrusted Data into HTML Attribute Subcontext within the Execution Context”。我不太确定执行上下文是什么意思。

做一些快速测试(在 Chrome 中),这很容易受到攻击:

document.getElementById("bob").setAttribute("onclick", "alert(1)");

但这不是:

document.getElementById("bob").setAttribute("fill", "" onclick="alert(1)");

鉴于这一切,我觉得 Burp 报告了误报。但我担心我可能遗漏了一些东西,因此我们将不胜感激。

我只对在最近的浏览器中可以利用它感兴趣。我对“这不是最佳实践”或“在 Mac 上的 IE 4 中可利用”不感兴趣。

1个回答

setAttribute()是安全的,因为它只是设置属性的值。即使通过在字符串中使用特殊字符,您也无法注入额外的属性(正如您在第三个片段中尝试的那样),更不用说转义 HTML 标记了。

某些属性对于某些元素是危险的。正如您所演示的,on*属性很容易受到攻击,因为它们允许您指定脚本事件处理程序。同样,src并且对元素等srcdoc很危险。<iframe>

url()@Anders 提出的通过注入 JS 的技术在过去适用于 CSS 属性,但在主流浏览器中不再可行。那时,诸如此类的有效载荷<rect fill="url('javascript:alert(1)')"/>本来可以工作。这也可能是 Burp 将其标记为潜在漏洞的原因。不过,它不是最近浏览器中的攻击媒介。