盒子
盒子
文章目录
  1. 常用编码
    1. URL编码
    2. HTML实体编码
    3. 字符编码
    4. JS编码
    5. CSS编码
    6. 复合编码
  2. 绕过技巧
  3. 关于iframe标签
  4. 参考文章

XSS相关技术总结

关于XSS自己也学习了不少了,本文主要把一些XSS构造利用方面的技术总结下吧,本文参考了很多,如有雷同。算我抄你的。

常用编码

URL编码

一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F,“%”的URL编码为%25

HTML实体编码

以&开头,分号结尾的,例如“<”的编码是&lt;空格为&nbsp;

字符编码

十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;”。

例如“<”可以编码十进制字符编码:&#060;,十六进制:&#x3c;,unicode字符编码格式为:&#0060;

JS编码

js提供了四种字符编码的策略

  • 三个八进制数字,如果不够个数,前面补0,例如“e”编码为\145
  • 两个十六进制数字,如果不够个数,前面补0,例如“e”编码为\x65
  • 四个十六进制数字,如果不够个数,前面补0,例如“e”编码为\u0065
  • 对于一些控制字符,使用特殊的C类型的转义风格(例如\n\r

CSS编码

用一个反斜线()后面跟1~6位的十六进制数字,例如e可以编码为“\65”或“65”或“00065”

复合编码

所谓复合编码,也就是说输出的内容输出在多个环境中,例如
<td onclick=”openUrl(add.do?userName=’<%=value%>’);”>11</td>
value的内容首先出现在一个URL中,这个URL在一段javascript中,而javascript代码又是html的一部分。所以解码的顺序就是HTML解码–>js解码–>url解码,那么正确的编码顺序就应该是url编码–>js编码–>html编码。

绕过技巧

  • 首先什么都没过滤的情况,那就直接插入<script>alert(/XSS/)</script>,但是推荐使用img标签,即<img src=1 onerror=alert(1)>或者svg标签<svg/onload=alert(1)>这种方式,因为在Dom型XSS中,innerHTML里面不能以<script>alert(1)</script>方式来触发
  • 输出在一堆JS代码中,则要构造语句,闭合JS代码,使得JS代码能够正常执行,否则无法触发XSS。如果exp在页面中有两处以上回显,可以使用如下类型的构造思路:</script><script>...exp...,在页面中就会有形如</script><script>...exp......</script><script>...exp...的输出.
  • 宽字节:页面编码为gb2312,用%c0吃掉被过滤的引号即%5c,这里原理同宽字节注入。
  • 反斜线:利用反斜线过滤引号,但是还是要把剩下的闭合好。
  • 换行符:%0a主要用于exp出现在了代码注释中。注:在javascript中可以用\连接被换行的一个字符串。

关于iframe标签

  • onload执行js:<iframe onload="alert(1)"></iframe>
  • src执行js:<iframe src="javascript:alert(1)"></iframe>
  • IE下vbscript执行代码:<iframe src="vbscript:msgbox(1)"></iframe>
  • chrome下data协议执行代码:<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
  • chrome下的srcdoc属性:<iframe srcdoc="<script>alert(1)<script>"></iframe>

参考文章