nemesida-waf/waf-bypass

GitHub: nemesida-waf/waf-bypass

一款开源的 WAF 有效性检测工具,通过多类型攻击 payload 自动化测试 WAF 的误报与漏报情况。

Stars: 1503 | Forks: 186

# WAF Bypass Tool WAF Bypass Tool 是一款开源工具,用于使用预定义和可自定义的 payload 来分析任何 WAF 的误报和漏报安全性。在攻击者之前检查您的 WAF。WAF Bypass Tool 由 Nemesida WAF 团队在社区的参与下开发。 ![WAF Bypass Tool](https://static.pigsec.cn/wp-content/uploads/repos/cas/d8/d8e089c11a48f96ed8a059040995e16fe41099e0380bf8ea5c5e45fe19dc7242.png) ## 请勿用于非法用途 严禁将其用于任何非法目的。请遵守法律。对于使用本软件可能带来的相关风险,我们概不负责。 ## 如何运行 ### 使用 Docker 运行 最新版本的 waf-bypass 始终可以通过 [Docker Hub](https://hub.docker.com/r/nemesida/waf-bypass) 获取。可以使用以下命令轻松拉取:

# docker pull nemesida/waf-bypass

# docker run nemesida/waf-bypass --host='example.com'

### 使用 pipx 运行


# pipx install git+https://github.com/nemesida-waf/waf-bypass.git

# <pipx bin dir>/waf-bypass

### 直接从源代码使用 CLI 运行


# git clone https://github.com/nemesida-waf/waf_bypass.git /opt/waf-bypass/

# python3 -m pip install -r /opt/waf-bypass/requirements.txt

# python3 /opt/waf-bypass/main.py --host='example.com'

#### 选项

- '--proxy' (--proxy='http://proxy.example.com:3128') - 该选项允许指定要连接的目标,而不是主机。
- '--header' (--header 'Authorization: Basic YWRtaW46YWRtaW4=' --header 'X-TOKEN: ABCDEF') - 该选项允许指定随所有请求一起发送的 HTTP header(例如用于身份验证)。允许多次使用。
- '--user-agent' (--user-agent 'MyUserAgent 1/1') - 该选项允许指定随所有请求一起发送的 HTTP User-Agent,除非 payload 设置了 ("USER-AGENT")。
- '--block-code' (--block-code='403' --block-code='222') - 该选项允许您指定当 WAF 被拦截时预期的 HTTP 状态码。(默认值为 403)。允许多次使用。
- '--threads' (--threads=15) - 该选项允许指定并行扫描线程数(默认值为 10)。
- '--timeout' (--timeout=10) - 该选项允许指定请求处理超时时间(以秒为单位)。(默认值为 30)。
- '--exclude-dir' - 排除 payload 目录 (--exclude-dir='SQLi,XSS')。
- '--json-format' - 该选项允许您以 JSON 格式显示工作结果(对于将该工具与安全平台集成非常有用)。如果未指定该选项,输出将采用表格格式(默认格式)。
- '--details' - 显示误报和漏报的 payload。与 --json-format 选项不兼容。
- '--no-progress' - 不显示进度条。
- '--curl-replay' - 显示 cURL 命令以重现误报、漏报或失败的请求。与 --json-format 选项不兼容。

## JSON 格式

JSON 输出规范示例:


{

  "TARGET": "https://example.com", // 由 --host 选项定义

  "PROXY": {},                     // 由 --proxy 选项定义

  "HEADERS": {                     // 由 --header 选项定义

    "User-Agent": ""

  },

  "BLOCK-CODE": [                  // 由 --block-code 选项定义

    ...

  ],

  "THREADS": 50,                   // 由 --threads 选项定义

  "TIMEOUT": 30,                   // 由 --timeout 选项定义

  "EXCLUDE-DIR": [                 // 由 --exclude-dir 选项定义

    ...

  ],

  "FAILED": {                      // 处理状态为失败的请求

    "MFD/7.json": {

      "BODY": "WBHTTPSConnectionPool(host='example.com', port=443): Read timed out. (read timeout=1)"

    },

    ...

  },

  "PASSED": {                      // 通过的请求

    "UWA/3.json": {

      "URL": "403 RESPONSE CODE"

    },

    ...

  },

  "FALSED": {                      // 处理状态为误报的请求

    ...

  },

  "BYPASSED": {                    // 处理状态为漏报的请求

    "UWA/26.json": {

      "URL": "200 RESPONSE CODE"

    },

    ...

  },

  "TestRequest": {                // 具有处理状态的测试请求,不包括通过的请求

    "FAILED": {},

    "FALSED": {

        "UWA/3.json": {

        "URL": "403 RESPONSE CODE"

        },

        ...

    }

    

  },

  "CURL": {                       // 用于重现误报和漏报请求的 cURL 命令

    "FALSED": {},

    "BYPASSED": {

      "UWA/26.json": {

        "URL": "curl -X GET -H 'Accept: */*' -H 'Accept-Encoding: gzip, deflate' -H 'Connection: keep-alive' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36' 'https://example.com/do.php#.png'"

      },

      ...

    }

  }

}

## Payload

根据目的不同,payload 位于相应的文件夹中:

- FP - 误报 payload
- API - API 测试 payload
- CM - 自定义 HTTP Method payload
- GraphQL - GraphQL 测试 payload
- LDAP - LDAP 注入 payload
- LFI - 本地文件包含 payload
- MFD - multipart/form-data payload
- NoSQLi - NoSQL 注入 payload
- OR - 开放重定向 payload
- RCE - 远程代码执行 payload
- RFI - 远程文件包含 payload
- SQLi - SQL 注入 payload
- SSI - 服务端包含 payload
- SSRF - 服务端请求伪造 payload
- SSTI - 服务端模板注入 payload
- UWA - 非授权访问 payload
- XSS - 跨站脚本攻击 payload

### 编写您自己的 payload

构建 payload 时,会使用以下 zone、method 和选项:

- URL - 请求的路径
- ARGS - 请求的查询参数
- BODY - 请求的 body
- COOKIE - 请求的 cookie
- USER-AGENT - 请求的 user-agent
- REFERER - 请求的 referer
- HEADER - 请求的 header
- METHOD - 请求的 method
- BOUNDARY - 指定请求 boundary 的内容。仅适用于 MFD 目录中的 payload。
- ENCODE - 除了 payload 本身的编码外,指定 payload 编码的类型(Base64HTML-ENTITYUTF-16)。多个值以空格分隔(例如 Base64 UTF-16)。仅适用于 ARGSBODYCOOKIEHEADER zone。不适用于 API 和 MFD 目录中的 payload。与 JSON 选项不兼容。
- JSON - 指定请求的 body 应为 JSON 格式
- BLOCKED - 指定请求是否应被拦截(FN 测试)或不被拦截(FP 测试)

除下文描述的某些情况外,各个 zone 之间彼此独立并单独进行测试(即如果指定了 2 个 zone - 脚本将发送 2 个请求 - 依次检查第一个和第二个 zone)。

对于 zone,您可以使用 %RND% 后缀,它允许您生成一个由 6 个字母和数字组成的任意字符串。(例如:param%RND=my_payloadparam=%RND%A%RND%B)

您可以创建自己的 payload,为此,请在“/payload/”文件夹中创建您自己的文件夹,或者将 payload 放在现有的文件夹中(例如:“/payload/XSS”)。允许的数据格式为 JSON。

#### API 目录

位于此目录中的 API 测试 payload 会自动附加 'Content-Type: application/json' header。

#### MFD 目录

对于位于此目录中的 MFD (multipart/form-data) payload,您必须指定 BODY(必填)和 BOUNDARY(可选)。如果未设置 BOUNDARY,它将自动生成(在这种情况下,只能为 BODY 指定 payload,而不包含额外数据('... Content-Disposition: form-data; ...')。

如果指定了 BOUNDARY,则 BODY 的内容必须按照 RFC 进行格式化,但这允许在 BODY 中包含由 BOUNDARY 分隔的多个 payload。

此目录中允许使用其他 zone(例如:URLARGS 等)。无论 zone 为何,所有请求都会添加 'Content-Type: multipart/form-data; boundary=...' header。
标签:Blue Team, CISA项目, Docker, GitHub项目, Homebrew安装, Python, WAF测试, Web安全, 安全防御评估, 无后门, 蓝队分析, 请求拦截, 逆向工具