文章链接 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

<ahref="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%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是不会执行的

发表评论

电子邮件地址不会被公开。 必填项已用*标注