Hu3sky's blog

深入理解浏览器编码

Word count: 495 / Reading time: 2 min
2019/08/06 Share

开头

从一到题目引发了对html编码的兴趣
在svg标签里面,利用html编码是能够被解析的

1
2
3
4
5
6
7
8
9
# html编码左括号
# 传入的时候记得将( 进行url编码

<svg><script>prompt&#x28;1)</script>

# html编码alert
# 传入的时候记得url编码

<svg><script>&#x61;&#x6c;&#x65;&#x72;&#x74;</script>

image
image

不过去掉svg标签就不能弹窗了
这里先理解一下浏览器的解码以及XSS里的一些东西

浏览器解码过程

html解析(器),url解析(器),js解析(器)

HTML解析标签

html解析器在解析过程中,遇到一个<就会进入标签开始状态(TagOpenState)->标签名状态(TagNameState)->前属性名状态->…->数据状态(DataState)并释放当前标签token
当进入数据状态,每发现一个完整标签,就释放出一个token

举个例子
比如在解析

标签时
首先遇到<,此时进入TagOpenState,token为Uninitialized
接着遇到d,此时进入TagNameState,token为StartTag
然后遇到i,v,同上
接着遇到>,此时进入DataState,token为StartTag
此时释放出的token为StartTag

几个概念

从一个payload说起
<,>进行字符实体编码

1
<div>&#60;img src=x onerror=alert(4)&#62;</div>

此payload无法弹窗,解释原因之前先看几个概念

字符实体

image

< 的字符实体是 &#60;

HTML字符实体(实体编码)

< 的HTML字符实体是 &lt;

字符引用

有 “数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”
字符引用又分为字符值引用和字符实体引用
< 的字符值引用是 &#60;,字符实体引用是&lt;
在DataState遇到&的时候,会进行字符引用,所以并不会闭合标签

html元素

五类元素

  1. 空元素(Void elements),如,
    ,等等,不能容纳任何内容,无闭合标签
  2. 原始文本元素(Raw text elements),有
CATALOG
  1. 1. 开头
  2. 2. 浏览器解码过程
  3. 3. HTML解析标签
    1. 3.1. 几个概念
      1. 3.1.1. 字符实体
      2. 3.1.2. HTML字符实体(实体编码)
      3. 3.1.3. 字符引用
      4. 3.1.4. html元素