开头
从一到题目引发了对html编码的兴趣
在svg标签里面,利用html编码是能够被解析的
1 | # html编码左括号 |
不过去掉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
首先遇到<,此时进入TagOpenState,token为Uninitialized
接着遇到d,此时进入TagNameState,token为StartTag
然后遇到i,v,同上
接着遇到>,此时进入DataState,token为StartTag
此时释放出的token为StartTag
几个概念
从一个payload说起
将<
,>
进行字符实体编码
1 | <div><img src=x onerror=alert(4)></div> |
此payload无法弹窗,解释原因之前先看几个概念
字符实体
<
的字符实体是 <
HTML字符实体(实体编码)
<
的HTML字符实体是 <
字符引用
有 “数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”
字符引用又分为字符值引用和字符实体引用<
的字符值引用是 <
,字符实体引用是<
在DataState遇到&
的时候,会进行字符引用,所以并不会闭合标签
html元素
五类元素
- 空元素(Void elements),如,
,等等,不能容纳任何内容,无闭合标签 - 原始文本元素(Raw text elements),有