【问题标题】:Checkmarx: Second-Order SQL Injection attack in c#Checkmarx:c# 中的二阶 SQL 注入攻击
【发布时间】:2017-05-23 20:13:48
【问题描述】:

我如何满足静态代码分析工具(在本例中为 checkmarx)以下方法没有问题:

public OdbcDataReader ExecuteQuery(string sql)
{
   var cmd = new OdbcCommand(sql, connection);
   return cmd.ExecuteReader();
}

Checkmarx 告诉我以下内容:

方法 ExecuteQuery 从 ExecuteReader 元素获取数据库数据。 然后这个元素的值流经代码 未经适当消毒或验证,并最终 在 ExecuteQuery 方法中的数据库查询中使用。 这可能会导致二阶 SQL 注入攻击。

【问题讨论】:

  • 在“sql”到达您的 ExecuteQuery 方法之前,是否对它进行了任何类型的输入清理?我推断分析工具看到'sql'进入,然后在 ExecuteReader 触发之前被传递到 OdbcCommand 对象的构造函数中...
  • SQL 在 Web 服务器端是硬编码的。它使用 String.Format 代替参数
  • 好吧,不幸的是,就 SQL 注入(直接字符串而不是参数化查询)而言,这或多或少是不做的事情 101。除非我误解了情况,否则你能不能在这个方法中至少做一些卫生检查?
  • @Robben_Ford_Fan_boy -- 该工具告诉您不要使用 String.Format -- 更改为参数化查询,消息就会消失。你们可以将输入清理为字符串格式——这要困难得多

标签: c# security sql-injection checkmarx


【解决方案1】:

这样做让 CheckMarx 满意:

public OdbcDataReader ExecuteQuery(string sql)
{
    var cmd = new OdbcCommand(sql.Replace("'", ""), connection);
    return cmd.ExecuteReader();
}

有趣的是,我自己扫描了该方法,使用命令并不满足:

public OdbcDataReader ExecuteQuery(string sql)
    {
        OdbcCommand cmd = connection.CreateCommand();
        cmd.CommandText = sql;
        return cmd.ExecuteReader();
    }

【讨论】:

  • 请注意,您只是在隐藏问题,您的代码仍然可能容易受到聪明的攻击者的攻击(该工具更难为您提供高度确定性的明确结果。看其他查询的结果,“风险”较低)。
  • 另外,简单地将 sql 从命令构造函数中分离出来并没有什么不同。你为什么会期望它?相反,您应该使用存储过程(而不是硬编码的 SQL 查询字符串),并通过将 CommandType 设置为 StoredProcedure 来创建命令。
  • 修复,var cmd = new OdbcCommand(sql.Replace("'", ""), connection); ,也为我工作。非常感谢
猜你喜欢
  • 2014-02-16
  • 2015-10-03
  • 2019-08-10
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多