浏览器的自解码机制(用于XSS编码绕过)

1.浏览器大致的工作流程

(1)浏览器解析HTML

(2)标签转化为DOM节点,识别标签时,HTML解析器无法识别被实体编码的内容,在建立起DOM树,才能对每个节点的内容进行识别

(3)JS DOM API(JS解析器)参与,对DOM树进行修改,改变其内容。此时CSS解析器解析外部CSS及style标签,一起构成rendering tree==

(4)这里CSS在构造rendering tree之前,会有CSS rule tree

(5)布局完之后,使用UI后端完成每个节点的绘制,从而显示

在上述有两个解析器需要特别注意,分别是HTML解析器、JS解析器、CS解析器(这个暂时不提)。因为基本上XSS编解码payload就是靠这两个来利用的。

2.解析器

  • HTML解析器

作用:构造DOM树,对节点内容进行解析

  • JS解析器

作用:在处理script,style标签,解析器会自动切换为JS解析模式,而src,href后面加的JS伪协议也会进入JS解析模式。进入该模式时,DOM已经建立起来了

3.案例(所有测试均在firefox浏览器进行)

1.在进行HTML解析时,HTML实体编码会自动进行解码

<a href="&#106;avascript:alert('1')">test</a>

点击test后能够正常弹窗。此时,有相同作用的编码格式有:

(1)HTML实体编码:&#106;

(2)十六进制:&#x6a;

(3)十进制:&#106

(4)支持数字部分高位补充0,&#00000000106(&#00000000106;)

2.JS解析

<a href="javascript:alert('\u0061')">test</a>

点击test后弹出a,进行了Unicode解码。此时有相同作用的编码格式有:

(1)Unicode格式:\u0061

(2)十六进制格式:\x61

(3)八进制格式:\141

4.总结

不管是HTML解析还是JS解析,都是对其字符部分进行操作,例如对于<a href="javascript:alert('\u0061')">test</a> 来说, 双引号“  ”里面的内容属于HTML标签的字符部分;单引号‘  ’里面的内容属于JS的字符部分。

所以:浏览器在对a标签进行解析时,首先对javascript:alert('\u0061')进行一次HTML解码器处理,之后对\u0061进行一次JS解码器处理,从而得到最终的显示结果<a href="javascript:alert('a')">test</a>

发布了10 篇原创文章 · 获赞 5 · 访问量 2992

猜你喜欢

转载自blog.csdn.net/qq_36896220/article/details/104618130