如何获取知乎热搜API密钥(分步指南)
Spring Broken Access控制指南:示例及预防
在本文中,我们将探讨访问控制及其在现代网络安全性和可靠性中的作用。
首先,我们将简要解释访问控制是什么以及它为何如此重要。接下来,我们将探讨失效的访问控制、其表现形式以及其针对的漏洞。最后,我们将针对这些漏洞提供一些可应用于系统的缓解策略。
本文中用于说明概念的开发堆栈是 Spring Boot 和 Java。如果您不熟悉这些技术,您可以在我们的博客上找到其他在不同技术背景下处理此主题的文章。
但是,如果您想了解有关 Spring Boot 的更多信息,请随意使用这个优秀的资源。
Spring Boot Starter
在进入主题之前,让我们先简要构建一个简单的 Spring Boot Java Web 项目,作为本文的背景。要构建它,您只需要安装 JDK、Gradle 和您最喜欢的 IDE 来编写代码。
首先访问https://start.spring.io并下载我们的样板项目。确保选择“Spring Web”和“Spring Security”作为依赖项,选择 Java 作为语言,选择 Gradle 作为项目类型。
下载后,进入 src/main/java/com/example/demo 文件夹并创建一个名为 HelloController.java 的类文件。
然后输入以下代码:
package com.example.springboot;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@RequestMapping("/")
@ResponseBody
public String index() {
return "Greetings from Spring Boot!";
}
}
就是这样。
您可以运行代码并转到 localhost:8080 查看您的页面。
什么是访问控制?
简而言之,访问控制代表一组管理和控制资源访问的策略和机制。访问控制通常也称为授权。
一旦服务器通过登录或身份验证机制确定了您的身份,它就会授予或限制您可以访问的功能和资源。此外,访问控制通常用作用户跟踪的平台。
尽管概念简单,但适当地实施一个强大且安全的访问控制系统却很困难。访问控制与系统架构紧密相关。此外,用户经常会扮演多个角色,这使得访问管理更加复杂。因此,通常不建议从头开始开发访问控制,而是采用经过实践检验的、强大的解决方案,例如OAuth 2.0和JWT 。
访问控制中断怎么办?
破坏的访问控制包含一组已知漏洞,可能对系统的访问控制构成威胁。
尽管访问控制中的许多漏洞一旦被忽视就很容易被利用,但它们可以相对快速地得到解决。这一点很重要,因为访问控制被破坏的后果可能非常具有破坏性,因为攻击者可以接管您的系统。
要了解有关访问控制的复杂性的更多信息,请点击此[链接]阅读我们关于损坏的访问控制的深入文章。
访问控制漏洞
攻击者可以利用的漏洞有很多,具体取决于您的技术堆栈和架构。不过,为了简洁起见,我们将仅关注不安全的 ID、路径遍历、文件权限和客户端缓存。
不安全身份漏洞
大多数现代网站都使用某种形式的 ID 或索引来快速高效地引用数据。在大多数情况下,这已经足够了。但是,如果这些 ID 很容易被破解,无论是手动破解还是暴力破解,那么你就有安全问题了。
为了说明这一点,假设您有一个个人资料页面部分,服务器在其中显示用户个人资料。然后以下 URL 检索用户个人资料。
https://www.mywebsite.com/profile?id=123
现在,如果我手动更改查询字符串中的数字,并且没有主动访问控制来验证我的请求,那么我就可以访问任何配置文件。
路径遍历漏洞
路径遍历定义了用户自由浏览文件系统目录树的能力。
未实施适当访问控制的系统可能会成为路径遍历攻击的受害者,并允许攻击者访问服务器中的受限资源。当系统允许检索的资源路径可以被修改且未经过充分验证时,就会发生这种情况。
为了说明这一点,请看一下以下 URL:
https://www.mywebsite.com/photos?file=user.png
如果我们将“user.png”更改为“../../etc/passwd”之类的内容,我们就可以访问应用程序机密。
文件权限漏洞
文件权限漏洞存在于服务器文件系统的权限机制中。
所有 Web 应用程序都包含不应被访问的关键配置文件和资源。然而,如果缺乏适当的配置策略,攻击者就可以瞄准这些文件,从而控制整个平台。
为了说明这一点,下面是一个尝试访问本应无法访问的文件的攻击示例:
https://www.mywebsite.com/photos?file=../../gradle.json
客户端缓存漏洞
客户端缓存漏洞很难解决,因为攻击者会从物理上接管用户的计算机。他们不是进行远程攻击,而是利用会话凭据、缓存页面或已在经过身份验证的客户端中存在的浏览器中的数据。
一旦发生这种情况,攻击者就可以快速获取用户数据。
解决访问控制问题
缓解访问控制失效攻击的第一步是实施强大的身份验证机制。在本文中,我们将实施一个简单的基于表单的登录机制来进行说明。请探索Java和 Spring Boot 社区中提供的资源,以获得更深入的实施。
首先,在项目 src/main/java/com/example/demo 目录中创建一个名为 SecurityConfiguration.java 的文件。
然后添加以下代码:
package com.example.springboot;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password("{noop}pass")
.roles("USER");
}
}
如您所见,这本质上是一种为身份验证管理器在内存中创建用户的方法。当然,在生产中不建议这样做,但它可以让我们快速说明这些概念。
恭喜,您刚刚实现了一种身份验证机制。
刷新页面并检查。
解决破坏的访问控制漏洞
为了解决上述特定的漏洞,我们需要对平台做一些调整。
不安全的 ID:通过将 GUID 实现为 ID,可以轻松实现此解决方案。您必须尽早考虑到此漏洞来开发系统。所有 ID(或至少属于敏感资源的 ID)都必须经过混淆且唯一。
路径遍历:路径遍历缓解需要验证所有用户输入并限制对关键资源的访问。幸运的是,得益于 Spring Security 等库的强大功能,您无需做太多工作即可实施正确的路径遍历策略。
文件权限:除非您需要修改服务器权限并添加与文件操作相关的功能,否则您无需做太多工作即可保持安全。不过,如果您需要进一步的说明,请咨询您的服务器管理员。
客户端缓存:在这种情况下,最有效的解决方案也是最简单的。不要在客户端浏览器上存储敏感的用户信息。但是,如果由于需求而必须尝试复杂的功能,请实施适当的 HTML 元标记和异步验证以确认页面加载时的权限。
结论
据SDTimes报道,破坏的访问控制现在是 OWASP Top 10 2021 中最大的漏洞。这种情况应该引起开发人员的关注。
然而,正如您所看到的,尽管很复杂,但提供强大的访问控制却相对简单。
漏洞和攻击现在比以往任何时候都更加普遍和普遍,确保系统安全是一项越来越复杂的任务。尽管如此,我们必须迎接挑战,继续开发这些问题的解决方案。
文章来源:Spring Broken Access Control Guide: Examples and Prevention