Fortify漏洞之Access Control: Database(数据越权)
Posted 猪崽辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fortify漏洞之Access Control: Database(数据越权)相关的知识,希望对你有一定的参考价值。
继续对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、对于这个加上的数据权限的限定条件,最好是从后台获取,而不是通过前台传入。
以上是关于Fortify漏洞之Access Control: Database(数据越权)的主要内容,如果未能解决你的问题,请参考以下文章
Fortify漏洞之Path Manipulation(路径篡改)
Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)
Fortify漏洞之Portability Flaw: File Separator 和 Poor Error Handling: Return Inside Finally
Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密