目录
一、引言
在网络安全领域,越权漏洞是一种常见且危害较大的逻辑安全漏洞。它可能导致用户隐私泄露,攻击者获取系统管理权限或其他用户的敏感信息。本文将介绍越权漏洞的概念、原理、危害,以及从攻击者和防御者的角度探讨相关的方法和措施。
二、越权漏洞的概念与原理
(一)概念
越权漏洞是指系统资源被访问时,未正确验证当前用户的身份,使得攻击者能够越权访问其他同级别(水平越权)或不同级别(垂直越权)用户的系统资源。
(二)原理
- 水平越权
- 当系统对同样权限的用户角色访问资源未进行严格区分时,就可能发生水平越权。例如,在一个电商系统中,如果用户 A 和用户 B 具有相同的权限级别,系统在处理用户 A 对订单信息的访问时,如果没有对用户身份进行精确验证,攻击者可能通过修改请求中的某些参数,使系统误认为是用户 B 在访问订单信息,从而获取用户 B 的订单详情。
- 垂直越权
- 对于不同权限的用户角色,如果系统在权限验证上存在漏洞,就会出现垂直越权。比如,一个普通用户账号可能通过某种方式绕过权限验证,访问高权限账号的功能模块,进而获取系统管理权限或其他高权限用户的敏感信息。
三、越权漏洞的危害
- 获取系统管理权限
- 主要针对垂直越权,一般权限的账号垂直越权后,可以访问高权限账号的功能模块,从而获取系统管理权限,这对整个系统的安全构成严重威胁。
- 获取用户敏感信息
- 针对水平越权,攻击者可以越权访问其他用户的资源,如订单、个人信息等,侵犯用户的权益。
四、攻击者挖掘越权漏洞的思路与方法
(一)空值处理
- 多参数值匹配查询
- 对于如
userID=1111&userIDcard=3401212312312128
等多条件匹配获取用户数据的情况,如果程序未对空值进行校验,攻击者可以尝试将userIDcard
等参数赋值为空或者去除这些参数,看是否可以通过userID
越权遍历相关信息。 - 以下是一个简单的 Python 示例,模拟对一个存在空值处理漏洞的查询函数进行攻击(仅为示意):
- 对于如
def get_user_data(user_id, user_idcard):
# 假设这里是一个存在漏洞的查询函数,实际应该对空值进行处理
data = "模拟查询到的数据"
return data
user_id = "1111"
user_idcard = "" # 尝试赋值为空
print(get_user_data(user_id, user_idcard))
- 前端限定信息绕过
- 当前端限定只能查询某一时间段(如三个月)的信息时,攻击者可以在数据包中更改时间段或者对时间参数赋值为空等处理,进行绕过相关限定。
(二)签名绕过
- 签名空值处理
- 如果数据包有签名校验,攻击者可以尝试查看签名参数或参数值是否对空值有处理,如果没有,可以尝试通过空值绕过。
- 签名机制分析
- 分析签名的处理机制,看签名是否只对当前数据包参数值做验证。如果修改当前数据包
key
值时请求失效,但通过其他方式(如修改上一个数据包返回值中的key
值,让 API 主动去调用key
值)可以绕过,攻击者就可以利用这种机制进行越权操作。
- 分析签名的处理机制,看签名是否只对当前数据包参数值做验证。如果修改当前数据包
(三)其他方法
- 明显的测试点
- 对于像
http://test.com/edituser/1
这样的 URL,可以直接测试http://test.com/edituser/2
等其他用户的 URL,看反馈内容是否是其他用户信息。
- 对于像
- 不明显的测试点
- 如果 URL 里没有明显的
id
、name
等可测试字段,要分析http
头里有没有特殊字段(如token
),并分析cookie
字段和body
体,是否有明文或者容易获取的字段(如jd
的pin
码),找出查询条件去测试。例如,可以在被动扫描里写一个插件,使用正则依次替换数字,判断响应内容(这种方法只能
- 如果 URL 里没有明显的
77-聊聊越权的那些事.pdf
继续
粗略判断,深入的还需要根据功能定制策略)。
五、检测越权漏洞的工具及脚本
- Authz、Autorize:这些是可以用于检测越权漏洞的工具。
六、企业防御越权漏洞的措施
(一)权限校验
- 对 API 进行权限校验
- 在后端代码中,对于 Java 应用,可以使用注解或拦截器等方式对 API 进行权限校验。例如,使用 Spring Security 框架,可以在控制器方法上添加注解来指定访问权限。以下是一个简单示例:
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Secured("ROLE_USER")
@GetMapping("/user-info")
public String getUserInfo() {
return "User information";
}
}
- 上述代码中,只有具有
ROLE_USER
角色的用户才能访问/user-info
这个 API。
- 验证用户身份和权限
- 可以通过多种方式验证用户身份和权限。例如,用户登录之后,可以将用户唯一标识映射存入
session
中(如在 Java 中可以使用HttpSession
),用户所有操作都通过session
来唯一确定权限。在数据库中存储用户唯一标识,以便在需要时进行验证。
- 可以通过多种方式验证用户身份和权限。例如,用户登录之后,可以将用户唯一标识映射存入
(二)数据脱敏
- 对敏感信息进行脱敏处理
- 对用户敏感信息进行脱敏,即使发生了越权,攻击者也获取不到有价值的信息。例如,对于用户的手机号码,可以只显示前几位和后几位,中间用星号代替。在 Java 中,可以使用字符串处理方法来实现数据脱敏。以下是一个简单示例,对手机号码进行脱敏:
public class DataDesensitization {
public static String desensitizePhoneNumber(String phoneNumber) {
if (phoneNumber.length() >= 11) {
return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(phoneNumber.length() - 4);
}
return phoneNumber;
}
}
通过以上对越权漏洞的介绍,从攻击者的挖掘思路到企业的防御措施,我们可以看到,越权漏洞需要引起足够的重视,无论是开发人员还是企业安全管理人员,都应该采取有效的措施来防止越权漏洞的产生,保护系统和用户的安全。