内联HTML javascript事件将转义引用作为结束引用进行归类

时间:2015-05-15 11:45:47

标签: javascript php html escaping xss

是否内联HTML js事件不关心转义引号?

$xss = addslashes("'><script>alert(/XSS/.source)</script>");
echo "<a href='/deleteaction.php' onclick='javascript:if(!confirm(\"{$xss}\")) return false'>Delete</a>";

制作HTML:

<a href='/deleteaction.php' onclick='javascript:if(!confirm("\'>
<script>alert(/XSS/.source)</script>
")) return false'>Delete</a>

编辑:所以这实际上是执行脚本。我以为它会在确认框中产生这样的字符串:

'><script>alert(/XSS/.source)</script>

但是,第一个单引号被解释为onclick事件的结束引用。所以我的问题是,为什么它被解释为结束引用,尽管它之前有反斜杠?

3 个答案:

答案 0 :(得分:1)

这是因为浏览器的HTML解析器在JavaScript解析器之前运行。

在HTML中\'不被识别为单引号字符,它被识别为字面上的反斜杠后跟单引号。

单引号的正确HTML为&#x27;(或十进制&#039;

要解决此问题,您应该使用htmlentities以及addslashes

e.g。

$xss = addslashes(htmlentities("'><script>alert(/XSS/.source)</script>", ENT_QUOTES));

这将输出:

<a href='/deleteaction.php' onclick='javascript:if(!confirm("&#039;&gt;&lt;script&gt;alert(/XSS/.source)&lt;/script&gt;")) return false'>Delete</a>

确认的正确编码是:

PHP XSS

请注意,这仅适用于可包含脚本的HTML属性,而不适用于<script>标记内的内容,因为该内容不是通过HTML解析器运行的(HTML解析器只查找最终的</script>直到它恢复HTML处理。)

注意,如果字符串包含addslashes个字符,我们也需要\

一种不那么混乱的编码方式是遵循Rule #3 of the OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet

  

除字母数字字符外,请将所有字符转义为小于   256用\ xHH格式防止切换出数据值   进入脚本上下文或另一个属性。

因此,我们只是JavaScript十六进制实体编码,而不是对斜杠和HTML进行编码。据我所知,PHP不提供开箱即用的功能(如果我错了,请纠正我。)

这也处理了属性是单引号,双引号或不引用的情况(因为空格转换为\x20)。

答案 1 :(得分:0)

这是正确的$ xss值。你最后错过了一个单引号。

$xss = addslashes("'><script>alert(/XSS/.source)</script>'");

已编辑

我们不能直接使用&lt;和&gt;我们的代码中的标签,因为它们是为html标签保留的标准html标签,而是使用html实体

$xss = addslashes("'&gt;&lt;script&gt;alert(/XSS/.source)&lt;/script&gt;'");

我希望这会对你有所帮助。

答案 2 :(得分:0)

我从http://www.jibbering.com/faq/faq_notes/script_tags.html

找到答案
  

事件处理属性的值几乎肯定需要   被引用是因为写一个javascript几乎是不可能的   仅使用未加引号中允许的字符的语句   属性值。引用可以完全涉及属性   值因为它们需要在HTML源代码中引用,所以无论如何   HTML中使用的引号标记类型不能在其中使用   javascript代码作为值提供,因为HTML解析器会   将它们作为结束属性值的字符串。而   javascript字符串文字允许使用双引号或单引号   引号为分隔符,并允许引用的类型不用作   分隔符出现在未转义的字符串文字中。

     

所以,鉴于希望分配字符串&#34;不要这样做&#34;到了   元素在onclick事件中的value属性,因为单个   引号出现在字符串本身的属性值中   onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;因为HTML不会起作用   解析器将第二个单引号作为结束属性   值。简单地将单引号转义为   onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;因为HTML解析器   我不知道有关javascript转义的任何信息,仍然可以看到   javascript字符串中间的第二个单引号。

     

在这种情况下,转出单引号并反转引用   在HTML和javascript之间onclick =&#34; this.value =&#39;不做   该&#39 ;;&#34;或者使用javascript十六进制转义符(HTML解析器将使用)   不要看作是一个引用)onclick =&#39; this.value =&#34;不要这样做&#34;;&#39;将   解决这个问题。但事件处理属性字符串中的引号   通常需要考虑定义使用字符串文字的代码。