Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Access Control: Database(数据库访问控制)最新解析及完整解决方案

Access Control: Database(数据库访问控制)最新解析及完整解决方案

作者头像
ZhangXianSheng
发布于 2020-10-14 07:39:45
发布于 2020-10-14 07:39:45
9.3K00
代码可运行
举报
运行总次数:0
代码可运行

知识库:Access Control: Database(数据库访问控制)

规则描述

数据库访问控制是指程序未进行恰当的访问控制,执行了一个包含用户控制主键的SQL语句,由于服务器端对客户提出的数据操作请求过分信任,忽略了对该用户操作权限的判定,导致修改相关参数就可以拥有了其他账户的增、删、查、改功能。如果在一个应用中,用户能够访问他本身无权访问的功能或者资源,就说明该应用存在访问控制缺陷,也就存在越权漏洞。详见CWE ID566: Authorization Bypass Through User-Controlled SQL Primary Key (http://cwe.mitre.org/data/definitions/566.html)。

漏洞危害

数据库访问控制是利用用户引入的参数生成由用户控制主键的 SQL 语句,令攻击者可以访问到同级别用户的资源或者访问更高级别用户的资源,会导致任意用户敏感信息泄露、用户信息被恶意修改或删除。数据库访问控制类似于数据库越权。例如某一页面服务器端响应中返回登录名、登录密码、手机号、身份证等敏感信息,如果存在数据库访问控制,通过对用户 ID 的遍历,就可以查看所有用户的敏感信息,这也是一种变相的脱库,而且很难被防火墙发现,因为这和正常的访问请求没有什么区别,也不会包含特殊字符,具有十足的隐秘性。

整改方案

缺陷代码

上述示例代码31-56行,程序获取用户输入的参数 id,并将传入参数转成 int 类型,然后创建数据库查询,查询 uid 为传入参数 id 的清单数据。显然,程序中未对传入参数做校验及过滤,用户可随意获得任何用户的清单数据。

从跟踪路径中可以分析出数据的污染源以及数据流向,在代码行第53行报出缺陷。

修复代码:

在上述修复代码中,在第34行从 session 中直接获取到 id 的值构造查询语句,获得当前用户的清单数据,避免用户操控SQL语句的主键值。

  1. 补充完整的解决方案:

发生构成该漏洞的两个必要条件:

1、来自用户或前端参数参与了后台操作数据库语句(数据从一个不可信赖的数据源进入程序)。

2、该参数做数据库表主键使用(这个数据用来指定 SQL 查询中主键的值。)

三种解决方案:

  1. 可不使用来自用户或前端参数做相关SQL操作(例:读取session里值构建SQL(一般通过session取用户id构建用户清单,但如果产生漏洞的id不为用户id,例:orgid,roleId,店铺id取机构、店铺信息时,则也需要保证该主键来自可信赖的数据源:后端或数据库等地方))
  2. 该参数不做SQL相关操作的主键使用。(使用一个与主键不一致的副id做相关操作)

例:图1的查询SQL语句

图1
图1

在图2中查询的org_id并未做主键id,而是作为的副id使用

图2
图2

且在图3中核对该主副id不一致

图3
图3

3、参照fortify官方解决方式。

附加了一个限制,以验证清单是否属于当前经过身份验证的用户。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
userName = ctx.getAuthenticatedUserName();
id = Integer.decode(request.getParameter("invoiceID"));
String query =
        "SELECT * FROM invoices WHERE id = ? AND user = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, id);
stmt.setString(2, userName);
ResultSet results = stmt.execute();
...

如上示例代码:加入一个用户名(不推荐使用用户id)的查询限制,匹配用户对该条查询是否有所有权。

上述三种解决方案:

方案1-->限制了构成漏洞的条件1;

方案2-->限制了构成漏洞的条件2;

方案3-->限制了操作越权的可能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Fortify Audit Workbench 笔记 Access Control: Database
如果没有适当的 access control,就会执行一个包含用户控制主键的 SQL 指令,从而允许攻击者访问未经授权的记录。
用户1637609
2020/03/17
2.8K0
猿进化系列12——一文快速学会数据库访问
看完上一个章节,相信你已经掌握了MYSQL数据库的基本操作,以及SQL的基本写法,可是你只会用图形化工具编写和执行SQL,而在实际的程序开发中,你是需要用程序来操作数据库的,今天我们就来学习下JAVA访问数据库的姿势。
山旮旯的胖子
2020/07/28
4210
猿进化系列12——一文快速学会数据库访问
盘点 Java 数据库访问框架——究竟哪个更适合你
假设您正在开发一个Java程序,有许多办法可以让您的应用连上数据库。下面会列举各数据库访问框架的适用场景,相信能够帮您选到适合项目的开发框架。
PHP开发工程师
2021/05/11
3.4K0
盘点 Java 数据库访问框架——究竟哪个更适合你
与访问控制相关的安全问题
学习打卡计划是信安之路知识星球开启的 “每天读书一小时,挑战打卡一百天” 主题活动,能够坚持学习打卡 100 天的同学可以获得信安之路提供的百分成就徽章和证书,学习书籍可以自选,主要目的是养成每日读书学习的好习惯,并将自己的学习心得分享出来供大家学习。
信安之路
2020/12/24
7910
几个重要的java数据库访问类和接口
DriverManager类处理驱动程序的加载和建立新数据库连接。DriverManager是java.sql包中用于管理数据库驱动程序的类。通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象:     static Connection getConnection(String url,String username,String password) 指定数据的URL用户名和密码创建数据库连接对象。url的语法格式是: jdbc:<数据库的连接机制>:<ODBC数据库名>。
bear_fish
2018/09/19
1.2K0
Servlet 数据库访问
现在调用这个 Servlet,输入链接:http://localhost:8080/Tomcat部署的项目名/DatabaseAccess,将显示以下响应结果:
久绊A
2023/12/23
1840
Spring实战6-利用Spring和JDBC访问数据库主要内容
写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRepository和SpittleRepository接口,在本地启动该web服务的时候会遇到控制器无法注入对应的bean的错误,因此我决定跳过6~9章,先搞定数据库访问者一章。
阿杜
2018/08/06
8130
Spring实战6-利用Spring和JDBC访问数据库主要内容
JDBC存在什么问题?MyBatis是如何解决的?
在Java开发领域,与数据库的交互是不可或缺的一环。JDBC(Java Database Connectivity)作为Java连接和操作数据库的标准API,虽然提供了基础的数据库访问功能,但在实际开发中却面临着诸多挑战。而MyBatis这一持久层框架的出现,为解决JDBC的问题提供了全新的思路和方法。本文将深入剖析JDBC存在的问题,并探讨MyBatis是如何巧妙地化解这些问题的。
用户11397231
2025/01/24
1230
JDBC存在什么问题?MyBatis是如何解决的?
掌握PHP PDO:数据库世界的魔法师
PDO(PHP数据对象)是PHP的一个轻量级数据库访问抽象层,允许开发者以一种统一的方式访问多种不同类型的数据库,如MySQL、PostgreSQL、SQLite等。它提供了一组类和方法,使得在PHP应用程序中执行数据库查询和操作变得更加简单和安全。PDO通过使用面向对象的方式来处理数据库操作,提供了更加灵活和可维护的代码结构。
繁依Fanyi
2024/05/01
2250
使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询
对于较大的数据量,通常采用分页查询的方式。不同的数据库产品有不同的数据库级的分页查询策略。例如:Oracle通常使用rownum的方式;而Mysql使用limit的方式。
MickyInvQ
2020/09/27
1.2K0
使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询
深入探索:Spring JdbcTemplate的数据库访问之歌
在当今的企业应用程序开发中,与数据库进行交互是至关重要的一环。Spring框架为我们提供了多种方式来简化数据库访问,其中之一就是Spring JdbcTemplate。
繁依Fanyi
2024/05/05
3610
使用JDBC连接MySQL数据库--典型案例分析(七)----批量插入员工信息
向Emp表中批量插入100条数据,需要插入数据的列为empno,ename以及sal.这三个字段对应的数据分别为empno列的数据通过序列emp_seq自动生成,ename列的数据为字符串 "name"+循环次数i组成、sal的数据有随机生成的10000以内的整数构成。
MickyInvQ
2020/09/27
9140
使用JDBC连接MySQL数据库--典型案例分析(七)----批量插入员工信息
【MySQL 学习】深入探索JDBC(Java与数据库连接的桥梁)
🔥在Java编程世界中,数据库操作是不可避免的一部分,无论是开发企业级应用还是简单的数据管理系统,都需要与数据库进行交互。而 JDBC(Java Database Connectivity)正是Java提供的一套用于连接和访问数据库的API(应用程序接口)。通过JDBC,Java程序能够执行 SQL(Structured Query Language)语句,实现数据的查询、更新、插入和删除等操作。
IsLand1314
2024/10/15
3230
【MySQL 学习】深入探索JDBC(Java与数据库连接的桥梁)
如何保护 Linux 数据库免受 SQL 注入攻击?
SQL 注入是一种常见的网络攻击类型,它利用应用程序对用户输入的不充分验证和过滤,导致恶意用户可以通过注入恶意的 SQL 代码来执行未授权的数据库操作。为了保护 Linux 系统上的数据库免受 SQL 注入攻击,我们需要采取一系列的安全措施和最佳实践。本文将详细介绍如何保护 Linux 数据库免受 SQL 注入攻击。
网络技术联盟站
2023/06/17
3370
如何保护 Linux 数据库免受 SQL 注入攻击?
一个SQL Injection漏洞在SDL流程中的闯关历险记
众所周知,产生SQL注入漏洞的根本原因是SQL语句的拼接,如果SQL语句中的任何一部分(参数、字段名、搜索关键词、索引等)直接取自用户而未做校验,就可能存在注入漏洞。
用户U2
2022/06/02
4230
一个SQL Injection漏洞在SDL流程中的闯关历险记
Golang如何优雅连接MYSQL数据库?
Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可使用database/sql包。
JavaEdge
2021/02/23
12.7K0
Golang如何优雅连接MYSQL数据库?
java数据库操作
数据库访问几乎每一个稍微成型的程序都要用到的知识,怎么高效的访问数据库也是我们学习的一个重点,今天的任务就是总结java访问数据库的方法和有关API,java访问数据库主要用的方法是JDBC,它是java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法,下面我们就具体来总结一下JDBC 一:Java访问数据库的具体步骤: 1 加载(注册)数据库 驱动加载就是把各个数据库提供的访问数据库的API加载到我们程序进来,加载JDBC驱动,并将其注册到DriverMana
企鹅号小编
2018/02/07
1.3K0
MyBatis 架构与原理深入解析,面试随便问!
本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。
搜云库技术团队
2023/09/18
5920
MyBatis 架构与原理深入解析,面试随便问!
浅谈php安全
这段时间一直在写一个整站,前几天才基本完成了,所以抽个时间写了一篇对于php安全的总结。 技术含量不高,过不了也没关系,希望能一些准备写网站的朋友一点引导。 在放假之初,我抽时间看了《白帽子讲web安全》,吴翰清基本上把web安全中所有能够遇到的问题、解决思路归纳总结得很清晰,也是我这一次整体代码安全性的基石。 我希望能分如下几个方面来分享自己的经验 把握整站的结构,避免泄露站点敏感目录 在写代码之初,我也是像很多老源码一样,在根目录下放上index.php、register.php、login.
FB客服
2018/02/02
1.9K0
完整java开发中JDBC连接数据库代码和步骤
E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten
Hongten
2018/09/18
1.5K0
推荐阅读
相关推荐
Fortify Audit Workbench 笔记 Access Control: Database
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验