已知样式属性XSS攻击如:
<DIV STYLE="width: expression(alert('XSS'));">
Run Code Online (Sandbox Code Playgroud)
要么
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
Run Code Online (Sandbox Code Playgroud)
我见过的所有例子都使用了表达式或网址功能 - 基本上就像需要"(和")"这样的功能.
我正在考虑使用过滤样式标签的方法,我会使用以下(近似)语法检查它们:
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 ;)*
Run Code Online (Sandbox Code Playgroud)
所以基本上我允许带有数值的ASCII属性或非常有限的字符串值(基本上是字体名称)不允许使用看起来像调用的任何东西.
问题是这还够好吗?有没有可能做类似的攻击:
<DIV STYLE="this-is-js-property: alert 'XSS';">
Run Code Online (Sandbox Code Playgroud)
并成功?
谁能想到这种测试的XSS漏洞?
说清楚
我需要样式属性,因为许多工具(如TinyMCE)使用它们并过滤无害的样式属性会严重损害功能.
所以我更喜欢通过常见的情况删除所有可能使用@ import,url,expression等的东西.还要确保基本的css语法没问题.
回答
不,由于点击顶级漏洞,它不安全.