先看一段HTML
看上去就是展示了一张图片而已。用浏览器打开看看。
咦?怎么弹框了?看看源码。
原来,img标签src属性里的把外层的给闭合了,导致src后半部分的script标签被解析成了HTML,从而触发了弹框。
这可奇怪了。明明在双引号里面,怎么就跨越了src属性跨越了img标签,漂洋过海地把外层的noframes标签给闭合了?难道说,noframes标签有一种特殊的魔力。它的闭合优先级,高于双引号的完整性优先级,高于嵌套在内层的标签的闭合优先级。
还有其他标签也有这样的魔力么?我们fuzz一下看看。
从w3school找到所有的HTML标签:
整理成tags.txt。
按照前述noframes的格式,依次把他们输出到show.html中。
打开show.html看一下效果。
现在我们知道,这些标签都是闭合优先级高于双引号完整性优先级的特殊标签。
这个特性出现的原因,可能是源于浏览器对DOM树的特殊处理。而在某些XSS攻击的场景下,这一特性可能导致意想不到的结果。
特别是,对于邮箱或者论坛等支持富文本的应用中。出于防御xss的考虑,一定会对用户的输入进行语法分析和检查。但是,如果语法分析的结果和浏览器的识别结果不一致的话,就会形成xss的攻击点。
比如文章开头的那段noframs语句,如果将src中的内容统一理解为img的src属性,就可能形成XSS攻击。
这个特性还有哪些用处,就需要你的脑洞大开了:)
点击“阅读原文”,查看w3school的HTML标签列表。