首页 > 其他分享 >403bypass问题简析

403bypass问题简析

时间:2024-10-25 12:18:27浏览次数:3  
标签:HTTP 请求 admin 安全策略 uri 问题 简析 403 403bypass

就是要打骨折icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247486065&idx=2&sn=b30ade8200e842743339d428f414475e&chksm=c0e4732df793fa3bf39a6eab17cc0ed0fca5f0e4c979ce64bd112762def9ee7cf0112a7e76af&scene=21#wechat_redirect

《Java代码审计》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484219&idx=1&sn=73564e316a4c9794019f15dd6b3ba9f6&chksm=c0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene=21#wechat_redirect

《Web安全》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484238&idx=1&sn=ca66551c31e37b8d726f151265fc9211&chksm=c0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene=21#wechat_redirect

4XX问题

在HTTP协议中,规定多种响应状态码,标志着服务端对消息处理的结果并同时指导客户端的行为,比如101代表消息正在处理同时通信协议切换,200代表消息处理成功,301代表访问的资源改变了位置并通知客户端访问新的位置,400则代表客户端发送的请求消息有误,502代表服务端网关问题,无法访问到目标服务器。

在日常使用web服务过程中,我们可能经常遇到4XX、5XX问题,此时网页上会显示错误页面,并给出可能错误的原因。
今天主要来了解一下4XX问题中比较重要的403问题。

403含义

在HTTP协议中,状态码 403 Forbidden代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。由于请求信息中的部分内容,触发了安全策略,导致服务端拒绝处理。服务器通过配置安全策略,灵活的设置资源的访问权限,最简单的允许登陆的用户访问,禁止游客访问。

在渗透测试过程中,经常碰到由于没有权限访问页面或接口,导致无法继续测试。

下面以单节点和多节点的角度,即单个服务器或多个服务器组成的系统,分析WEB系统的安全控制。

单节点场景

单节点场景,一般用于服务端处理访问控制, 在服务器上配置安全策略,或由web程序对请求做统一的安全控制。当访问敏感资源时,服务端的安全策略或web程序特殊的处理,拒绝用户访问。

client   ---->    webserver

GET /    --->    /index.html   200
GET /admin--->   /admin --> 安全规则 --> 403

多节点场景

多节点场景,一般用于代理服务器处理访问控制 ,在代理服务器上配置安全策略。当访问敏感资源时,服务端的安全策略,使得请求无法到达后端服务器,拒绝用户访问。

通常在内网,外网划分下,比较常见,外网的用户想要访问web服务,需要通过代理服务器,则受到安全策略的限制。当用户可以直接访问到后端服务器时,则不受代理服务器上安全策略的限制。

client   --->   proxy    --->  webserver

# 通过代理服务器访问
GET /    --->   安全规则 ->转发 -> /index.html 200
GET /admin--->  安全规则 ->禁止访问 403 

            # 直接访问
              GET /      -->  /index.html 200
              GET /admin -->  /admin 200

以burpsuite的在线场景,来举例说明,安全策略的限制,以及对抗的技术。

在线场景

单节点场景
请求方法绕过限制

Lab: Method-based access control can be circumvented | Web Security Academy

直接访问敏感接口,401未认证

method-403

通过请求方法绕过限制

method-200

Host首部字段限制

Lab: Host header authentication bypass | Web Security Academy

后端程序中基于Host做权限划分,认为localhost的为本地管理员

host-401

替换请求中的Host字段内容,绕过限制

host-200

Referer绕过限制

Lab: Referer-based access control | Web Security Academy

访问敏感接口,401未认证

referer-403

通过以管理员操作出发敏感接口,发现其中只做了Referer字段验证

referer-200

多节点场景:
X-Original-URL字段绕过uri限制

多节点,代理服务器配置安全策略禁止访问/admin,但是后端框架支持X-Original-URL字段,

Lab: URL-based access control can be circumvented | Web Security Academy

直接访问删除接口,403权限不够

x-uri-403

X-Original-URL字段绕过

proxy: uri --> /
web:   uri --> /admin/delete (资源映射)

x-uri-200

去掉X-Original-URL字段, 两者都将请求uri映射到:/

x-uri-test

安全策略分析

不管是服务器还是web程序,都可以设置安全策略进行访问控制。根据用户请求的信息不同,使用不同的安全策略。

从请求的信息,有几个出发点:

  1. 请求行,请求的uri,请求方法,协议,协议的版本

  2. 首部字段,Host, UA, Reffer, X-Forwarded-For

  3. 请求体(常见WAF的访问控制策略)

从信息的解析,匹配,到最后的安全策略执行,中间还涉及到请求信息的重写或处理,这一过程中,每一个环节的不当处理都可能导致绕过安全策略。

服务器安全策略样例

以nginx服务器配置为例:

基于请求方法限制:
location /admin {
     # only POST
     if ($request_method !~ ^POST$) {
         return 405;
     }
 }
基于请求uri限制:
# 前缀匹配
location /admin {
      return 403;
}
# 精确匹配
location = /flag/ {
    # 配置...
      return 403;
}
基于协议版本限制:
if ($server_protocol ~ "HTTP/1.0") {
        return 426;
    }
基于首部字段Host,UA,Referer字段访问限制, 一般服务器上这些用的比较少
# Host
location /admin {
    if ($host != "localhost") {
       return 403;
}


# Referer
location /admin {
     if ($http_referer !~* "http://example.com"){
        return 403;
    }
}

# UA
location /admin {
     if ($http_user_agent !~* "Mozilla") {
        return 403;
    }
}
基于ip地址的访问限制
# ip
location /admin {
     allow 127.0.0.1/24;
    deny all;
}
基于uri的路径重写(重点测试)
location /admin {
        # rewrite ^/admin/(.*)$ /other/admin/$1 permanent;
        rewrite ^/admin/(.*)$ /other/admin/$1 break;
  }
程序安全策略样例

网站脚本程序, 也是通过请求中的信息,匹配不同的安全策略。

if ( request ? rule ){
  action->response
}

以php语言为例,常见的访问控制

基于请求方法的访问控制
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    // 如果不是 POST 请求,则返回 405 方法不被允许
    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 (isset($_SERVER['SERVER_PROTOCOL']) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
    // 允许的 HTTP/1.1 操作
} else {
    // 可能返回一个错误或者执行降级操作
    header('HTTP/1.1 426 Upgrade Required');
    // 还可以提供升级的 URL 或者更多的信息
}
基于请求首部字段的访问控制,Host, UA, Referer,
$allowedHosts = ['example.com', 'www.example.com'];
if (!in_array($_SERVER['HTTP_HOST'], $allowedHosts)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access denied.');
}

$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'UnwantedBot') !== false) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

$referer = $_SERVER['HTTP_REFERER'];
if (empty($referer) || parse_url($referer, PHP_URL_HOST) !== 'alloweddomain.com') {
    header('HTTP/1.1 403 Forbidden');
    exit;
}
基于ip地址
$allowedIPs = ['127.0.0.1'];
if (!in_array($_SERVER['HTTP_REMOTE_ADDR'], $allowedIPs)) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

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

常用的工具

不局限于上述的场景,403的绕过技术,在于对请求的修改,去突破限制,目前已有的工具如下。

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

面对复杂的web场景, 可能会出现各式各样的畸形请求,但实际上这是服务器对畸形请求的处理不当,导致的安全策略失效。
以下是一些服务器或web框架对请求解析的特殊行为,实现的403绕过。

漏洞场景

单节点
nginx错误配置,导致重写uri时目录穿越
location /files {
        alias /home/;
}
location /admin {
        retrun 403;
}
/files../var/www/html/admin
apache uri解析问题和错误配置导致目录穿越

CVE-2021-41773,CVE-2021-42013

<Directory />
AllowOverride none
Require all denied
</Directory>

<Location /admin>
Require all denied
</Location>
/icons/.%2e/admin
/icons/.%%32%65/admin
node.js uri解析有误目录穿越

CVE-2017-14849

/static/../../../../foo/../../../etc/passwd
jetty uri中%2e绕过限制任意文件读取

CVE-2021-28164

/%2e/WEB-INF/web.xml
jetty uri中双重uri解码绕过限制文件读取

CVE-2021-28169

/static?/%2557EB-INF/web.xml
jetty uri中[.]的各种形式绕过文件读取

CVE-2021-34429

/a/b/..%00/c/d/..%00/WEB-INF/web.xml
/.%00/WEB-INF/web.xml
/%u002e/WEB-INF/web.xml
JAVA request.getRequestURI() 绕过,ctf题目
if (request.getRequestURI().contains("..")) {
    resp.getWriter().write("blacklist");
    return;
}

if (request.getRequestURI().startsWith("/download")) {
    resp.getWriter().write("unauthorized access");
} else {
    chain.doFilter(req, resp);
}

直接通过 getRequestURI() 得到的 url 路径存在一些问题, 比如不会自动 urldecode, 也不会进行标准化 (去除多余的/..)

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

请求走私中利用请求体解析差异的绕过场景省略

基于uri解析差异问题,访问敏感接口

https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-bypassing-aws-waf-acl-with-line-folding

nginx-node,nginx-flask

由于不同节点对请求解析和处理的不一致,导致安全策略失效。

client   --->  proxy(nginx) --->  webserver(node,flask)

nginx精准匹配,配置文件如下

location = /admin {
    deny all;
}

location = /admin/ {
    deny all;
}

web框架对特殊字节的处理以及接口处理的映射。

# nginx安全策略, 精确匹配
GET /admin        -->  /admin  安全策略生效
GET /admins       -->  /admin  安全策略不生效
GET /admin[0xa0]  -->  /admin  安全策略不生效

# [0xff]代表16进制的特殊字节
GET /admin        -->  /admin   接口处理逻辑
GET /admins       -->  /admins  接口处理逻辑
GET /admin[0xa0]  -->  /admin   接口处理逻辑
web框架特殊字节
Flask 3.0.2\x09 \x0a \x0b \x0c \x0d \x20 # ?
node:18.13.0 -express 4.18.3\x09 \x0c \x20 # / ? \xa0

随着nginx版本不同,可能会对特殊字节的处理(400), 导致实际验证效果不同。

标签:HTTP,请求,admin,安全策略,uri,问题,简析,403,403bypass
From: https://blog.csdn.net/jxiang213/article/details/143231436

相关文章

  • 为什么 Spring Boot 的微服务架构被称为“现代应用开发的曙光”?这种设计真的解决了传
    目录1.微服务架构为何被称为“现代应用开发的曙光”1.1单体架构的问题1.2微服务架构的诞生与发展1.3微服务架构的挑战2.SpringBoot在微服务中的角色2.1自动化配置与微服务开发2.2SpringCloud生态中的微服务3.微服务架构是否真的解决了传统单体架构中的所......
  • 解决Pycharm设置虚拟环境,pip仍为全局的问题(即使命令行前有括号,显示已经进入了虚拟环境
    主要原因:路径带中文,即使重命名后一些环境信息没有跟着自动更新由此引发的:问题1、进入venv/Scripts后,piplist时候有乱码问题2、pycharm只能读取到全局的pip,读取不到你想要的虚拟环境中的pip了怎么解决:其实最暴力的方法,是从头开始重建项目,但只适合初期还没有太大工作量的项目......
  • unix网络编程:解决小型聊天室的用户私发消息问题
    今天老师布置了一个在线聊天室用户私发消息的问题思路:在服务端的用户链表中找到要私发的用户名,用其节点里的套接字号发消息,就可以达到私发的效果。运行效果:可以看到,Tom给Bill、Lily群发一个问候消息,Lily私发消息回应Tom。客户端代码:#include<stdio.h>#include<stri......
  • 鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题
    1.TCP数据传输粘包简介在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示:随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,其中一种就是指定数据包结束标志,本节将通过一个示例演示这种思路......
  • vue 项目history模式刷新404问题解决办法
    前言vue项目history模式部署到服务器后,根路径访问没有问题,但是进入其他功能再刷新页面就会出现404,因为你没在nginx或者apache配置上面加上重定向跳转。解决办法,只需要加上这段配置:nginx配置内容:location/{try_files$uri$uri/@router;indexindex.html;}lo......
  • springboot工程,在pom.xml文件中,排除了打包application.yml文件后,运行项目报错的问题
    1、排除掉application.yml文件(maven编译是没有问题的) 2、但是在idea中运行项目,会报 Errorcreatingbeanwithname'loginInterceptor':Unsatisfieddependencyexpressedthroughfield'jwtUtil';nestedexceptionisorg.springframework.beans.factory.BeanCreatio......
  • redis - 其他问题
    redis集群如何做故障转移redissentinelsentinel对redis数据节点和其他sentinel节点做定时监控,客户端连sentinel节点以获取数据节点的信息。如果心跳超过一段时间没回复,sentinel认为该节点主观下线,只有主节点主观下线,且sentinel之间互相通气发现超过一定数量的sentinel都判定为......
  • windows中mysql遇到的一些小问题
    windows中mysql的一些常见问题初始化时指定defaults-files配置文件初始化失败#windows中使用cmd操作mysql时注意cmd命令自带的编码格式是gbk编码,所以在cmd下操作mysql命令可能回出现问题,例如:初始化mysqld--initialize--defaults-file="配置文件"时遇到系统库初始化失败的情......
  • C语言基础入门(小白)三种方法解决幽灵换行符问题
    首先,相信很多读者读到题目都会产生一个共同的疑问:什么是幽灵换行符???    幽灵换行符是指:在C语言中,当用scanf函数时,想要输入几个字符,比如:当输入‘a’之后按下回车键,运行自动结束,而不是等待输入第二个字符,第二个字符就像幽灵般消失了,这是为什么呢??    其实,原因......
  • IPv4 和 IPv6 是两种不同的网络协议,如果你的计算机仅配置了 IPv4 或仅配置了 IPv6,那么
    IPv4和IPv6是两种不同的网络协议,如果你的计算机仅配置了IPv4或仅配置了IPv6,那么它们之间的通信将会遇到问题,因为这两个协议并不兼容。这意味着如果你在网络中有一台设备仅支持IPv4,而另一台设备仅支持IPv6,它们之间无法直接通信。为了解决这个问题,可以考虑以下几种方法:1.......