越权访问漏洞

前言

近期项目进行了多项安全漏洞扫描,不可避免的扫描到一些漏洞,为了避免日后再次出现时重新查资料,所以准备将一些安全漏洞相关内容的整理成文章。

越权漏洞介绍

1.什么是越权漏洞

先一句话概括一下:越权漏洞,又称越权访问,是指用户进行了未经授权的数据访问或者操作。

举个,你住在一个公寓里,每个人有一个自己房间,同时每个房间都有不一样的钥匙。在这个条件下,越权漏洞就好像是公寓的锁坏了,人们可以用自己的钥匙开别人的门,甚至有可能进入管理人员的办公室。

在软件系统中,一个系统或应用程序就像这个公寓,而每个用户就像住户,他们被授权访问特定的数据和功能——就像只能进自己的房间。越权漏洞这个问题就出现在系统没有正确地检查或限制用户去哪里和他们能做什么,导致有些用户能够访问或操作本不应该的信息或功能。

这种越权分为两类:

  1. 水平越权:这就像是住户之间互相进入对方的房间。在系统中,这意味着一个用户访问了另一个同等权限用户的信息,比如你能看到其他用户的私人消息或账户信息。

  2. 垂直越权:这种情况则更糟,就像是住户进入了公寓管理员的办公室。这意味着拥有普通权限的用户可以访问更高权限的功能,比如一个普通用户可以访问到管理后台,或对网站的内容进行编辑和删除。

这些越权行为是非常危险的,类似于现实生活中的非法闯入或者不当使用他人财物。它们可能导致私人信息泄露,或者更严重的是,系统会被破坏和滥用。例如,如果你的在线购物账户存在越权漏洞,其他人可能就能看到或者使用你的信用卡信息。

想要解决这个问题,就需要确保系统中的锁(也就是访问控制)是工作正常的,每次用户尝试进入新的"房间"或者尝试做些操作时,系统都需要检查他们是否有正确的"钥匙"(也就是足够的权限)。这种检查需要很细心,就像是公寓管理员每次都要检查住户的身份证和钥匙一样。

2.造成越权漏洞的原因

  1. 不充分的访问控制检查

    • 应用程序未能在服务器端对每个敏感操作进行合适的访问控制检查。
    • 仅在前端进行授权检查,而没有在服务器端重复这些检查。
  2. 权限配置错误

    • 错误配置的权限可能允许未授权的用户访问受限资源。
    • 在初始设定或之后权限更改中未正确设定访问权限。
  3. 会话管理不当

    • 弱或不正确的会话管理机制可能导致漏洞,比如会话固定攻击或会话劫持。
  4. 认证绕过

    • 如果认证机制可以被绕过,攻击者可能不需要有效的证书也能执行受限操作。
  5. 角色切换不当

    • 在用户切换角色时不对会话或权限进行重置,造成先前角色的权限遗留。
  6. 业务逻辑错误

    • 用户数据未被适当隔离,使得一个用户能够访问到其他用户的数据。
    • 业务逻辑上的错误可能造成漏洞,如错误地假设用户会遵循预定流程而不会尝试未授权行为。

3.如何发现越权漏洞

  1. 手动测试

    • 角色切换:切换不同的用户角色试图访问应该受到限制的资源来测试系统的访问控制。比如,作为普通用户尝试访问管理员的控制面板。
    • 直接对象引用:手动修改URL中的参数,例如数据库记录的序列号或文件名,看是否可以访问或修改其它用户的数据。
  2. 自动化扫描

    • 使用自动化工具扫描应用程序的端点,并识别潜在的安全漏洞。这些工具可以帮助测试所有通过网络暴露出来的接口,检查它们对越权尝试的响应。
  3. 会话管理测试

    • 测试应用程序是如何处理用户会话的。确保会话不能被劫持,且在用户登出后,会话ID不能被用于访问资源。
  4. 使用中间人攻击代理

    • 中间人攻击代理(如Burp Suite、OWASP ZAP等)能够截获和修改客户端和服务器之间的请求和响应。可以模拟不同的用户行为,尝试未授权操作。
  5. 状态管理验证

    • 确保应用程序在更改状态时(如用户登录、注销或权限变化)正确管理权限,不会留下越权的漏洞。
  6. 错误处理

    • 适当的错误处理可以避免给攻击者提供系统架构的线索。比如,无论是因为何种原因访问失败,报错信息应保持一致,不应泄露任何权限相关的详细信息。
  7. 改变业务逻辑流程

    • 改变请求的顺序或流程,尝试忽略某些流程中的步骤,这能帮助发现应用程序中未正确实现的状态检查。
  8. 审计日志

    • 审计日志能够记录所有重要的访问和操作事件。确保所有的敏感操作都有日志记录,这样假如出现任何越权行为,都能追溯其活动。

4.如何防御越权漏洞

  1. 最小权限原则

    • 为所有用户实施最小权限原则,确保他们只能访问完成工作所必须的资源。
    • 定期审查用户的权限,确保权限与他们的职责相符。
  2. 角色基础访问控制(RBAC)

    • 实施基于角色的访问控制系统,通过角色来定义权限,然后将用户分配至相应角色。
    • 确保只有适当级别的角色才能访问敏感信息或执行重要的操作。
  3. 强化认证和授权检查

    • 在应用程序的每一个功能点都实施强有力的授权机制。
    • 确认服务器端对每个请求都执行严格的权限检查。
  4. 会话管理

    • 使用安全的会话管理技术,如 HTTPOnly 和 Secure 的 cookie 标志,确保会话防篡改。
    • 在角色变更或重要操作后重置会话ID,避免固定会话攻击。
  5. 输入验证

    • 不信任任何用户的输入,对所有输入进行严格的验证,确保它们符合预期的格式,并没有尝试越权。
  6. 垂直和水平访问控制

    • 实现垂直访问控制: 以确保用户不能执行超出其权限等级的操作。
    • 实现水平访问控制: 以确保用户不能访问同等权限等级其他用户的数据。
  7. 分布式权限检查

    • 确保权限不仅在入口点进行检查,而且在访问控制决策点也进行检查,比如数据库层面。
  8. 错误处理和日志记录

    • 实施适当的错误处理策略,避免通过错误信息泄露关于权限模型的细节。
    • 记录所有的认证尝试和授权失败事件,以便进行安全审计。
  9. 安全审计和代码审查

    • 定期进行代码审查和安全审计,来识别和修复潜在的安全风险。

越权攻击演示

我们这里使用 Pikachu 作为靶场,简单演示一下越权攻击。

水平越权攻击

  • 我们进入 Pikachu 的水平越权的测试页面,点击提示查看我们能拿到的系统信息
  • 提示中提供了三个测试用户,分别为: lucylilikobe ,密码都是 123456
越权访问漏洞_第1张图片
  • 我们这里通过 lucy 账户登录后,出现了一个查看个人信息的按钮
  • 此时,还没有任何可以进行越权攻击的地方
越权访问漏洞_第2张图片
  • 当我们点击查看个人信息后,URL 中多了一串参数
  • 那么我们此时思考一下,是否可以通过修改参数达到访问其他人数据的目的?
越权访问漏洞_第3张图片
  • 当我们直接将 username 的参数修改为 lili 并刷新页面后,获取到了 lili 的信息
越权访问漏洞_第4张图片

至此,一个简单的水平越权的攻击就完成了,通过这个小例子,相信大家也对水平越权有了一定的了解。

这看起来是一个很弱智的 bug 造成的漏洞,但当一个系统很庞大时,接口在鉴权方面出现错漏却并非什么令人惊讶的事,举个最常见的例子:当查询一个内容的详情时是通常是根据id查询 ( 假设这里是自增长 ID ) 的,假如接口中没有添加用户 ID的判断,只添加了ID的查询条件,那么任何一个用户只需要根据这个接口,通过 ID 自增的方式,便能获取到其他人的内容详情。

垂直越权攻击

  • 垂直越权的攻击方式相对比较苛刻,需要有更高等级的用户登录机会才能实现。
  • 我们先看一下当前能拿到的信息,一个管理员账号和一个普通账号
越权访问漏洞_第5张图片
  • 我们先登录普通用户,只有查阅权限,没有其他任何可操作的能力
越权访问漏洞_第6张图片
  • 我们再登录管理员账号,页面中有添加用户和删除用户的权限
越权访问漏洞_第7张图片
  • 现在思考一下,如何尝试在登录普通用户时,可以尝试进行操作添加和删除功能?
  • 我们的第一想法就是,既然页面中没有按钮,我们是否可以通过直接访问接口进行请求操作?
  • 我们现在不知道创建、删除功能的接口地址以及参数,所以需要用管理员请求后拿到数据包。
  • 我们用管理员用户打开创建用户页面,同时打开控制台
越权访问漏洞_第8张图片
  • 录入参数,点击创建后,我们就拿到创建的数据包
  • 当然了,实际情况中攻击者肯定没有管理员账户的,但是攻击这可以通过其他途径获取管理员账户的信息,比如:xss, 中间人劫持等方式。
越权访问漏洞_第9张图片
  • 在后面的页面中,我们也可以看到 ziyang 这个用户已经创建成功了
  • 我们现在直接通过控制台复制创建用户的请求体,复制为 cURL 请求。
  • 也可以通过 Burp Suite 等工具拦截请求,在这里有点大材小用了,所以直接用 devtools 了。
越权访问漏洞_第10张图片
  • 我们现在退出管理员账号,使用普通用户登录
  • 我们从控制台的 Application / Storage / Cookies 中拿到当前的 PHPSESSID
越权访问漏洞_第11张图片
  • 我们打开一个终端,粘贴刚才复制的请求体
  • 同时将 body中的用户名改为 ziyang666,将 Cookie 替换为刚刚获取的普通用户的 Cookie
越权访问漏洞_第12张图片
  • 回车后,发送出创建请求,我们刷新页面会发现多了一条 ziyang666 的数据
  • 这样,我们就成功的通过普通用户越权进行创建用户了。
越权访问漏洞_第13张图片

至此,垂直越权的攻击也演示完成了,在实际情况下,垂直越权要比水平越权困难的多,通常需要先拦截到高权限用户发送的数据包。

  • 在我们演示的这个例子中,使用了 chrome devtools 与 cURL 获取、发送数据包,更专业一些的可以通过 Burp Suite、OWASP ZAP等工具进行代理拦截。
  • 同时在这个例子中,我们也可以在复制请求体时通过 Copy as fetch,复制 fetch 请求,我们切换用户后直接在控制台粘贴发送请求即可,但为了更好的演示,所以使用了 cURL 发起请求。

总结

水平越权访问是一种“基于数据的访问控制”设计缺陷引起的漏洞,垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞,本质上是所利用的漏洞不同获得的权限不同,两者在本质上完全不同。

两者具体区别如下:

  1. 水平越权通常是因为服务器端在接收到请求数据进行操作时没有判断数据的所属人/所属部门而导致的越权数据访问漏洞。假设用户x和用户y属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据x和数据y),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户x能访问到用户y的数据(数据y),那么用户x访问数据y的这种行为就叫做水平越权访问
  2. 垂直越权又叫做权限提升攻击,通常是因为后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。

强化审核、测试和监控措施,定期更新和维护系统,以及采用最佳实践和安全框架,都是减少越权漏洞的有效方法,除了技术上的措施,提高团队成员的安全意识也同样重要。

你可能感兴趣的:(程序人生)