【问题标题】:XSS attacks and style attributesXSS 攻击和样式属性
【发布时间】:2011-05-31 14:27:02
【问题描述】:

已知的 Style Attribute XSS 攻击如下:

<DIV STYLE="width: expression(alert('XSS'));">

或者

<DIV STYLE="background-image: url(javascript:alert('XSS'))">

I've seen 的所有示例都使用表达式或 url 功能 - 基本上类似的功能需要“(”和“)”。

我正在考虑以下过滤样式标签的方法,我会使用以下(大约)语法检查它们:

identifier: [a-zA-Z_][a-zA-Z0-9\-]*
number: [0-9]+
string: '[a-zA-Z_0-9 ]*'
value : identifier | number | string | number + "(em|px)" | number +"%"
entry: identifier ":" value (\s value )*
style: (entry ;)*

所以基本上我允许 ASCII 属性具有数值或非常有限的字符串值(基本上用于字体名称),不允许使用任何看起来像 call 的东西。

问题是否足够好?是否有任何攻击可能会做类似的事情:

<DIV STYLE="this-is-js-property: alert 'XSS';">

成功了吗?

谁能想到这种测试的 XSS 漏洞?

明确说明

我需要样式属性,因为 TinyMCE 等许多工具都使用它们并过滤无害 关闭样式属性会严重损害功能。

所以我更喜欢通过常见情况删除所有可能使用@import、url、表达式等的东西。同时确保基本的 css 语法没问题。

回答

不,由于点击劫持漏洞,它不安全。

【问题讨论】:

  • 干得好,很多都不知道
  • 有复杂的html白名单过滤框架,如github.com/owasp/java-html-sanitizer。有足够时间的熟练攻击者总能找到击败黑名单过滤器的方法。

标签: javascript html coding-style xss


【解决方案1】:

由于 click-jacking 漏洞,这不起作用。

例子:

<a href="http://example.com/attack.html" style="display: block; z-index: 100000; opacity: 0.5; position: fixed; top: 0px; left: 0; width: 1000000px; height: 100000px; background-color: red;"> </a> 

发现于:http://www.bioinformatics.org/phplabware/forum/viewtopic.php?id=164

代码将被完美验证,但可能会造成严重损坏。

所以 - 经验法则使用非常严格的白名单或不允许样式属性。

【讨论】:

  • 好点!我认为我们现在可以使用 X-Frame-Options 来防御点击劫持漏洞。
  • 但这与带有恶意链接的虚假a标签“在此处登录”或带有恶意src的&lt;img&gt;一样多?
【解决方案2】:

有一个名为OWASP 的开放基金会可以帮助您解决这个问题。

回答您的问题Are there any attacks....;是的!

那里有大量文档,还有一些库可以用来正确转义所有 XSS 代码。

阅读XSS prevention sheet

【讨论】:

  • 你能说得更具体些吗?任何特定攻击?我搜索了这些网站,但没有发现任何允许使用 css 标识符和数字进行此类攻击的东西。这就是我问的原因。
  • 有很多编码html的方法。您可以使用 HTML 实体之一。 OWASP 文档包含所有示例,并且那里的库正确地转义 all possibilites
  • HTML 实体和其他“有线”编码方式是不允许的,正如您在语法中看到的那样,只允许非常严格的字符串子集拒绝任何“不寻常”的东西
【解决方案3】:

是的,您可以使用带有 Style 属性的 XSS 攻击。

这些样式是被注入的,因为我们没有在特定 jsp 页面的标签中声明它们,但在我们的安全组审核时通过了:

<img src="<path here>" style=x:ex/**/pression
(alert(54163)) ".gif"

我正在考虑使用 HTTP 过滤器来阻止它,但我仍在研究它。

我们也没有保护我们的隐藏输入字段,这也得到了解决:

<input type="hidden" name="<variable name here>" value="<value here>"  style=x:ex/**/pression(alert
(54163)) "">

使用像 Burpsuite 这样的工具,您可以动态修改请求以将 XSS 注入到这样的标签中。但是,使用 OWASP 的 ESAPI API,您可以添加保护。我们没有使用 JSTL 标记,因为它是旧的遗留代码,所以这是最好的短期解决方案。

对于我使用的隐藏输入;

<input type="hidden" name="id" value="<%=ESAPI.encoder().encodeForHTMLAttribute(id)%>"

你也可以使用XSS with the js onload event in an img tag:

【讨论】:

  • 但在您的情况下,样式和 src 属性没有正确转义,即它们不能没有引号和正确编码的内容。
  • 我展示的XSS实际上是通过我们的js代码的。
【解决方案4】:

安全规则 #1:如果您的疑虑最少,请假定存在漏洞。

你想达到什么目的?哪些功能会导致 CSS 来自不受信任的来源?

【讨论】:

  • 在我的例子中,它是一个讨论系统,人们可以在 CommonMark + HTML 中发布 cmets,它们可能包含 style=... 属性。 (我不是原始海报,我只是有一个类似的“问题”。)
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2022-01-08
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多