前言
某次业务上线常规安全测试,有记录操作的功能,猜测存在存储型XSS漏洞,但由于存在长亭WAF被拦截。遂将之前总结的XSS绕过手段逐一测试了下。
0x01 绕过记录
首先尝试生僻标签绕过,拦截
|
|

利用伪协议,拦截
|
|
添加标签属性进行混淆,比如xmlns属性,拦截
|
|
利用字符串拼接
使用top对象,拦截
top可以连接对象以及属性或函数
|
|
尝试更换函数,拦截
|
|
尝试编码绕过函数黑名单,比如url编码,拦截
|
|
也可尝试其他编码,再尝试前可以先看看eval是否可用
|
|
eval也拦截,尝试将eval进行编码混淆,拦截
|
|
编码尝试了URL编码、Unicode编码、Base64编码、JS8编码、JS16编码、Ascii编码等,当然如果eval可以还可执行外部JS代码,但仍全部拦截。
|
|
尝试windows对象,拦截
|
|
尝试利用赋值
|
|
还是拦截,加点混淆
|
|
仍旧拦截,再变形下
|
|
仍然拦截,变态啊!

尝试利用join函数,拦截
join函数将数组转换成字符串,可以将一些关键字作为数组,再用join连接,转化成字符串
|
|
尝试利用concat函数
concat函数可以用于连接两个或多个数组,还可以合并两个或者多个字符串。
|
|
苍天不负,终于不拦截了!

将代码插入业务

愉快的刷新页面,但是并没有弹窗,发现被实体编码了。
原来测试这么久测试了个寂寞,艹。
0x02 技巧整理
1. 拼接
拼接函数:
|
|
比如:
|
|
2. 编码
常见的编码类型:URL编码、base64编码、Hex编码、JS8编码、JS16编码、Unicode编码、html编码
既然是编码肯定需要一些函数来执行,比如:eval,setTimeout,setInterval,constructor,execScript(IE)等
|
|
3. 字符串
利用正则表达式返回字符串
|
|
利用toString转换字符串。
整数toString(radix)转字符串, 第一个点表示浮点数,第二个点表示调用函数
|
|
alert字符串用parseInt函数,以基数为30转化后为8680439
parseInt('alert',30) == 8680439
toString函数将返回的数字8680439,以基数为30还原
8680439..toString(30) == alert
4. 函数多样调用
|
|
5. 利用数组等的功能函数
|
|
利用拼接数组函数
concat()不仅仅可以用于连接两个或多个数组,还可以合并两个或者多个字符串
|
|
再补充个有些防护过滤了document.cookie可以试下下面的,很爽的
|
|
join()将数组转换成字符串
|
|
6. 新建函数
|
|
7. location
location对象的hash属性用于设置或取得 URL 中的锚部分,比如:http://localhost/1.php#alert(1),我们在控制台输入location.hash,则会返回我们设定的锚,即#alert(1)。
再结合slice()、substr()等字符串处理函数获取字符串
|
|
同样的道理location.search也类似,它可以把部分参数放在?之后
|
|
再比如:
|
|
9. 伪协议
常见的伪协议有:javascript:,vbscript:(IE下),data:
|
|
10. unescape
unescape()函数用于对已经使用escape()函数编码的字符串进行解码,并返回解码后的字符串。
很多会拦截外部url,比如拦截//
|
|
11. with
with用来引用某个特定对象中已有的属性,使用with可以实现通过节点名称的对象调用。
如果.被拦截,可以使用with替代。
|
|
基于DOM的方法创建和插入节点把外部JS文件注入到网页中,也可以应用with。
|
|
12. 过滤括号
|
|
13. 引用外部url
创建和插入节点把外部JS文件注入到网页
|
|
14. 赋值
|
|
15. 黑名单
以alert(1)为例
|
|
16. 标签
16.1. body
|
|
16.2. 其他
|
|
太多了,再次提醒大家好好看看这个网站:
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
17. 事件捕获
|
|
18. 属性
|
|
参考文章
https://www.w2n1ck.com/article/33/
