特定标签过滤

过滤了特定标签,但是**输出点在属性中**,可以闭合属性,事件弹窗

过滤指定标签,尝试双写**大小写绕过

寻找全局替换为空标签,进行构造**

HTML5带来了部分**新标签**,容易被开发者忽略,可以进行绕过,如:video标签

事件过滤

开发者过滤了许多HTML标签的事件属性,这时可以进行爆破,**寻找未过滤标签属性**,进行构造弹窗

另外,还有一些标签本身不属于事件属性,但可用于执行JS代码,比如常见的**JavaScript伪协议
click me
**

敏感关键字(字符)过滤

字符串拼接与混淆

JS中的对象方法可通过**数组**的方式进行调用,如调用alert函数,可以使用如下方式:
window‘alert’;

数组下标调用的是函数名字的字符串,既然是字符串,就可以通过拼接的方式进行混淆
window‘al’+’ert’;

btoa():字符串转Base64字符串 atob():Base64字符串还原
windowatob(“YWxl”+”cnQ=”)

还可以用top对象,方法跟window对象一样

编码解码

HTML编码:十进制(a)、十六进制(=)

URL编码:%61**

JavaScript进制编码:
Unicode编码(\u61)、ASCII(String.fromCharcode(97))、八进制(\141)、十六进制(\x61)

CSS进制编码:兼容HTML中的进制表现形式,十进制、十六进制(\61)

JSFuck编码:
使用!+ 6个字符来编写JS程序,某些场景下具有奇效

location.*、window.name

既然开发者会对输入的敏感关键字进行过滤,那么可以将XSS代码放置于**不被浏览器提交至服务端的部分
如:location.、window.name*

location.构造如下: | *因为location.hash的第一个字符是#,所以必须除掉第一个字符
#XSS绕WAF - 图1
image.png

window.name构造如下:
XSS绕WAF - 图3 | 先定义window.name,在执行语句
image.png

过滤 “.”

在JS中,可以使用**with关键字设置变量的作用域**,利用次特性可以绕过对 “.” 的过滤,如下:
with(document)alert(cookie);

过滤 “()”

在JS中,可以通过**绑定错误处理函数**,使用throw关键字传递参数对 “()” 绕过
window.onerror=alert; throw 1;

过滤空格

使用**换行符**0x09、0x10、0x12、0x13、0x0a等字符代替空格绕过
http://example.com/xss.php?input=

在标签名称和第一个属性间可以使用 “/“ 代替空格,如下:
**

svg标签

svg内部的标签和语句遵循的规则是直接继承自xml而不是html
区别在于svg内部的script标签可以**允许存在一部分进制或编码后的字符**(比如实体编码)

**

字符集编码导致的绕过

这里UTF7与US-ASCII现已不适用,这里不讲,如果有兴趣,可以自己去了解
**

宽字节

GBxxx或GBK系列**可以尝试使用
http://example.com/xss.php?input=%d5%22;alert(1);//**
**

一些特殊的字符

由于字符集的原因,在浏览器中会出现如下几种情况:
特定的byte最后会变成特别的字符
特定的byte会破坏紧随其后的文字
特定的byte会被忽略
这些特殊字符可用于浏览器的XSS Auditor、制造基于字符编码的XSS漏洞等方面,如下图所示
完整测试结果
image.png

长度限制

部分输入点会限制输入字符的数量,这时就需要使XSS代码尽量短小精悍,可使用如下方式:
window.name
location.*

代码如下:


第三方库工厂函数
诸如jQuery等第三方JS库大部分都会提供相应的工厂函数
如jQuery中的 “$()”,它会自动构造标签,并且执行其中的代码