4

示例代码:

<!DOCTYPE html>
<html lang="en">
<head><title>XSS test page</title></head>
<body>
<p>
<?php
  $style = htmlspecialchars($_GET['style']);
  echo '<div style="'.$style.'">This is a style test</div>';
?>
</p>
</body>
</html>

是否可以只使用正确转义的 html 样式属性来注入 javascript 代码?

我听说可以通过 CSS ( Source 1 , Source 2 ) 触发 XSS 攻击。

我想知道这是否也可以通过 style 属性实现。

4

2 回答 2

8

我已经在问题的评论部分指出了这一点,但我认为它更适合作为实际答案。

CSS

除了实际的 XSS 威胁之外,将用户输入传递给页面上的样式标签会为攻击者打开一整套其他机会,其中一些只是使用纯 css。

通过将元素设置为position: absolute;,可以用它覆盖整个页面。这可以用来使其无法使用(opacity:0;例如),或者攻击者可以使用它来破坏整个页面。通过使用 和 之类的 CSS3 属性:before:after它们甚至能够通过 CSS 将内容放在您的页面上。

另一个结果可能是“点击劫持”,这实际上已经在 StackOverflow 上讨论过了。

跨站脚本

但是,对于纯 XSS,很难在现代浏览器上使用它,但我不会说这是不可能的。无论如何,在较旧的浏览器(例如 Internet Explorer 7)上,这可能会被用于攻击。已经有非常有创意的 XSS 注入,它们以最疯狂的方式进行混淆和解码以智取输入验证,这仍然会在几个(现在)旧浏览器上成功,因为它们仍在解析它。考虑到这一点,现代浏览器的问题变得更好了。

此外,还有 where 和 之类的函数expression()background-image:url这使得在旧版本的 Firefox、IE7 和更早版本以及可能的其他一些浏览器中可以在 CSS 中执行脚本。

OWASP XSS 预防备忘单实际上列出了一个示例,其中这些函数用于样式 - 标记和样式 - 属性。

无脚本攻击(可能也适用于现代浏览器!)

抛开旧浏览器和 XSS 不谈,这里还有其他可能适用的方式,主要是“无脚本攻击”的形式。深入细节会扩大这里的范围,但是关于这个主题有一个很好的演示,提供了几种方法和很好的例子,说明即使是现代浏览器也会受到影响。另一个例子是这篇博客文章,其中 CSS 用于跨站点请求伪造。(非常感谢@BenjaminGruenbaum 提供链接)

最后,为了更深入地了解聪明的攻击者在脚本插入方面的疯狂程度,我建议浏览http://www.thespanner.co.uk/。例如,甚至在 style-attribute 上还有一个非常狂野的 XSS 示例,据说可以在“在 IE7 和 Firefox(未给出版本)”上工作。

所以,在做这样的事情时要小心,人们可能仍然会找到办法......

于 2013-03-21T00:33:00.370 回答
1

这取决于浏览器。例如,IE 在 CSS 和样式标签中通过表达式关键字编写脚本。谢天谢地,这在 IE8 中消失了。

根据我有限的 PHP 知识,您正在做的事情很好;htmlspecialchars() 在您将其用于用引号括起来的属性值时起作用。如果你把引号去掉,<div style='.$style.'>那么你就陷入了一个麻烦的世界。

于 2013-03-20T23:24:08.093 回答