目录
浏览器解析机制遵循规则:
HTML解析
URL解析
JavaScript解析
XSS Payload举例:
案例原文:
一:
二:
三:
四:
五:
六:
九:
十:
十一:
十二:
十三:
十四:
十五:
总结:
浏览器解析机制遵循规则:
- HTML解析
- URL解析
- JavaScript解析
解析顺序是HTML——>URL——>JavaScript。
HTML解析
HTML词法解析细则:
HTML Standardhttps://html.spec.whatwg.org/multipage/parsing.html一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态。在解析过程中,任何时候它只要遇到一个'<'符号(后面没有跟'/'符号)就会进入“标签开始状态(Tag open state)”。然后转变到“标签名状态(Tag name state)”,“前属性名状态(before attribute name state)”......最后进入“数据状态(Data state)”并释放当前标签的token。当解析器处于“数据状态(Data state)”时,它会继续解析,每当发现一个完整的标签,就会释放出一个token。
这里有三种情况可以容纳字符实体,“数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”。在这些状态中HTML字符实体将会从“...”形式解码,对应的解码字符会被放入数据缓冲区中。(这些后面很重要)
解释几个概念
字符实体(character entities)
字符实体是一个转义序列,它定义了一般无法在文本内容中输入的单个字符或符号。一个字符实体以一个&符号开始,后面跟着一个预定义的实体的名称,或是一个#符号以及字符的十进制数字。
HTML字符实体(HTML character entities)
在HTML中,某些字符是预留的。例如在HTML中不能使用“<”或“>”,这是因为浏览器可能误认为它们是标签的开始或结束。如果希望正确地显示预留字符,就需要在HTML中使用对应的字符实体。一个HTML字符实体描述如下:
字符引用(character references)
字符引用包括“字符值引用”和“字符实体引用”。在上述HTML例子中,'<'对应的字符值引用为'<',对应的字符实体引用为‘<’。字符实体引用也被叫做“实体引用”或“实体”。)
现在你大概会明白为什么我们要转义“<”、“>”、“'” (单引号)和“"” (双引号)字符了。
这里要提一下RCDATA的概念。要了解什么是RCDATA,我们先要了解另一个概念。在HTML中有五类元素:
空元素(Void elements),如, ,
等等 原始文本元素(Raw text elements),有
于是直接显示
RCDATA`元素(RCDATA elements)包括`textarea`和`title
回头看HTML解析器的规则,其中有一种可以容纳字符引用的情况是“RCDATA状态中的字符引用”。这意味着在
另外,对RCDATA有个特殊的情况。在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。在这个状态中,如果遇到“<”字符,它会转换到“RCDATA小于号状态”。如果“<”字符后没有紧跟着“/”和对应的标签名,解析器会转换回“RCDATA状态”。这意味着在RCDATA元素标签的内容中(例如”或者“”。因此,在“
六:
Answer: The javascript will NOT execute
和五一样不解析,”或者“”,在“
七:
Character entity encoded '
Answer: The javascript will execute.
这里onclick中为标签的属性值(类比2中的href),会被HTML解码,得到
然后被执行
八:
Unicode escape sequence encoded '
Answer: The javascript will NOT execute.
onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,** '**显然不行,JS执行失败
九:
Character entity encoded alert(9);
Answer: The javascript will NOT execute.
script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,JS也认不出来,执行失败
原始文本元素(Raw text elements)有
Unicode Escape sequence encoded alert
Answer: The javascript will execute.
同8,函数名alert属于标识符,直接被JS执行
十一:
Unicode Escape sequence encoded alert(11)
Answer: The javascript will NOT execute.
编码了括号 ,同八
十二:
Unicode Escape sequence encoded alert and 12
Answer: The javascript will NOT execute.
十三:
Unicode escape sequence encoded '
Answer: The javascript will NOT execute.
这里看似将没毛病,但是这里u0031u0032在解码的时候会被解码为字符串12,注意是字符串,不是数字,文字显然是需要引号的,JS执行失败
十四:
Unicode escape sequence encoded line feed.
Answer: The javascript will execute.
u000a在JavaScript里是换行,就是n,直接执行
Java菜鸡才知道在Java里u000a是换行,相当于在源码里直接按一下回车键,后面的代码都换行了
十五:
Answer: The javascript will execute.
先HTML解码,得到
在href中由URL模块处理,解码得到
javascript:u0061u006cu0065u0072u0074(15)识别JS协议,然后由JS模块处理,解码得到
javascript:alert(15)最后被执行
总结:


