ITtanH 2022-06-13 13:36
浏览 1153
已结题

fortify 代码扫描 出现Access Control: Database 解决不了

在项目上线的时候 使用fortify 扫描代码 出现
Results Outline
Access Control Database (98 issues)
Abstract
如果没有适当的 access control,就会执行一个包含用户控制主键的 SQL 指令,从而允许攻击者访问未经授
权的记录。
Explanation
Database access control 错误在以下情况下发生 1. 数据从一个不可信赖的数据源进入程序。 2. 这个数据
用来指定 SQL 查询中主键的值。 示例 1 以下代码使用可转义元字符并防止出现 SQL 注入漏洞的参数化语
句,以构建和执行用于搜索与指定标识符 [1] 相匹配的清单的 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 值。虽然界面生成了属于当前用户的清单标识符列表,但是攻
击者可以绕过这个界面,从而获取所需的任何清单。由于此示例中的代码没有执行检查以确保用户具有访问
所请求清单的权限,因此它会显示任何清单,即使此清单不属于当前用户。 有些人认为在移动世界中,典型
的 Web 应用程序漏洞(如 Database access control 错误)是无意义的 -- 为什么用户要攻击自己?但是,谨
记移动平台的本质是从各种来源下载并在相同设备上运行的应用程序。恶意软件在银行应用程序附近运行的
可能性很高,它们会强制扩展移动应用程序的攻击面(包括跨进程通信)。 示例 2 以下代码会调整
Example 1 以适应 Android 平台。
String id = this.getIntent().getExtras().getString("invoiceID");
String query = "SELECT * FROM invoices WHERE id = ?";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE,
null);
Cursor c = db.rawQuery(query, new Object[]{id});

许多现代 Web 框架都会提供对用户输入执行验证的机制(包括 Struts 和 Spring MVC)。为了突出显示未经
验证的输入源,Fortify 安全编码规则包会对 Fortify Static Code Analyzer(Fortify 静态代码分析器)报告的问
题动态重新调整优先级,即在采用框架验证机制时降低这些问题被利用的几率并提供指向相应证据的指针。
我们将这种功能称之为上下文敏感排序。为了进一步帮助 Fortify 用户执行审计过程,Fortify 软件安全研究团
队开发了 Data Validation(数据验证)项目模板,该模板根据应用于输入源的验证机制按文件夹对问题进行
了分组。
Recommendation
与其靠表示层来限制用户输入的值,还不如在应用程序和数据库层上进行 access control。任何情况下都不允
许用户在没有取得相应权限的情况下获取或修改数据库中的记录。每个涉及数据库的查询都必须遵守这个原
则,这可以通过把当前被授权的用户名作为查询语句的一部分来实现。 示例 3 以下代码实现的功能与
Example 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);
Jun 10, 2022, 5:11 PM
© Copyright [2008-2022] Micro Focus or one of its affiliates.
7
stmt.setString(2, userName);
ResultSet results = stmt.execute();

下面是 Android 的等同内容

PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String id = this.getIntent().getExtras().getString("invoiceID");
String query = "SELECT * FROM invoices WHERE id = ? AND user = ?";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE,
null);
Cursor c = db.rawQuery(query, new Object[]{id, userName});

下面是扫出来部分代码

 @Override
912  public void toExaminesIsNo(List<Long> id) {
913  AssertionUtil.isObjectNull(id"鍙傛暟寮傚父");
914  List<BasicInfoPersistence> basicInfos = 
basicInfoPersistenceMapper.selectByIds(RegexHelper.trick(id,null));
915  if(basicInfos.isEmpty()){
916  throw new GlobleException("鏃犳晥鍙傛暟");
917  } 
        basicInfo.setExamine_name(CurrentPrincipalHolder.getUsername());
925  //璁剧疆瀹℃牳鏃堕棿
926  basicInfo.setExamine_time(FastDateFormat.getInstance("yyyy-MM-dd").format(new Date()));
927  basicInfoPersistenceMapper.updateById(basicInfo);
928  });
929  }

使用对象包了一层,还是会被扫出来

```java

/**
     * 诱骗行为不可取。
     * 
     * @param obj
     * @param arg
     * @return
     */
    
public static <T> T trick(T obj, Object arg) {
        return obj;
    }
public class Detour <T> {
    private String temp;
    private T convert;

    public T getConvert() {
        return convert;
    }

    public void setConvert(T convert) {
        this.convert = convert;
    }

    public String getTemp() {
        return temp;
    }
    private void setTemp(String temp) {
        this.temp = temp;
    }
    private String filter(String temp){
        return StringEscapeUtils.escapeSql(StringEscapeUtils.escapeJavaScript(StringEscapeUtils.escapeHtml(temp)));
    }
    public Detour(String temp){
        this.setTemp(filter(temp));
    }
    public Detour(T temp){
        this.setConvert(temp);
    }

    public Detour() {
    }
}

并且在没有加参数去查数据库 也会被扫出来

266  //鎷垮埌鎵�鏈夌殑鐪佺骇鍗曚綅
267  List<Organization> organizations = organizationMapper.selectOne();
268  if (organizations.isEmpty()) {
269  throw new GlobleException("鏃犳晥鏁版嵁");
270  }


使用的mybatis框架 ,并且开启了预编译配置

img

但是在进行参数是字符串查数据库时 上面我进行string过滤后 好像就没有扫出来了,
现在就是在进行 update修改时带入参数是对象 就不知道该怎么办了,之前同事也扫描了代码 但是没有出现我这个问题呢

我是实在没得办法了呢

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月21日
    • 创建了问题 6月13日

    悬赏问题

    • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
    • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
    • ¥300 寻抓云闪付tn组成网页付款链接
    • ¥15 请问Ubuntu要怎么安装chrome呀?
    • ¥15 视频编码 十六进制问题
    • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
    • ¥15 FileNotFoundError 解决方案
    • ¥15 uniapp实现如下图的图表功能
    • ¥15 u-subsection如何修改相邻两个节点样式
    • ¥30 vs2010开发 WFP(windows filtering platform)