博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fortify漏洞之Access Control: Database(数据越权)
阅读量:5342 次
发布时间:2019-06-15

本文共 1326 字,大约阅读时间需要 4 分钟。

  继续对Fortify的漏洞进行总结,本篇主要针对 Access Control: Database(数据越权)的漏洞进行总结,如下:

1、Access Control: Database(数据越权)   

1.1、产生原因:

Database access control 错误在以下情况下发生:

1.      数据从一个不可信赖的数据源进入程序。

2.      这个数据用来指定 SQL 查询中主键的值。

 

示例 1:以下代码使用可转义元字符并防止出现 SQL 注入漏洞的参数化语句,以构建和执行用于搜索与指定标识符相匹配的清单的 SQL 查询。您可以从与当前被授权用户有关的所有清单中选择这些标识符。

...

id = Integer.decode(request.getParameter("invoiceID"));

String query = "SELECT * FROM invoices WHERE id = ?";

PreparedStatement stmt = conn.prepareStatement(query);

stmt.setInt(1, id);

ResultSet results = stmt.execute();

...

 

  问题在于开发者没有考虑到所有可能出现的 id 值。虽然接口生成了一个当前用户的标识符清单,但是攻击者可以绕过这个接口,从而获取所需的任何清单。因为此例中的代码没有执行检查,确保用户有权访问需要的清单,所以代码会显示所有清单,即使这些清单并不属于当前用户。

1.2、修复方案:

  与其靠表示层来限制用户输入的值,还不如在应用程序和数据库层上进行 access control。任何情况下都不允许用户在没有取得相应权限的情况下获取或修改数据库中的记录。每个涉及数据库的查询都必须遵守这个原则,这可以通过把当前被授权的用户名作为查询语句的一部分来实现。

 

:以下代码实施了与例 1 相同的功能,但是附加了一个限制,即为当前被授权的用户指定某一特定的获取清单的方式。

...

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();

 

  总之,要防止数据越权的漏洞问题,需要做到以下两个要点:

  a、对需要查询的数据,给sql语句加上数据权限的限定条件,限定数据所属角色。

  b、对于这个加上的数据权限的限定条件,最好是从后台获取,而不是通过前台传入。

转载于:https://www.cnblogs.com/meInfo/p/9004667.html

你可能感兴趣的文章
soapui + groovy 接口自动化测试 第七章
查看>>
[html5] (Notification) 桌面通知
查看>>
【转】iOS开发-文件管理(一)
查看>>
AJAX调用代码实例
查看>>
LR学习路错误总结
查看>>
121. Best Time to Buy and Sell Stock(LeetCode)
查看>>
URL
查看>>
WinAPI WinMain函数
查看>>
tomcat6如何配置ssi使其支持shtml?
查看>>
JavaScript判断页面是否已经加载完毕
查看>>
编程题目:PAT 1009. 说反话 (20)
查看>>
Linux 下C语言 指针学习 二 (数组与指针)
查看>>
阿里云服务器ecs配置之安装tomcat
查看>>
CSS清除浮动常用方法
查看>>
P2839 [国家集训队]middle
查看>>
configparser模块
查看>>
Linux tar 解压的时候报错
查看>>
代码审计_md5()函数
查看>>
nodepad + 插件
查看>>
codeforces 701BCells Not Under Attack
查看>>