WEB安全第七课 层叠样式表 之二 重新同步的风险 |
CSS语言无疑深受HTML的影响,所以它和大多数其他语言不同的地方在于,符合规范的CSS解析器在碰到语法错误时,仍会继续工作,直到碰到下一对匹配的尖括号时又会恢复正常的解析(规范里倒是有要求做一些很表面功夫的嵌套检查)。
![]() 特别是,以下面这个样式表代码为例,尽管格式完全不对,但仍然会改变所有<img>标签的边框样式:👩✈️🕶💰😤💪 [mw_shl_code=css,true] a{ $$$ 这一段语法是完全没意义的! $$$ !(@*#)!!@ 123👴🧢💉😊👄 } img{ border:lpx solid red; }[/mw_shl_code]👮♂️👠📮🥰✌ 利用css解析器这种不同寻常的行为,就可以针对css解析器的不兼容性构造出一些有趣的攻击方式,譬如对某些浏览器属于有效的输入,但却能令另一些浏览器的CSS实现出错,利用CSS解析器出错之后会重新同步的处理逻辑,就可能导致受攻击的浏览器在不正确的位置解析CSS,如从攻击者提供的字符串中间位置开始解析。 IE浏览器对多行字符串文本的支持,就属于这类问题里一个傻得比较天真的例子。如果用户提供的CSS字符串里包含CR和LF换行符,对IE浏览器来说基本上是安全的,所以某些网站会允许这种做法。但遗憾的是,同样的模式却会使别的浏览器产生无法预期的处理偏差,并导致以下evil_njle规则集里的内容获得解析: 🧑💻👒⚔🥰👍 [mw_shl_code=css,true] some_benign_selector{ content:'Attacker-controlled text... }evil_rule {margin-left:-lOOOpx;}'; }[/mw_shl_code] 👃🏫🥭🈴🐤 对多行字符串文本的支持是微软特有的扩展,其实只要禁止使用这种不合规的语法,就能轻易修复前面这个问题。遗憾的是,标准本身又引入了其他的去同步(desynchronization)风险。例如,还记得前面的复杂选择器吗?这个CSS 3语法对早于CSS 3以前版本的解析器而言,是没有意义的。在以下这个例子里,较老版本的CSS解析器在碰到那个不认识的方括号之后,就不工作了,直到碰到攻击者提供的evil_ule,又会再次开始解析: [mw_shl_code=css,true] a[hrGfA='}evil_rule{margin-left:-lOOOpx;}']{ /*这部分是无害,有效的CSS规则*/ }[/mw_shl_code] 👍⛴🍟☣🦄 目前IE6浏览器对此漏洞依然有效。#362: WEB安全第七课第三节:
帖子热度 1万 ℃
|
|
苍天有眼,让偶等到了!楼主此贴必然会起到抛砖引玉的作用,我更坚信在有生之年必然会看到有更多象楼主一样的人来八卦畅所欲言、发表高见,不管明天会是如何,今夜梦中,我会笑容灿烂,因为,我终于知道了,此番人世,得此一贴,无憾矣!
|