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 请求信息维度
- 请求行:URI、方法、协议版本
- 首部字段:Host、UA、Referer、X-Forwarded-For等
- 请求体内容
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. 常用绕过工具
- 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错误配置导致目录穿越
/files../var/www/html/admin -
Apache URI解析问题(CVE-2021-41773,CVE-2021-42013)
/icons/.%2e/admin /icons/.%%32%65/admin -
Node.js URI解析问题(CVE-2017-14849)
/static/foo/etc/passwd -
Jetty URI绕过(CVE系列)
/%2e/WEB-INF/web.xml /static?/%2557EB-INF/web.xml /a/b/..%00/c/d/..%00/WEB-INF/web.xml -
Java getRequestURI()绕过
//download?filename=%2e%2e/WEB-INF/web.xml
6.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. 防御建议
- 实施多层防御策略
- 统一各组件对请求的解析逻辑
- 严格验证所有输入
- 使用标准化的URI处理函数
- 定期更新服务器和框架版本
- 实施最小权限原则