403bypass问题简析
字数 1828 2025-08-20 18:18:04

HTTP 403 Forbidden 绕过技术全面解析

1. HTTP 403 状态码基础

HTTP 状态码 403 Forbidden 表示服务器理解请求但拒绝授权访问,通常是由于安全策略限制导致的。与401 Unauthorized不同,403表示用户身份已验证但权限不足。

2. 403 限制的常见场景

2.1 单节点场景

  • 服务器直接处理访问控制
  • Web应用程序自身的安全策略
  • 典型流程:
    client -> webserver
    GET / -> /index.html 200
    GET /admin -> 安全规则 -> 403
    

2.2 多节点场景

  • 代理服务器处理访问控制
  • 典型流程:
    client -> proxy -> webserver
    GET / -> 安全规则 -> 转发 -> /index.html 200
    GET /admin -> 安全规则 -> 禁止访问 403
    

3. 403 绕过技术分类

3.1 请求方法绕过

  • 示例:将GET改为POST或其他方法
  • 案例:https://portswigger.net/web-security/access-control/lab-method-based-access-control-can-be-circumvented

3.2 Host头绕过

  • 后端基于Host做权限划分
  • 修改Host字段为允许的值(如localhost)
  • 案例:https://portswigger.net/web-security/host-header/exploiting/lab-host-header-authentication-bypass

3.3 Referer头绕过

  • 通过管理员操作触发敏感接口
  • 仅验证Referer字段
  • 案例:https://portswigger.net/web-security/access-control/lab-referer-based-access-control

3.4 X-Original-URL字段绕过

  • 多节点场景下代理服务器配置限制
  • 后端框架支持X-Original-URL字段
  • 案例:https://portswigger.net/web-security/access-control/lab-url-based-access-control-can-be-circumvented

4. 安全策略分析维度

4.1 请求信息维度

  1. 请求行:URI、方法、协议版本
  2. 首部字段:Host、UA、Referer、X-Forwarded-For等
  3. 请求体内容

4.2 服务器安全策略示例(Nginx)

# 基于请求方法
location /admin {
    if ($request_method !~ ^POST$) {
        return 405;
    }
}

# 基于URI
location /admin { return 403; }
location = /flag/ { return 403; }

# 基于协议版本
if ($server_protocol ~ "HTTP/1.0") {
    return 426;
}

# 基于Host头
location /admin {
    if ($host != "localhost") {
        return 403;
    }
}

# 基于IP
location /admin {
    allow 127.0.0.1/24;
    deny all;
}

# URI重写
location /admin {
    rewrite ^/admin/(.*)$ /other/admin/$1 break;
}

4.3 程序安全策略示例(PHP)

// 基于请求方法
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Allow: POST');
    header('HTTP/1.1 405 Method Not Allowed');
    exit;
}

// 基于URI
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($uri === '/admin') {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

// 基于请求参数
if (empty($_GET['api_key']) || $_GET['api_key'] !== 'expected_value') {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

// 基于协议版本
if ($_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1') {
    header('HTTP/1.1 426 Upgrade Required');
    exit;
}

// 基于Host头
$allowedHosts = ['example.com', 'www.example.com'];
if (!in_array($_SERVER['HTTP_HOST'], $allowedHosts)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access denied.');
}

// 基于IP
$allowedIPs = ['127.0.0.1'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

5. 常用绕过工具

  1. byp4xx: https://github.com/lobuhi/byp4xx
  2. bypass-403: https://github.com/iamj0ker/bypass-403
  3. Burpsuite_403bypasser: https://github.com/sting8k/BurpSuite_403Bypasser
  4. 403bypasser: https://github.com/yunemse48/403bypasser

6. 特殊漏洞场景

6.1 单节点漏洞

  1. Nginx错误配置导致目录穿越

    /files../var/www/html/admin
    
  2. Apache URI解析问题(CVE-2021-41773,CVE-2021-42013)

    /icons/.%2e/admin
    /icons/.%%32%65/admin
    
  3. Node.js URI解析问题(CVE-2017-14849)

    /static/foo/etc/passwd
    
  4. Jetty URI绕过(CVE系列)

    /%2e/WEB-INF/web.xml
    /static?/%2557EB-INF/web.xml
    /a/b/..%00/c/d/..%00/WEB-INF/web.xml
    
  5. Java getRequestURI()绕过

    //download?filename=%2e%2e/WEB-INF/web.xml
    

6.2 多节点漏洞

  1. 请求走私利用解析差异
  2. URI解析不一致问题
    • Nginx与后端框架(Node/Flask)对特殊字节处理差异
    • 示例:
      GET /admin[0xa0] -> Nginx可能放行,后端可能解析为/admin
      
    • 特殊字节处理表:
    Web框架 版本 处理的特殊字节
    Flask 3.0.2 \x09 \x0a \x0b \x0c \x0d \x20
    Node.js Express 4.18.3 \x09 \x0c \x20 \xa0

7. 防御建议

  1. 实施多层防御策略
  2. 统一各组件对请求的解析逻辑
  3. 严格验证所有输入
  4. 使用标准化的URI处理函数
  5. 定期更新服务器和框架版本
  6. 实施最小权限原则

8. 参考资源

  1. Exploiting HTTP Parsers Inconsistencies
  2. PortSwigger Access Control Labs
  3. Host Header Authentication Bypass
  4. Referer-based Access Control
  5. URL-based Access Control Bypass
HTTP 403 Forbidden 绕过技术全面解析 1. HTTP 403 状态码基础 HTTP 状态码 403 Forbidden 表示服务器理解请求但拒绝授权访问,通常是由于安全策略限制导致的。与401 Unauthorized不同,403表示用户身份已验证但权限不足。 2. 403 限制的常见场景 2.1 单节点场景 服务器直接处理访问控制 Web应用程序自身的安全策略 典型流程: 2.2 多节点场景 代理服务器处理访问控制 典型流程: 3. 403 绕过技术分类 3.1 请求方法绕过 示例:将GET改为POST或其他方法 案例: https://portswigger.net/web-security/access-control/lab-method-based-access-control-can-be-circumvented 3.2 Host头绕过 后端基于Host做权限划分 修改Host字段为允许的值(如localhost) 案例: https://portswigger.net/web-security/host-header/exploiting/lab-host-header-authentication-bypass 3.3 Referer头绕过 通过管理员操作触发敏感接口 仅验证Referer字段 案例: https://portswigger.net/web-security/access-control/lab-referer-based-access-control 3.4 X-Original-URL字段绕过 多节点场景下代理服务器配置限制 后端框架支持X-Original-URL字段 案例: https://portswigger.net/web-security/access-control/lab-url-based-access-control-can-be-circumvented 4. 安全策略分析维度 4.1 请求信息维度 请求行:URI、方法、协议版本 首部字段:Host、UA、Referer、X-Forwarded-For等 请求体内容 4.2 服务器安全策略示例(Nginx) 4.3 程序安全策略示例(PHP) 5. 常用绕过工具 byp4xx: https://github.com/lobuhi/byp4xx bypass-403: https://github.com/iamj0ker/bypass-403 Burpsuite_ 403bypasser: https://github.com/sting8k/BurpSuite_ 403Bypasser 403bypasser: https://github.com/yunemse48/403bypasser 6. 特殊漏洞场景 6.1 单节点漏洞 Nginx错误配置导致目录穿越 Apache URI解析问题(CVE-2021-41773,CVE-2021-42013) Node.js URI解析问题(CVE-2017-14849) Jetty URI绕过(CVE系列) Java getRequestURI()绕过 6.2 多节点漏洞 请求走私利用解析差异 URI解析不一致问题 Nginx与后端框架(Node/Flask)对特殊字节处理差异 示例: 特殊字节处理表: | Web框架 | 版本 | 处理的特殊字节 | |---------|------|----------------| | Flask | 3.0.2 | \x09 \x0a \x0b \x0c \x0d \x20 | | Node.js Express | 4.18.3 | \x09 \x0c \x20 \xa0 | 7. 防御建议 实施多层防御策略 统一各组件对请求的解析逻辑 严格验证所有输入 使用标准化的URI处理函数 定期更新服务器和框架版本 实施最小权限原则 8. 参考资源 Exploiting HTTP Parsers Inconsistencies PortSwigger Access Control Labs Host Header Authentication Bypass Referer-based Access Control URL-based Access Control Bypass