问题确实来自于这一个:
Why does the browser modify the ID of an HTML element that contains &#x?
给出以下网页:
<html>
<head>
<script type="text/javascript">
// --------------------------------------------------------
// could calling this method produce an XSS attack?
// --------------------------------------------------------
function decodeEntity(text){
text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
var div = document.createElement('div');
div.innerHTML = text;
return div.textContent?div.textContent:div.innerText;
}
function echoValue(){
var e = document.getElementById(decodeEntity("/path/$whatever"));
if(e) {
alert(e.innerHTML);
}
else {
alert("not found\n");
}
}
</script>
</head>
<body>
<p id="/path/$whatever">The Value</p>
<button onclick="echoValue()">Tell me</button>
</body>
</html>
id
元素的<p>
包含为了防止XSS攻击而被转义的字符。 HTML部分和JS部分由服务器生成,服务器在两个部分上插入相同的转义值(可能来自不安全的源)。
服务器以&#x
格式转义以下字符范围:
换句话说:不转义的唯一字符是:
.
,/
,0123456789
)A
- Z
)_
)a
- z
)现在,我必须通过javascript访问<p>
。引用问题中的函数echoValue()
始终失败,因为浏览器会在HTML部分中将$
转换为$
,但在JS部分中将其保留为$
。
我担心的是,当使用引用的答案中提供的decodeEntity()
函数时,通过转义动态字符串消除的XSS攻击的可能性将再次出现。
有人可以指出是否存在安全问题(哪个?)(为什么不呢?)?
答案 0 :(得分:4)
我首先建议您查看以下链接,在Javascript中讨论JavaScript和XSS中的HTML卫生:
安全课程1: 不要重新发明轮子。如果以前做过某些事情,那么他们可能比你的临时解决方案做得更好。
即使我无法从头脑中找到一种方法来利用您的简单正则表达式,但我并不认为它真正捕获了所有情况。第一个链接提供了一个更加精细的解决方案,并经过全面审查和测试。
我还建议您查看XSS Filter Evasion Cheat Sheet。向你展示真正的好人们会想出什么样的讨厌的东西。
答案 1 :(得分:0)
您对输入应用的额外约束可能会导致此攻击失败,但假设decodeEntity
的任意输入,这是运行脚本的示例:
decodeEntity("<img onerror='alert(\"test\")'\nsrc='test'>")
此操作是因为/<(.*?)>/
仅在<
和>
位于同一行时匹配。