XSS中解析机制原理学习

HTML解析

首先html解析器是一个状态机,将输入流中的内容以一定规则转换为另一种状态

在不同状态下解析会存在差异。

字符引用

字符引用包括字符值引用(& #60;)和字符实体引用(& lt;)。有些字符没有字符实体名称,但是存在字符编号。

标签

引入HTML五类元素:

  1. 空元素:不容纳任何内容
  2. 原始文本元素(<script>和<style>):可以容纳文本
  3. RCDATA:可以容纳文本和字符引用
  4. 外部元素:容纳文本,字符引用,CDATA,其他元素,注释
  5. 基本元素:容纳文本,字符引用,其他元素,注释

其中关注:RCDATA元素,外部元素,基本元素,他们都可以容纳字符引用。

三种状态

一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态。在解析过程中,任何时候它只要遇到一个’<’符号(后面没有跟’/‘符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”……最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。

好了,来说说特殊的三种状态:数据状态RCDATA状态属性值状态。这三种下可以容纳字符引用
其中RCDATA元素:当浏览器解析到<textarea>时,会进入RCDATA状态,此时其中的除了相应的<textarea>标签,任何标签都不会被解析执行。

URL解析

URL解析关键,要在协议下进行解析,不然会进入无类型状态,所以URL不能对协议进行编码,会导致无法解析。

JavaScript解析

在上面的标签中可以看到script标签中只能容纳文本,不能容纳字符引用。但是存在Unicode转义,Javascript会进行解析

Unicode转义

转义可以放在三部分:字符串中,标识符名称,控制字符中。只有当Unicode转义标识符名称时才不会当作字符串。

1
2
3
4
<script >
var \u0078\u0078="mm";
alert(xx);
</script>

解析顺序

HTML->URL->JavaScript

总结

要执行一个标签,要满足进入标签开始状态,元素可以被解析