slicingmelon/gobypass403

GitHub: slicingmelon/gobypass403

一款基于 Go 开发的 WAF/URL 解析器绕过测试工具,通过保留原始请求结构提升绕过验证的效率与可重现性。

Stars: 24 | Forks: 2

# GoByPASS403 一个用 Go 语言开发的强大 WAF(HTTP 403/401)和 URL 解析器绕过工具,旨在测试过程中保留精确的 URL 路径和结构。与 Go 的标准库不同,该工具能够在不进行任何编码或规范化的前提下实现真正的原始 HTTP 请求,从而确保对请求结构的完全控制。此功能由一个全栈 HTTP 客户端(独立于 Go 内部机制)和自定义 URL 解析器提供支持。 ## 作者 **slicingmelon**

[![GitHub](https://img.shields.io/badge/GitHub-slicingmelon-black?logo=github)](https://github.com/slicingmelon)
[![X](https://img.shields.io/badge/X-@pedro__infosec-1DA1F2?logo=x)](https://x.com/pedro_infosec) - [GoByPASS403](#gobypass403) - [功能特性](#features) - [安装](#installation) - [预编译二进制文件(推荐)](#precompiled-binaries-recommended) - [本地构建](#build-locally) - [标准构建](#standard-build) - [GoReleaser](#goreleaser) - [用法](#usage) - [标准 WAF 403/401 绕过](#standard-waf-403401-bypass) - [使用主机列表查找 CDN 绕过](#find-cdn-bypasses-using-a-list-of-hosts) - [截图](#screenshots) - [绕过模块](#bypass-modules) - [1. char_encode](#1-char_encode) - [2. mid_paths](#2-mid_paths) - [3. end_paths](#3-end_paths) - [4. path_prefix](#4-path_prefix) - [5. http_methods](#5-http_methods) - [6. case_substitution](#6-case_substitution) - [7. nginx_bypasses](#7-nginx_bypasses) - [8. haproxy_bypasses](#8-haproxy_bypasses) - [CVE-2021-40346:通过整数溢出的 HTTP 请求走私](#cve-2021-40346-http-request-smuggling-via-integer-overflow) - [CVE-2023-45539:URL 片段 ACL 绕过](#cve-2023-45539-url-fragment-acl-bypass) - [9. unicode_path_normalization](#9-unicode_path_normalization) - [10. unicode_path_truncation](#10-unicode_path_truncation) - [11. headers_scheme](#11-headers_scheme) - [12. headers_ip](#12-headers_ip) - [13. headers_port](#13-headers_port) - [14. headers_url](#14-headers_url) - [15. headers_host](#15-headers_host) - [Findings](#findings) - [Findings Summary](#findings-summary) - [Full Findings Database](#full-findings-database) - [Reproducing Findings](#reproducing-findings) - [Curl PoC Commands](#curl-poc-commands) - [Debug Token System](#debug-token-system) - [Token Structure](#token-structure) - [Debug Token Usage](#debug-token-usage) - [Token Storage and Access](#token-storage-and-access) - [Changelog](#changelog) - [Motivation](#motivation) - [Credits](#credits) ## 功能特性 - **原始 URL 保留**:与使用标准 `net/url` 包的其他 Go 工具不同,GoBypass403 保留确切的 URL 结构,类似于甚至优于 curl 的 `--path-as-is` 或 Burp Engine。这对于需要保持路径遍历和特定 URL 结构的 WAF 绕过测试至关重要。 - **自定义 URL 解析器**:实现专用的 URL 解析器,防止 Go 的默认安全机制干扰绕过尝试,允许测试那些会被规范化的边界情况和安全边界。 - **多种绕过技术**: - 路径操纵(中路径、尾路径) - 大小写替换 - 头部操作(IP、协议、URL、端口) - 字符编码变体 - 等等... - **CDN 绕过支持**:使用主机替换测试 CDN 绕过的特殊功能。 ## 安装 ### 预编译二进制文件(推荐) - Windows、Linux 和 MacOS 构建版本均可使用:[https://github.com/slicingmelon/gobypass403/releases/latest](https://github.com/slicingmelon/gobypass403/releases/latest)。 ### 本地构建 #### 标准构建 ``` git clone https://github.com/slicingmelon/gobypass403.git go mod download go build .\cmd\gobypass403\ ``` #### GoReleaser ``` goreleaser build --snapshot --clean --single-target --output . ``` ## 用法 ``` GoByPASS403 Usage: -u, -url Target URL (example: https://cms.facebook.com/login) -l, -urls-file File containing list of target URLs (one per line) -shf, -substitute-hosts-file File containing a list of hosts to substitute target URL's hostname (mostly used in CDN bypasses by providing a list of CDNs) -m, -module Bypass module (all,path_prefix,mid_paths,end_paths,http_methods,case_substitution,char_encode,nginx_bypasses,haproxy_bypasses,unicode_path_normalization,unicode_path_truncation,headers_scheme,headers_ip,headers_port,headers_url,headers_host). Supports glob patterns with * (e.g., headers*,*bypass*) (Default: all) -em, -exclude-module Exclude specific bypass modules. Supports glob patterns with * (e.g., -em unicode*,*experimental). Takes precedence over -m -o, -outdir Output directory -cr, -concurrent-requests Number of max concurrent requests (Default: 15) -T, -timeout Total timeout (in milliseconds) (Default: 20000) -delay Delay between requests (in milliseconds) (0 means no delay) (Default: 0) -max-retries Maximum number of retries for failed requests (0 means no retries) (Default: 2) -retry-delay Delay between retries (in milliseconds) (Default: 500) -max-cfr, -max-consecutive-fails Maximum number of consecutive failed requests before cancelling the current bypass module (Default: 15) -at, -auto-throttle Enable automatic request throttling (on/off, 1/0) (Default: on) -v, -verbose Verbose output (Default: false) -d, -debug Debug mode with request canaries (Default: false) -mc, -match-status-code Filter results by HTTP status codes (example: -mc 200, 301, 5xx, all). Default: All status codes -mct, -match-content-type Filter results by content type(s) substring (example: -mct application/json,text/html) -min-cl, -min-content-length Filter results by minimum Content-Length (example: -min-cl 100) -max-cl, -max-content-length Filter results by maximum Content-Length (example: -max-cl 5000) -H, -header Custom HTTP header (example: -H "X-My-Header: value"), can be used multiple times -sc, -strict-scheme Only test URLs with the original scheme from input (prevents auto-expansion to http/https) (Default: false) -http2 Enable HTTP2 client (Default: false) -x, -proxy Proxy URL (format: http://proxy:port) (Example: -x http://127.0.0.1:8080) -spoof-header Add more headers used to spoof IPs (example: X-SecretIP-Header,X-GO-IP) -spoof-ip Add more spoof IPs (example: 10.10.20.20,172.16.30.10) -fr, -follow-redirects Follow HTTP redirects -rbps, -response-body-preview-size Maximum number of bytes to retrieve from response body (Default: 1024) -drbs, -disable-response-body-streaming Disables streaming of response body (default: False) (Default: false) -dpb, -disable-progress-bar Disable progress bar (Default: false) -r, -resend Resend the exact request using the debug token (example: -r xyzdebugtoken) -rn, -resend-num Number of times to resend the debugged request (Default: 1) -profile Enable pprof profiler (Default: false) -update-payloads Update payload files to latest version (Default: false) ``` ## 标准 WAF 403/401 绕过 标准命令: ``` gobypass403 -u "https://go-test-webapp.com/admin" -mc "200" gobypass403 -u "https://go-test-webapp.com/admin" -mc "200,500" -cr 10 gobypass403 -u "https://go-test-webapp.com/admin" -mc "mid_paths,nginx_bypasses,headers_ip" -cr 20 -mct "application/json,image/png" ``` 使用目标 URL 列表: ``` gobypass403 -l "targeturls.txt" ``` ## 使用主机列表查找 CDN 绕过 有时你希望在一长串 CDN 中查找绕过方法,并且你知道视频路径始终相同。例如当你想要绕过某个视频或图片的哈希校验时。 // 已省略。后续更新。 ## 屏幕截图 示例结果 1 ![截图 1](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/c69f894ad7212828.jpg) ## 绕过模块 下一节详细描述了每个绕过模块。每个模块实现了一组独特的技术,用于发现 WAF、ACL、反向代理和 Web 服务器配置错误中的特定漏洞。 ## 1. char_encode `char_encode` 模块实现了全面的字符编码技术,用于绕过 WAF 模式匹配。它通过五种不同的策略系统地生成载荷:URL 编码。 该模块实现了五种核心编码技术: 1. **最后一个字符编码**:对整个路径的最后一个字符进行编码。 2. **第一个字符编码**:对路径(首个 `/` 之后的第一个字符)进行编码。 3. **最后一个片段字符编码**:对最后一个路径片段中的每个字符单独编码。 4. **完整路径字符编码**:对完整路径中的每个字符单独编码。 5. **完整片段编码变体**:对完整路径片段中的所有字符进行编码,生成完全 URL 编码的片段。 对于每种技术,都会生成三种编码变体: - 单次编码:`%61`(标准百分号编码) - 双重编码:`%2561`(对百分号本身编码) - 三重编码:`%252561`(对百分号编码两次) 对于 `https://example.com/admin/test` 的示例载荷: ``` # 字符逐项编码 /admin/test → /admi%6e/test # Last character encoded /admin/test → /%61dmin/test # First character encoded /admin/test → /admin/t%65st # Character in last segment encoded # 完整片段编码 /admin/test → /%61%64%6d%69%6e/test # Full "admin" segment encoded /admin/test → /admin/%74%65%73%74 # Full "test" segment encoded /admin/test → /%61%64%6d%69%6e/%74%65%73%74 # Both segments fully encoded ``` 所有变体在存在查询字符串时均保留原始查询字符串。特殊字符如 `?` 和 `#` 会进行适当的百分号编码以保留查询参数。 ## 2. mid_paths `mid_paths` 模块使用预定义的载荷列表(`internal_midpaths.lst`)注入路径遍历序列和特殊字符组合。 对于 URL `/a/b`,该模块创建以下变体: 1. **路径前部**: - `PAYLOAD/a/b` - `/PAYLOAD/a/b` 2. **在每个片段**: - `/PAYLOADa/b`(与第一个片段开头融合) - `/aPAYLOAD/b`(与第一个片段结尾融合) - `/a/PAYLOADb`(与第二个片段开头融合) - `/a/bPAYLOAD`(与第二个片段结尾融合) 3. **在每个斜杠之后**: - `/a/PAYLOAD/b`(插入在斜杠之后) 每个变体都会生成适当的路径规范化处理。该模块仔细管理路径片段中的特殊字符,在必要时生成带有百分号编码 `?` 和 `#` 的附加变体。 ## 3. end_paths `end_paths` 模块将一组预定义的后缀(`internal_endpaths.lst`)追加到 URL 路径末尾。该技术针对路径规范化漏洞和片段处理问题。 对于 URL `https://example.com/admin`,该模块生成: 1. **标准后缀变体**: - `/admin/SUFFIX` - `/admin/SUFFIX` 2. **直接追加变体**(当基础路径不是根 `/` 且后缀不以字母开头时): - `/adminSUFFIX` - `/adminSUFFIX/` 常见后缀包括: - 路径遍历序列:`..;/`、`../`、`./` - 特殊字符:`;`、`:`、`%20` - 常见扩展名:`.json`、`.php~`、`.bak` 该模块保留原始查询字符串,并对特殊字符进行适当的百分号编码以保持请求完整性。 ## 4. path_prefix `path_prefix` 模块使用特定字节模式对路径片段进行前缀处理,以绕过安全检查。它对 URL 片段依次添加 ASCII 控制字符、特殊字符和字面字符 `x`。 对于每个相关字节值,模块创建三种不同变体: 1. **虚拟片段前缀(单字节)**: - 添加一个新的首片段,包含该字节值 - 示例:`/admin` → `/[b1]/admin` 或 `/%XX/admin` 2. **现有片段前缀(单字节)**: - 将字节前缀添加到每个现有片段 - 示例:`/admin/login` → `/[b1]admin/login` 或 `/%XXadmin/login` 3. **现有片段前缀(双字节)**: - 将字节对前缀添加到每个现有片段 - 示例:`/admin/login` → `/[b1b2]admin/login` 或 `/%XX%YYadmin/login` 每个字节值均以原始字节(安全时)和百分号编码形式应用,以覆盖尽可能多的潜在绕过向量。 ## 5. http_methods `http_methods` 模块测试来自预定义列表(`internal_http_methods.lst`)的各种标准和非标准 HTTP 方法。HTTP 方法切换是一种众所周知的绕过技术,可绕过仅过滤特定方法的 WAF 规则。 对于每种方法,模块生成: 1. **基础方法变体**: - 使用原始 URL 的路径和查询字符串 - 示例:`OPTIONS /admin` 而非 `GET /admin` 2. **Content-Length 处理**: - 对于通常需要请求体的方法(POST、PUT、PATCH、DELETE),添加 `Content-Length: 0` 头 - 示例:`GET /admin` 附带 `Content-Length: 0` 3. **查询参数重定位(仅 POST)**: - 对于带有查询参数的 POST 请求,创建以下变体: - 从 URL 中移除查询字符串 - 将参数移至请求体 - 设置适当的内容类型头 - 示例:`POST /admin?id=1` 变为 `POST /admin`,请求体为 `id=1` ## 6. case_substitution `case_substitution` 模块对 WAF 和 ACL 中的大小写敏感模式匹配应用有针对性的大小写操作。 它实现了四种不同的大小写操作策略: 1. **末尾字符大小写反转**: - 仅将路径的最后一个字母大写(如果是小写) - 示例:`/admin` → `/admiN` 2. **HTTP 方法大小写操作**: - 将 HTTP 方法大写(例如 `"GET"`、`"POST"`) - 示例:`get /admin` → `GET /admin` 3. **逐字符大小写反转**: - 对路径中的每个字母单独反转大小写 - 示例:`/admin` → `/Admin`、`/aDmin`、`/adMin`、`/admIn` 等 4. **完整路径大写转换**: - 将整个路径字符串转换为大写 - 示例:`/admin` → `/ADMIN` 应用这些大小写操作时保留所有原始查询参数。 ## 7. nginx_bypasses `nginx_bypasses` 模块是一组全面的技术,针对多个 Web 框架和服务器类型中的服务器端解析不一致问题。虽然以 Nginx 命名,但它也适用于 Flask、Spring Boot 和 Node.js 等平台。 该模块实现了多种专门的绕过向量: 1. **框架特定字节模式**: - Flask 绕过:用于载荷中的坏字节(`0x85, 0xA0, 0x1F, 0x1E, 0x1D, 0x1C, 0x0C, 0x0B`),可触发路径规范化绕过 - Spring Boot 绕过:利用制表符(`0x09`)和分号(`;`)的解析怪癖 - Node.js 绕过:针对 Node.js 不同处理的特定字符(`0xA0, 0x09, 0x0C`) 2. **战略性字符插入**: - 在关键位置插入原始和百分号编码的特殊字节: - 路径末尾:`/admin[char]` - 尾随斜杠后:`/admin/[char]` - 路径开头:`/[char]admin` - 每个片段之后:`/segment1[char]/segment2` - 每个片段之前:`/segment1/[char]segment2` - 第一个字符之后:`/s[char]egment1` 3. **请求拆分技术**: - 使用换行符进行 HTTP 协议混淆: - 注入 `%0A` 后跟 HTTP 版本字符串(`HTTP/1.1`、`HTTP/1.0`、`HTTP/2.0`、`HTTP/0.9`) - 示例:`/admin%0AHTTP/1.1` 4. **路由操纵攻击**: - 复杂的请求走私向量: - 结合换行符、HTTP 版本和备用 URI - 示例:`/admin%0AHTTP/1.1%0Ahttp://localhost/admin` - 主机变体: - 测试多个备用主机:`localhost`、`127.0.0.1`,并结合不同端口 - 与显式 Host 头部操作结合 5. **协议处理器利用**: - 测试不同的 URI 方案(`http://`、`https://`、`file://`、`gopher://`) - 针对代理直通漏洞和协议处理器配置错误 该模块代表了最全面的路径操纵测试套件之一,旨在发现: - HTTP 请求解析不一致 - 代理处理问题 - 框架特定的路径规范化 - 反向代理配置 - 负载均衡器行为 - 服务器端协议处理错误 每个载荷都会仔细生成以保持正确的 URL 结构,并确保原始查询参数正确保留。 以下截图显示了由 `nginx_bypasses` 模块生成的模糊请求示例: ![截图 431359279](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/de6a406cf5212831.png) ![截图 431359726](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/50de29d603212834.png) ## 8. haproxy_bypasses `haproxy_bypasses` 模块针对 HAProxy 配置中的特定漏洞实现利用技术,涵盖影响不同版本和功能的两个关键 CVE。 ### CVE-2021-40346:通过整数溢出的 HTTP 请求走私 此漏洞利用 HAProxy 头部解析机制中的整数溢出实现 HTTP 请求走私,允许攻击者绕过访问控制和路由限制。 **攻击机制**: - 创建带有 256+ 字符名称的畸形 `Content-Length` 头部(例如 `Content-Length0aaa...`) - 利用头部解析中的整数溢出进行请求走私 - 使用公共端点作为掩护,同时针对被限制路径进行走私请求 **载荷结构**: ``` POST /public HTTP/1.1 Host: target.com Content-Length0aaaa...[252 more 'a' chars]: Content-Length: 89 Connection: close GET /admin HTTP/1.1 h:GET /public HTTP/1.1 Host: target.com ``` **关键特性**: - 测试多个公共端点(`/`、`/robots.txt`、`/favicon.ico` 等)作为入口点 - 每个载荷连续发送两次(走私工作需要两次请求) - 针对与 HAProxy 处理不同的后端服务器 ### CVE-2023-45539:URL 片段 ACL 绕过 此漏洞利用 HA 对 URL 片段(`#`)在访问控制列表(ACL)匹配中的不当处理,允许攻击者绕过 `path_end`、`path_beg` 和 `path_reg` 规则。 **攻击向量**: 1. **扩展名绕过(`path_end` 规则)**: - `/admin#.png` # 绕过 `.png` 的 `path_end` 规则 - `/restricted#.css` # 绕过 `.css` 的 `path_end` 规则 - `/api/secret#.json` # 绕过 `.json` 的 `path_end` 规则 2. **路径前缀绕过(`path_beg` 规则)**: - `/admin#public` # 绕过 `public` 的 `path_beg` 规则 - `/restricted#guest` # 绕过 `guest` 的 `path_beg` 规则 - `/api/private#api` # 绕过 `api` 的 `path_beg` 规则 3. **多级片段注入**: - `/api/v1#.xml/users` # 片段注入在路径段之间 - `/admin#static/panel` # 复杂路由操纵 4. **高级技术**: - 双片段绕过:`/admin#public#.png` - 查询参数干扰:`/admin#.css?debug=true` - 路径遍历组合:`/admin#../file.txt` **漏洞上下文**: 根据 [HAProxy 变更日志](https://www.mail-archive.com/haproxy%40formilux.org/msg43861.html),此漏洞由 Seth Manesse 和 Paul Plasil 报告。问题允许类似 `index.html#.png` 的请求匹配检查 `path_end .png` 的 ACL 规则,导致错误的路由决策。 **影响**: - 绕过基于文件扩展名的 WAF 过滤规则 - 绕过依赖路径匹配的路由逻辑 - 利用 HAProxy 路径解析与 ACL 评估之间的不一致 **参考**: - [CVE-2021-40346 分析](https://jfrog.com/blog/critical-vulnerability-in-haproxy-cve-2021-40346-integer-overflow-enables-http-smuggling/) - [CVE-2023-45539 技术细节](https://www.haproxy.com/blog/december-2023-cve-2023-45539-haproxy-accepts-as-part-of-the-uri-component-fixed) - [HAProxy 2.8.2 安全更新](https://www.mail-archive.com/haproxy%40formilux.org/msg43861.html) - [PoC 游乐场](https://github.com/slicingmelon/HAProxy-CVE-2023-45539-PoC) 该模块为两种漏洞生成全面的载荷。CVE-2021-40346 通常产生约 14 个 HTTP 走私变体,CVE-2023-45539 生成 150 多个基于片段的绕过尝试,针对不同的 ACL 模式和注入点。 ## 9. unicode_path_normalization `unicode_path_normalization` 模块生成使用 Unicode 字符变体的载荷,这些变体在规范化后会转换为标准 ASCII 字符,针对在请求处理过程中执行 Unicode 规范化的系统。该模块使用 `unicode_normalization_map.json`,其中包含从 ASCII 到 Unicode 字符的映射,这些字符在规范化后会还原为原始 ASCII 字符。 该模块实现了五种核心绕过技术: 1. **双斜杠变体**: - 在路径分隔符位置插入额外的斜杠(例如 `/admin//login`) - 创建所有斜杠都加倍(例如 `//admin//login`)的变体 2. **完整路径字符变体**: - 系统地用 Unicode 等效字符替换路径字符 - 测试单次出现和全部出现替换 - 为每次替换生成三种形式: - 原始 Unicode:`/admin/logEn` - URL 编码:`/admin/log%EF%BC%A5n` - UTF-8 字节:`/admin/log\\xEF\\xBC\\xA5n` 3. **路径片段字符变体**: - 针对单个路径片段(例如 `admin`、`login`) - 系统替换片段的第一个和最后一个字符 - 逐个替换片段中的每个字符(限制以防止爆炸) 4. **Unicode 斜杠插入**: - 使用斜杠字符(`/`)的 Unicode 等效形式 - 插入到现有斜杠旁边:`/admin/(unicode_slash)login` - 测试原始 Unicode、URL 编码和 UTF-8 字节形式 5. **完整片段 Unicode 变体**: - 创建完全 Unicode 化的路径片段 - 示例:`/admin` → `/ªᵈᵐⁱⁿ`(原始)或 `/%C2%AA%E1%B5%88%E1%B5%90%E1%B5%A2%E2%81%BF`(编码) - 生成替换单个片段和全部片段的载荷 所有变体在存在查询字符串时均保留原始查询字符串。该模块对在初始 WAF 验证后执行 Unicode 规范化的系统有效,允许 Unicode 变体在处理过程中被规范化为其 ASCII 等效形式,从而绕过模式匹配。 ## Unicode 路径标准化 `unicode_path_truncation` 模块生成使用 Unicode 字符变体的载荷,这些变体通过字节截断(`char & 0xFF`)转换为标准 ASCII 字符,针对在请求处理过程中执行字节级截断的系统。该模块使用 `unicode_truncation_map.json`,其中包含从 ASCII 到 Unicode 字符的映射,这些字符在提取低字节后会截断为原始 ASCII 字符。 **与规范化的关键区别**: - **技术**:字节截断(`char & 0xFF`)而非 Unicode 规范化 - **目标范围**:所有字节(0x00-0xFF),而不仅仅是可打印 ASCII(0x20-0x7F) - **漏洞**:应用程序将 Unicode 字符截断为低字节值 - **JSON 结构**:使用 `"form": "TRUNCATION"` 而非 `"NFKC"` 等规范化形式 该模块实现了与规范化模块相同的五种核心绕过技术: 1. **双斜杠变体**: - 在路径分隔符位置插入额外的斜杠(例如 `/admin//login`) - 创建所有斜杠都加倍(例如 `//admin//login`)的变体 2. **完整路径字符变体**: - 用截断后仍还原为原始字符的 Unicode 等效字符替换路径字符 - 测试单次出现和全部出现替换 - 为每次替换生成三种形式: - 原始 Unicode:`/admin/logĀn`(其中 Ā 截断为 'a') - URL 编码:`/admin/log%C4%80n` - UTF-8 字节:`/admin/log\\xC4\\x80n` 3. **路径片段字符变体**: - 针对单个路径片段(例如 `admin`、`login`) - 系统替换片段的第一个和最后一个字符 - 逐个替换片段中的每个字符(限制以防止爆炸) 4. **Unicode 斜杠插入**: - 使用截断后仍为 0x2F 的斜杠 Unicode 等效形式 - 插入到现有斜杠旁边:`/admin/(unicode_slash)login` - 测试原始 Unicode、URL 编码和 UTF-8 字节形式 5. **完整片段 Unicode 变体**: - 使用截断映射创建完全 Unicode 化的路径片段 - 示例:`/admin` → `/Āďṁīṅ`(原始)或 `/%C4%80%C4%8F%E1%B9%81%C4%AB%E1%B9%85`(编码) - 生成替换单个片段和全部片段的载荷 **示例截断映射**: ``` { "ascii": 97, "char": "a", "mappings": [ { "unicode": "ā", // U+0101 → 0x01 (truncates to 'a') "utf8_bytes": "\\xC4\\x81", "url_encoded": "%C4%81", "form": "TRUNCATION" } ] } ``` **目标系统**: 此技术特别有效于: - 使用遗留字符处理且将 Unicode 截断为单字节的应用程序 - 具有不正确 UTF-8 到 ASCII 转换例程的系统 - 处理 Unicode 字符时执行字节级截断的 Web 服务器或框架 - 在字节级字符验证后执行截断的安全控制 所有变体在存在查询字符串时均保留原始查询字符串。该模块针对与规范化不同的漏洞类别,专注于字节级截断而非 Unicode 标准化,作为对规范化模块的补充,实现全面的 Unicode 基础绕过测试。 ## 10. unicode_path_truncation `headers_scheme` 模块使用自定义 HTTP 标头测试基于协议的绕过,这些标头指示原始协议或请求方案。许多应用程序依赖这些标头进行内部路由决策和安全策略。 该模块通过以下方式操作: 1. 读取两个预定义列表: - `header_proto_schemes.lst`:常见协议指示标头 - `internal_proto_schemes.lst`:要测试的各种协议方案(http、https 等) 2. 生成三类方案载荷: - 标准协议指示器:将大多数标头与每种协议方案配对 - HTTPS 特定标志:设置 `Front-End-Https`、`X-Forwarded-HTTPS` 和 `X-Forwarded-SSL` 等标头为 `on` - 转发标头(RFC 7239):使用标准格式 `proto={scheme}` 这些标头利用以下常见误配置: - 反向代理未正确验证或清理转发的方案信息 - 负载均衡器根据方案标头进行 SSL/TLS 决策 - 应用程序使用方案标头进行条件逻辑或 URL 构造 ## Unicode 路径截断 `headers_ip` 模块是一个强大的 IP 欺骗工具集,利用服务器信任客户端报告 IP 地址进行访问控制决策的方式。这种经常被忽视的绕过技术可以通过操纵基于 IP 的信任关系来绕过 WAF 限制。 关键能力包括: 1. **全面的标头覆盖**: - 测试所有行业标准 IP 报告标头: - `X-Forwarded-For`:代理后客户端 IP 的实际标准 - `X-Real-IP`:Nginx 和许多 CDN 使用的原始客户端 IP - `X-Client-IP`:企业环境中的常见标头 - `X-Originating-IP`:Microsoft 产品和服务使用的标头 - `header_ip_hosts.lst` 中包含的数十个其他供应商特定标头 2. **多源 IP 数据收集**: - 运行时动态 IP 侦察——自动缓存所有解析的 IP、CNAME 和 DNS 记录 - 来自 `internal_ip_hosts.lst` 的预定义 IP 地址列表,针对内部/受信任网络 - 通过 `-spoof-ip` CLI 标志自定义指定 IP(逗号分隔值) - 聚焦高价值目标:localhost、内部网络、云元数据 IP 3. **高级标头操作**: - 通过 `-spoof-header` CLI 标志支持自定义标头以针对特定环境 - 测试标头的原始和规范化(可规范化的)形式 - RFC 7239 Forwarded 标头,带有参数变体:`by=`、`for=` 和 `host=` - 特殊情况的绕过,如 `X-AppEngine-Trusted-IP-Request: 1` 此技术利用了以下架构弱点: - 多层架构中组件之间的信任关系 - 基于 IP 的访问控制列表(ACL)用于管理界面 - 云环境中信任特定内部 IP - WAF 对某些源地址的流量豁免 - 基于客户端 IP 进行路由决策的负载均衡器 ## 11. headers_scheme `headers_port` 模块通过操纵与端口相关的 HTTP 标头来绕过安全控制,这些控制会基于原始客户端端口进行路由或访问决策。 该模块通过以下方式工作: 1. **关键端口相关标头**: - `X-Forwarded-Port`:最广泛认可的端口标头 - `X-Port`:直接端口指定 - `Port`:简单端口标头 - CDN 特定变体,如 `Cdn-Server-Port` 和 `Cdn-Src-Port` - 来自 `header_ports.lst` 的其他标头 2. **战略性端口值**: - 标准 Web 端口:`80`、`443` - 替代 Web 端口:`8080`、`8443`、`3000` - 不太常见的服务端口:`5000`、`5001`、`9080`、`9443` - 从 `internal_ports.lst` 加载的所有值 示例绕过组合: ``` X-Forwarded-Port: 8080 X-Port: 443 Cdn-Src-Port: 9000 X-Protocol-Port: 80 ``` 此技术特别有效于: - 具有端口特定过滤规则的 Web 应用防火墙 - 基于原始客户端端口进行路由的负载均衡器 - 具有基于端口服务路由的微服务架构 - 对特定受信任端口的流量豁免的安全控制 ## 12. headers_ip `headers_url` 模块通过自定义标头实现 URL 路径注入技术,针对使用标头值进行内部路由决策的 Web 应用程序和代理。 关键利用的标头包括: 1. **主要路由标头**: - `X-Original-URL`:许多 WAF 和代理用于 URL 重写的标头 - `X-Rewrite-URL`:Nginx 配置中常见的标头 - `X-Override-URL`:各种代理设置中使用的标头 - `X-Forwarded-URI`:负载均衡器常信任的标头 - `Base-URL`:某些遗留应用程序使用的标头 2. **战略性路径注入技术**: - 根 URI 注入:将请求路径设为 `/`,而将实际目标路径放在标头中 - 父目录遍历:测试目标路径的所有父目录 - 完整 URL 注入:在标头中提供完整的 URL - 混合 URL/路径格式:创建不同格式和编码的变体 3. **CVE-2025-29927 利用**: - 通过关键标头 `x-middleware-subrequest` 绕过 Next.js 中间件 - 生成类似 `middleware`、`middleware:middleware:middleware` 的值 - 创建带有 `src/middleware` 前缀的变体 示例绕过: ``` GET / HTTP/1.1 Host: example.com X-Original-URL: /admin GET / HTTP/1.1 Host: example.com X-Rewrite-URL: /api/users GET /api/public/data HTTP/1.1 Host: example.com X-Override-URL: /api/private/data GET /api/products HTTP/1.1 Host: example.com x-middleware-subrequest: middleware:middleware:middleware ``` 此技术特别有效于: - 配置错误的反向代理和 API 网关 - 具有 URL 重写功能的 Web 应用防火墙 - 在路由请求前处理标头的基于云的 WAF 解决方案 - 存在中间件绕过漏洞的 Next.js 应用程序 ## 13. headers_port `headers_host` 模块利用 URL 主机名与 Host 标头处理之间的差异,结合实时侦察数据生成有针对性的绕过尝试。 关键特性包括: 1. **动态侦察集成**: - 利用工具内置的侦察缓存,收集目标主机的 IP 地址和 CNAME - 根据发现的拓扑结构自动生成载荷 - 支持 IPv4 和 IPv6 地址变体 2. **IPv4/IPv6 服务变体**: - 对于每个发现的 IP(带方案和端口): - 使用 IP 作为 URL 主机,在 Host 标头中使用原始主机名 - 使用原始主机名作为 URL 主机,在 Host 标头中使用 IP - 适当处理端口说明(默认端口与显式端口) - 创建带有正确括号表示法的 IPv6 特定变体(`[IPv6]:port`) 3. **CNAME 基础绕过技术**: - 使用 DNS 侦察中发现的规范名称 - 对每个 CNAME 实施四种策略性变体: - 原始 URL + Host 标头中的 CNAME - CNAME 作为 URL 主机 + Host 标头中的原始主机名 - CNAME 同时用于 URL 主机和 Host 标头 - 递归测试域名后缀(例如 `sub.domain.com` → `domain.com`) 此模块特别适用于: - 内容分发网络(CDN)绕过尝试 - 虚拟主机混淆攻击 - 基于 DNS 的访问控制规避 - 负载均衡器和反向代理配置错误 # 14. headers_url ## 15. headers_host 当 GoBypass403 完成扫描后,它会显示一个全面的结果汇总表,展示所有成功的绕过尝试。结果按智能分组和整理,便于分析: - **分组逻辑**:结果按绕过模块 → HTTP 状态码 → 内容长度分组 - **结果限制**:每组最多显示 5 个结果以保持可读性 - **表格格式**:显示模块名称、curl 命令(截断)、HTTP 状态、内容长度、内容类型、页面标题和服务器信息 - **视觉分隔**:使用虚线分隔各组,便于视觉组织 汇总表提供了成功绕过尝试的快速概览,使安全测试人员能够立即识别哪些技术有效并优先进行进一步调查。 ## Findings 所有扫描结果都存储在本地 SQLite 数据库中,包含每个绕过尝试的详细信息: **每个请求存储的数据**: - **目标详情**:原始 URL、使用的绕过模块、扫描时间戳 - **响应指标**:HTTP 状态码、内容长度、响应时间 **内容分析**:响应标头、主体预览、内容类型、页面标题、服务器信息 - **重现数据**:curl PoC 命令和调试令牌 - **重定向跟踪**:如有适用的重定向 URL **为何选择 SQLite?** 考虑到全面的绕过测试可能生成数百或数千个请求,将所有数据存储在一个结构化的数据库中可以: - 高效查询和过滤结果 - 持久化存储所有尝试的详细信息 - 使用 SQL 查询进行高级分析 - 与外部工具和脚本集成 **访问完整数据**:使用任何 SQLite 浏览器/GUI 工具(如 DB Browser for SQLite、DBeaver 或 SQLiteStudio)探索完整数据集,运行自定义查询,并对所有绕过尝试执行详细分析。 ## 发现摘要 ### 完整发现数据库 每个成功的绕过尝试都包含一个即用型 curl 命令,可精确复现该请求。示例如下: ``` curl -X POST "https://target.com/admin" -H "X-Forwarded-For: 127.0.0.1" ``` 这些 curl 命令具有以下特点: - **精确副本**:成功绕过请求的精确复制品 - **立即可执行**:可用于手动验证 - **同时存储**:在汇总表和 SQLite 数据库中 - **正确转义**:已转义并格式化以便在 shell 中执行 ### 重现发现 GoBypass403 实现了一个自定义的复杂调试令牌系统,用于精确的请求重现和分析。 每个载荷都会生成一个唯一的调试令牌,作为整个请求的压缩指纹。令牌生成过程: 1. **基于种子的生成**:每个载荷获得一个唯一的 4 字节随机 nonce 2. **全面编码**:捕获所有请求组件(方法、标头、主体、URL 等) 3. **高效压缩**:使用 Snappy 压缩 + Base64 编码 4. **索引优化**:常见 HTTP 方法和绕过模块使用字节索引而非完整字符串 #### 令牌结构 ``` [Version][Nonce][Scheme][Host][URI][Method][Headers][BypassModule][Body] │ 1B │ 6B │ Var │ Var │Var│ Var │ Var │ Var │ Var │ ``` - **版本**(1 字节):令牌格式版本 - **Nonce**(6 字节):唯一 4 字节随机标识符 + 长度前缀 - **可变字段**:所有请求组件带有长度前缀 - **最终编码**:`base64(snappy(raw_bytes))` gobypass403 Debug Token Structure #### 调试令牌使用 **用于请求重现**(`-r` 标志): ``` ./gobypass403 -r "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." ``` **在调试模式中**(`-d` 标志): ``` ./gobypass403 -u https://target.com/admin -d ``` 启用调试模式时,每个 HTTP 请求也会包含调试令牌作为自定义标头,使其在请求日志中可见,并便于与结果关联。 **令牌解码过程**: 1. Base64 解码令牌字符串 2. Snappy 解压缩字节 3. 解析结构化二进制格式 4. 重建原始请求 5. 使用相同参数执行请求 #### 令牌存储和访问 - **SQLite 数据库**:所有调试令牌存储在 `debug_token` 列中 - **专属存储**:调试令牌仅在 SQLite 数据库中可用(不在终端输出中) - **持久访问**:扫描结束后令牌仍可用于重现 - **查询支持**:可使用 SQL 查询根据状态码、模块或其他条件查找令牌 示例 SQL 查询以查找调试令牌: ``` SELECT debug_token, curl_cmd, status_code FROM scan_results WHERE status_code = 200 AND bypass_module = 'headers_ip'; ``` 此调试令牌系统实现了精确的请求重现、详细分析以及与其他安全测试工作流的集成。 # Curl PoC 命令 完整的变更日志位于 [CHANGELOG](./CHANGELOG.md)。 # 调试令牌系统 传统的基于 Go 的安全工具在绕过 WAF 时常常遇到困难,因为 Go 的标准库设计为默认安全,会自动规范化 URL 并对特殊字符进行编码。这使得难以测试依赖于特定 URL 结构或字符序列的某些绕过类型。 Go-Bypass-403 通过以下方式解决此问题: 1. 使用自定义 URL 解析器保留原始路径 2. 实现类似 curl 的路径保留 3. 在整个测试过程中保持确切的 URL 结构 4. 允许真正的原始 URL 操作而无需自动清理 5. 市面上可用的最佳类似工具由 [laluka](https://github.com/laluka) 开发,可在以下网址找到:[bypass-url-parser](https://github.com/laluka/bypass-url-parser)。它使用 Python 编写,但每次绕过尝试都使用 curl,因为 curl 支持 `--path-as-is` 来发送原始载荷。不幸的是,由于该工具使用 curl 发送请求,速度极其缓慢。 引用 laluka 的话: ## 更新日志 本工具受到并基于 [laluka 的 bypass-url-parser](https://github.com/laluka/bypass-url-parser) 的启发。所有原始概念和绕过技术的功劳都归他所有。 特别感谢 [laluka](https://github.com/laluka) 开源他的工作以及他实现的广泛绕过技术。 本项目根据 [MIT License](LICENSE) 授权。
标签:401绕过, 403绕过, CDN绕过, CVE-2021-40346, CVE-2023-45539, EVTX分析, Go开发, Go语言, Haproxy绕过, HTTP方法绕过, HTTP请求篡改, HTTP请求走私, IP伪造, Nginx绕过, Scheme伪造, Unicode路径截断, Unicode路径规范化, URL伪造, URL解析, URL路径保持, WAF测试工具, WAF绕过, Web安全, 中路径绕过, 大小写绕过, 字符编码绕过, 安全测试, 开源安全工具, 攻击性安全, 无编码请求, 日志审计, 程序破解, 端口伪造, 结尾路径绕过, 自定义HTTP客户端, 蓝队分析, 请求头伪造, 请求结构控制, 请求走私, 路径前缀绕过, 路径遍历, 逆向工程平台