0x00 背景

https://www.xx.com/service/order.do?orderid=2280582085200280582

上图,选择orderid作为参数, 越权遍历爬取其他人的信息,类似选择某个参数或者某个接口,通过拼接或者篡改数据的ID进行请求其他ID的内容,并且返回的数据存在敏感信息,简称为越权漏洞。

恶意攻击者可以利用漏洞攻击做到:

  1. 水平越权,可以访问同级用户的身份证、手机号码、纳税信息等
  2. 垂直越权,可以访问管理员的敏感信息等。
  3. 修复思路

1、针对具有不同权限的用户,必须在UI屏蔽未授权的功能导航,必须在服务器端对访问的URL进行权限检查,防止纵向越权访问;

2、对于用户资源的访问,必须使用非直接对象引用、或访问控制检查,防止用户访问未授权的资源,防范横向越权访问。

0x01 修复思路

建议做一个过滤器,对权限进行全局校验(每次调用某个接口时,可先对权限进行校验)。大体流程是:第一步清洗URL地址,并提取Api接口名称;第二步从session中提取当前登录用户的userid;第三步提取当前用户的角色id;第四步判断当前用户对应的角色是否有权限访问当前Api接口(检查垂直越权);最后判断当前登录用户是否对目标对象有操作权限(检查水平越权)。

0x02 代码修复

首先是获取URL地址中的Api接口名称,这里对URL地址进行了一次URL解码,还是存在绕过的风险,因为当用户%2523时,就可能绕过。

public static String GetApiName(String Url) throws Exception {

String DecodeUrl =  URLDecoder.decode(Url,"UTF-8");URL url = new URL(DecodeUrl);String ApiUrl = url.getPath();    if(ApiUrl !=null){

String[] ApiPath = ApiUrl.split("/");String ApiName = ApiPath[ApiPath.length-1];        return ApiName;}

return null;}

获取userid时,建议从session中获取,而不是在cookie中再新建一个userid字段,用于标识用户身份。

HttpSession session = ServletActionContext.getRequest().getSession();String userId = session.getAttribute("userId");*/

从session中提取userid后,就要查询与之对应的角色id

//UserId为用户id,RoleId为角色ID,通过UserId获取roleidpublic static int GetRoleId(int UserId) {

Connection conn = Connect();PreparedStatement st = null;ResultSet rs = null;    int RoleId = 0;    try {

// 查询接口访问的角色id,roleid为权限表里的角色ID字段,apiname为权限表里的API接口名称IDString sql = "select roleid from usertable where userid = ?";st = conn.prepareStatement(sql);// 这里使用PreparedStatementst.setInt(1, UserId);rs = st.executeQuery();        if(rs.next()){

RoleId = rs.getInt("roleid");            return RoleId;}

} catch (Exception e) {

e.printStackTrace();        throw new RuntimeException("查询失败!");}

return RoleId;}

校验垂直越权时,判断当前用户是否对指定的接口有访问权限,U_RoleId为用户名对应的角色id,A_RoleId为Api接口对应的角色id,Api_Name为用户尝试访问的API接口名称(这里在系统架构评审,安全设计阶段,就要检查数据库的权限表设置时,Api接口是否有指定对应的角色id)

public static boolean CheckUpPrivilege(int UserId, String Api_Name) {

Connection conn = Connect();PreparedStatement st = null;ResultSet rs = null;    int U_RoleId = GetRoleId(UserId);    int A_RoleId = 0;    try {

String sql = "select roleid from user_role where apiname = ?";st = conn.prepareStatement(sql);// 这里使用PreparedStatementst.setString(1, Api_Name);// 执行sql命令roleid和Role_Id,判断用户是否有权限访问对应的接口地址rs = st.executeQuery();        if(rs.next()) {

A_RoleId = rs.getInt("roleid");// 通过比较,当用户角色id大于等于接口指定的角色id是,可以访问,部分特定接口只有指定的角色才能访问,可直接限定if (U_RoleId >= A_RoleId) {

return true;} else {

return false;}

}

} catch (Exception e) {

e.printStackTrace();            throw new RuntimeException("查询失败!");}

return false;}

最后再判断一下是否是水平越权,S_UserId为当前登录用户的userid,P_UserId为目标对象对应的userid,比如对订单信息进行操作时,可以先通过订单号提取与之对应的userid,再进行判断(当然,订单表,在系统架构评审,安全设计阶段,就要检查订单号是否有指定对应的用户id)。

public static boolean CheckLevelPrivilege(int S_UserId, int P_UserId) {

if(S_UserId == P_UserId){

return true;}

else{

return false;}

}

防止越权访问任意文件:
String permissionMask = System.getProperty("fileMask"):

Path path = testfile.toPath():

String [] validPermissions = { "r--------","r--r-----"}:

for (String validPermissions: validPermissions){

if (permissionMask.equals(validPermissions){

Set<PosixFilePermission> permission=

PosixFilePermissions.fromString(validPermissions):

File.setPosixFilePermissions(path.permission):

...

}

...

}
上述代码可以通过允许用户设置文件权限来防止此类文件权限操纵。如果必须确保用户拥有能够设置文件的权限,则可以采用一种间接方式,即创建一个允许用户进行指定的合法文件权限列表,并且仅允许用户从列表中进行选择。通过这种方式,用户提供的输入将不会直接更改文件权限

防止越权删除某参数的数据
@RequestMapping(value="/delete/{addrId}")
public Object remove(@PathVariable Long addrId){
Map<String, Object> respMap = new HashMap<String, Object>();
if (WebUtils.isLogged()) {
this.addressService.removeUserAddress(addrId,WebUtils.getLoggedUserId());
//关联用户身份
respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_SUCCESS);
respMap.put(Constants.MESSAGE,"地址删除成功!");
}

越权漏洞介绍和修复参考相关推荐

  1. 漏洞介绍及修复建议(漏洞汇总,建议收藏后期会不断更新)

    目录 未分类 Host 头攻击(高危) 域名访问限制不严格(高危) URL 重定向(中危) 会话劫持漏洞(中危) 会话固定漏洞(中危) DNS 域传送漏洞(中危) 检测到网站被黑痕迹(高危) 传输层保 ...

  2. burpsuite 越权_越权漏洞之测试与修复

    这几年,开发人员的安全意识与安全开发水平都有了很大程度的提高.像文件上传.SQL注入漏洞,在网络安全比较受重视的企业,差不多都已经杜绝了,即便有出现,也是凤毛菱角了.目前,部分企业网络安全目前面临的另 ...

  3. Log4j 严重漏洞修最新修复方案参考

    CVE-2021-44228,原理上是 log4j-core 代码中的 JNDI 注入漏洞.这个漏洞可以直接导致服务器被入侵,而且由于"日志"场景的特性,攻击数据可以多层传导,甚至 ...

  4. 网站安全维护之逻辑漏洞、越权漏洞的修复与加固服务

    网站安全维护 网站安全维护当中,程序代码的设计逻辑漏洞,以及用户权限越权漏洞是比较常见的, 在许许多多的电商以及APP网站里,很多前端业务需要处理的部分验证了用户的登录状态, 并没有详细的对后面的一些 ...

  5. Intel CPU漏洞介绍

    Intel CPU漏洞 简介:关于最近接连爆出的CPU漏洞,做一个简单的介绍. CPU漏洞介绍 最近听说的两个CPU漏洞,一个是熔断漏洞(Meltdown),一个是幽灵漏洞(Spectre). 熔断漏 ...

  6. 渗透测试常见漏洞描述及修复建议

    弱口令 漏洞描述 由于系统中存在有弱口令,导致攻击者通过弱口令可轻松登录系统中,从而进行下一步的攻击,如上传webshell,获取敏感数据! 另外攻击者利用弱口令登录网站管理后台,可任意增删改等操作, ...

  7. 越权漏洞简介及靶场演示

    文章目录 一.什么是越权? (一)越权漏洞的概念 (二)越权漏洞的分类 (三)常见越权方法 (四)未授权访问 二.越权漏洞测试过程 (一)越权漏洞的思路 (二)越权测试的过程 (三)常见平行越权 三. ...

  8. 常见漏洞危害和修复建议

    参考链接: https://vulwiki.readthedocs.io/zh_CN/latest/web/svn/ 接口未授权访问 漏洞描述 接口未授权访问,顾名思义在不进行请求授权的情况下,能够直 ...

  9. mysql漏洞_应用CVE: 最新的Mysql高危漏洞介绍

    MySQL官方最近做了一个大的安全漏洞补丁,修复了25 个安全漏洞,关于这些漏洞细节官方和媒体目前为止还有比较少的介绍和分析文章.在此笔者搜集下相关的详细,从邮件讨论组趴到一些细节信息,在此介绍一下几 ...

最新文章

  1. 可能是最详尽的PyTorch动态图解析
  2. objective-c对NSArray的学习
  3. JTAG之IO口作为普通IO口使用时注意事项
  4. php要输出为空值怎么写,thinkphp3.0基础模板引擎变量为空时输出默认值
  5. SAP Spartacus 标准类型的字段扩展 - type augmentation
  6. Hat’s Words(HDU-1247)
  7. 理论基础 —— 二叉树
  8. linux下如何关闭防火墙、查看当前的状态、开放端口
  9. ie8以ie7方式解析
  10. SQL Server中, DateTime (日期)型操作的 SQL语法
  11. linux应用程序固件升级,试试用 Linux 中的 fwupd 更新 ThinkPad 固件
  12. 算法设计与分析(第2版)屈婉玲 刘田 张立昂 王捍贫编著 第五章课后习题答案
  13. 基于stm32单片机外文文献_关于单片机开发设计有关 的外文文献翻译成品英文英语资料:基于STM32的高性能多功能信号发生器的开发(中英文双语对照).docx...
  14. 开关电源—Buck电路原理及其仿真
  15. 蓝牙电话之PBAP协议分析
  16. linux设置用户密码
  17. 给TextView设置颜色选择器selector
  18. vscode离线下载对应版本的插件,避免版本兼容问题
  19. oracle直接路径读,direct path read直接路径读
  20. 数据表与简单Java类映射转换

热门文章

  1. 苹果新款MacBook Pro 2021:M1X处理器+16G内存
  2. 通过windows自带远程桌面,实现不同局域网的电脑相互访问(默默P2P远程桌面管理工具-直接内网穿透)
  3. 骞云科技:假如GitLab使用CMP管理PostgreSQL
  4. tlc2543 多通道选择 错误
  5. android版本分类
  6. 结对开发 《哈利波特》买书最实惠方案设计
  7. 舆情智慧决策闭环管理平台
  8. 《方块方舟》自定义服务器工具,方舟方块世界服务器建立方法
  9. 跨境电商必知的交叉销售和追加销售:2022终极指南
  10. 一周学python系列(7)——面向对象