SQL注入漏洞

NJM*_*JMR 4 c# sql-server sql-injection

我正在开发一个客户端已在代码中报告SQL注入漏洞的项目.这是我的代码......

1 public int ExecuteNonQuery(string query, SqlParameter[] parameters)
2 {
3   using (SqlCommand command = CreateCommand(query, parameters))
4   {
5       int rowsAffected = command.ExecuteNonQuery();
6       return rowsAffected;
7   }
8 }
Run Code Online (Sandbox Code Playgroud)

CreateCommand方法去为

private SqlCommand CreateCommand(string commandText, SqlParameter[] parameters)
{
    SqlCommand retVal = this.connection.CreateCommand();
    retVal.CommandText = commandText;
    retVal.CommandTimeout = this.commandsTimeout;
    retVal.Parameters.AddRange(parameters);
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

该缺陷报告在第3行.我无法理解这里发生了什么样的攻击,因为这是一个控制台应用程序.但我必须修复这个缺陷,我不知道如何修复它.

查询是

@"delete from {0} where runId in 
( select runId from {0}
  inner join 
    ( select sId as sId_last,
        wfId as wfId_last,
        max(runId) as runId_last from {0} where endTime is NULL
        group by sId, wfId ) t1
  on endTime is NULL and sId = sId_last and wfId = wfId_last
  and (runId <> runId_last or startTime < @aDateTime)
)";
Run Code Online (Sandbox Code Playgroud)

帮助赞赏.谢谢.

xan*_*tos 5

代码是无注入的...但请注意,调用的方法ExecuteNonQuery可以query通过组合字符串来构建.

当您执行以下操作时会发生注入攻击:

string name = ...; // A name selected by the user.
string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
Run Code Online (Sandbox Code Playgroud)

因此,当您使用外部来源的文本撰写查询时.

请注意,更精细的注入攻击可能是多级的:

string name = // The result of a query to the db that retrieves some data
              // sadly this data has been manipulated by the attacker

string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
Run Code Online (Sandbox Code Playgroud)

通常,您不需要用户界面来引起注入攻击......

您可以从网站/数据库中查询某些内容,并使用未经过验证的结果来查询数据库(如上例所示),从而导致注入攻击......或者甚至使用配置文件的内容可能会导致注入攻击:修改配置文件所需的权限可能与在数据库上执行操作所需的权限不同,恶意用户可以拥有修改配置文件但不能直接访问数据库的权限.因此他可以将该程序用作对抗DB的特洛伊木马.

关于查询

该查询的弱点(即字符串的组合)在于如何{0}计算.它是在一组固定字符串中选择的字符串吗?就像是:

string tableName;

if (foo)
   tableName = "Foo";
else if (bar)
   tableName = "Bar";
Run Code Online (Sandbox Code Playgroud)

还是更受用户控制的东西?

如果表名在代码中是固定的,则不应该有任何注入攻击.如果从一些用户输入/用户可以访问的其他表中"提取"表名,我们将回到之前显示的问题.