Checkmarx在数据库命令中使用AddInParameter方法从 ASP.NET 中的resx文件添加参数查询时出现SQL注入错误

SQL Injection Error from Checkmarx using AddInParameter method in database command to add parameter query from a resx file in ASP.NET

提问人:jpatel 提问时间:8/31/2023 最后编辑:jpatel 更新时间:9/1/2023 访问量:120

问:

这是我的代码:

DataTable proposedDealTable = new DataTable();

if (accountGroupList != null && accountGroupList.Count > 0)
{
    Database database = SqlServerUtility.CreateDatabase();

    string sqlQuery = DealQueries.GetTestExpanded + " ";
    sqlQuery += DealQueries.GetTestExpandedWhereClauseCashBalances;

    string inClause = CommonUtility.ConvertListToCsvString(accountGroupList.ConvertAll(c => c.i_account_group_id.ToString()));
    sqlQuery = sqlQuery.Replace("@i_account_group_id_list", inClause);

    DbCommand dbCommand = database.GetSqlStringCommand(sqlQuery.Replace("testSchemaName",
    ConfigurationManager.AppSettings["SchemaName"].ToString()));

    database.AddInParameter(dbCommand, "@s_row_insrt", DbType.DateTime2, localDayStartTimeInUtc);
    database.AddInParameter(dbCommand, "@localdate", DbType.DateTime2, localdate.Date);
    database.AddInParameter(dbCommand, "@dealtype", DbType.String, DealTypesClassification.IF);

    dbCommand.CommandTimeout = Convert.ToInt32(ConfigurationManager.AppSettings["SqlServerCommandTimeout"]);

    DataSet dataSet = database.ExecuteDataSet(dbCommand);
    proposedDealTable = dataSet.Tables[0];
}

复选标记扫描警报:

在 test-home 上发现一个 SQL 注入漏洞。

应用程序的方法在 \Service\Access\Dao\DealsDao.cs 的第 92 行使用 执行 SQL 查询。应用程序通过嵌入不受信任的 字符串添加到查询中,但未进行适当的清理。串联的字符串被提交到数据库,在那里它被解析并相应地执行。
攻击者可以通过构建恶意负载并通过输入请求提供恶意负载,将任意语法和数据注入 SQL 查询;然后,GetDeals 方法在 \Services\Imple\CService.cs 的第 59 行读取此输入。然后,此输入流经代码,进入查询并流向数据库服务器 - 无需清理。这可能会引发 SQL 注入攻击。
GetDealsCBalancesdbCommand

是代码问题吗?还是复选标记扫描问题?请建议是否需要更改代码。

C# .NET 安全性 SQL 注入 CheckMARX

评论

0赞 Panagiotis Kanavos 8/31/2023
部分问题在于 EntLib Data Access 在过时 18 年后使用它。ADO.NET 2.0 将工厂模型合并到 .NET 本身中。问题的代码将查询字符串中的占位符替换为各种文本,因此是的,可能会导致 SQL 注入或语法错误。如果设置包含怎么办?或?更可疑的是.'inClause 包含什么?SchemaNamedbo.Users; --'RealSchema,sqlQuery.Replace("@i_account_group_id_list", inClause)
0赞 Panagiotis Kanavos 8/31/2023
如果您只使用 ADO.NET,则需要更少的代码。如果要使代码提供程序不可知,请检查 ADO。NET 的 DbProviderFactory 和 DbConnection 示例
2赞 Panagiotis Kanavos 8/31/2023
Dapper 这样的现代微型 ORM 可以将代码减少到只有一行,并将结果映射到对象。.它将自动生成参数化查询,并安全地扩展子句中的类别值。还有一些查询生成器库也可以在运行时安全地创建查询var sales=connection.Query<Sale>("SELECT * from Sales where Region=@region and categoryID in (@categories)",new {Region="Blah", categories=new[]{1,5,8})IN

答: 暂无答案