2013-01-25 59 views
6

问题没有从这个出现:
Why does the browser modify the ID of an HTML element that contains &#x?此代码是否容易受到XSS攻击?

考虑到以下网页:

<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/&#x24;whatever")); 
     if(e) { 
      alert(e.innerHTML); 
     } 
     else { 
      alert("not found\n"); 
     } 
     } 
    </script> 
    </head> 
    <body> 
    <p id="/path/&#x24;whatever">The Value</p> 
    <button onclick="echoValue()">Tell me</button> 
    </body> 
</html> 

<p>元素的id包含为了防止XSS攻击了逃脱字符。 HTML部分和JS部分由服务器生成,服务器在两个部分插入相同的转义值(可能来自不安全的源)。

服务器逸出在&#x格式以下字符范围:

  • 为0x00 – 0x2D
  • 0x3A – 0x40的
  • 0x5B – 0x5E
  • 0x60的
  • 0x7B – 0xFF的
  • 0x0100 – 0xFFFF的

换句话说:是逃过字符只有:

  • 器0x2E – 0x39(./
  • 的0x41 – 0x5A(AZ
  • 0x5F(_
  • 0x61 – 0x7A(az

现在,我得通过JavaScript访问该<p>。引用问题中的函数echoValue()始终失败,因为浏览器在HTML部分中将&#x24;转换为$,但在JS部分中将其保留为&#x24;

因此,Gareth想出了an answer这是简单和有效的。

我担心的是,当使用参考答案中提供的decodeEntity()函数时,通过转义动态字符串消除的XSS攻击的可能性将再次出现。

可能有人指出是否可能有安全问题(哪个?)否(为什么不呢?)?

+0

只是让服务器不在脚本内部转义它。 – Bergi

回答

4

我首先建议你看看下面的链接中的Javascript讨论JavaScript和XSS HTML卫生:

安全课没有1: 不要重新发明轮子。如果之前已经完成了某些工作,那么他们可能比您的临时解决方案做得更好。

即使我不能从我的头顶找到一种方法来利用你的简单正则表达式,我不信任它真正捕获所有情况。第一个链接提供了一个更详细的解决方案,并且已经过彻底的审查和测试。我建议你看看XSS Filter Evasion Cheat Sheet。告诉你真正的好人可能想出什么样的讨厌的东西。

+2

只是一个观察...两个链接都将转到相同的URL。也许这不是故意的。 –

0

你申请输入可能导致这种攻击失败,但假设任意输入到decodeEntity额外的限制,这里的运行脚本的例子:

decodeEntity("<img onerror='alert(\"test\")'\nsrc='test'>") 

这运行,因为/<(.*?)>/只有在匹配<>在同一行上。

相关问题