文章链接 http://bobao.360.cn/learning/detail/292.html
0x00前言
昨天看了 这篇文章 感觉收获颇丰 发现很多东西都不是很清楚 所以看完来自我总结一下
先会把文章的知识点进行总结 再结合文章的练习题进行逐个的分析
0x01原理
HTML 解析
html的解析器类似于一个状态机 会获取字符并按照转换规则转换到另一种状态 在解析的过程中 遇到了 < 就会进入标签开始的状态 然后就到了标签名状态 比如说 a标签 然后再是前属性名 比如说 最后进入数据状态 数据状态的时候 会进行解析 然后每当发现一个完整的标签的时候就会释放出一个token 也就是说遇到 /的时候这样就是一个完整的标签
在xss中我们很多页面都把 < > 等符号进行了html实体化的操作 这样就可以防护xss 为什么呢 当解析器 遇到 & 的时候 它知道这是数据状态的字符引用 所以会消耗一个字符引用 把 html 实体编码 变成对应的字符 但是这时候在解析这个字符的时候 不会转换到标签的开始状态的 所以用户输入的数据只能解析成数据了 在html解析中只有遇到 < 才会进入 标签开始的状态 所以 这里 html 实体编码变成 < 之后 html 解析器不会再从头去读 html解析器会继续往后进行解析 所以这样 没有标签开始的状态 当中的恶意代码是不会被html 解析的 也就是说是不会执行当中的 代码的
HTML 中的五类元素
1. 空元素(Void elements),如<area>,<br>,<base>等等 空元素!!!
2. 原始文本元素(Raw text elements),有<script>和<style> 可以容纳文本
3. RCDATA元素(RCDATA elements),有<textarea>和<title> 可以容纳文本和字符引用
4. 外部元素(Foreign elements),例如MathML命名空间或者SVG命名空间的元素 外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释
5. 基本元素(Normal elements),即除了以上4种元素以外的元素 基本元素,可以容纳文本、字符引用、其他元素和注释
RCDATA元素 为什么不会导致xss
简单的来说在这之间唯一可以被解析认作标签的 就是 “</textarea>”或者“</title>” 所以在这中间的script是不会执行的
URL 解析
url资源类型必须是ASCII 字母 不然就会进行无状态的情况 你不能对协议类型进行任何的编码操作,不然URL解析器会认为它无类型
0x02练习解析
1 <a
href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
无法执行 原因 : 正如 url解析中所说的 url资源类型必须是ASCII 字母 所以这里是无法解析的
2
<
a
href
=
"javascript:%61%6c%65%72%74%28%32%29"
>
可以执行 原因 : 同理 这里前面把JavaScript html实体化了 属性值中的字符引用”,在这个情况中字符引用会被解码 然后后面的是ASCII 字母符合条件 可以解析
3
<a
href="javascript%3aalert(3)"></a>
不能执行 原因 : 这里的%3a 是url编码 所以适用之前的规则 只接受ASCII
4
<div><img src=x onerror=alert(4)></div>
不能执行 原因 : 这里对尖括号进行了html实体化的编码
5 <textarea><script>alert(5)</script></textarea>
不能执行 原因 :同上
6 <textarea><script>alert(6)</script></textarea>
不能执行 原因: 唯一可以被解析认作标签的 就是 “</textarea>”或者“</title>” 所以在这中间的script是不会执行的