Fortify Sql 注入 for Oracle

Posted

技术标签:

【中文标题】Fortify Sql 注入 for Oracle【英文标题】:Fortify Sql Injection for Oracle 【发布时间】:2015-12-19 03:26:48 【问题描述】:

当我使用 fortify 静态代码分析器扫描我的项目时,它会发现 Sql Injection 结果。

在 Recommendations 窗口 fortify 说:“SQL 注入漏洞的根本原因是攻击者能够更改 SQL 查询中的上下文,导致程序员打算解释为数据的值被解释为命令相反,当构建 SQL 查询时,程序员知道什么应该被解释为命令的一部分,什么应该被解释为数据。参数化 SQL 语句可以通过禁止数据导向的上下文更改来强制执行此行为,并防止几乎所有 SQL 注入攻击. 参数化 SQL 语句是使用常规 SQL 字符串构造的,但是当需要包含用户提供的数据时,它们会创建绑定参数,这些参数是随后插入的数据的占位符。绑定参数允许程序显式地向数据库指定什么应该被当作命令,什么应该被当作数据。当程序准备好执行一条语句时,它指定给databa为每个绑定参数的值设置运行时值,而不会有数据被解释为命令的风险。"

请看我的代码。我已经在使用参数化 SQL 语句。那么问题是什么?我错过了什么?

我的代码摘要;

Dim stateid As String = HttpContext.Current.Request.QueryString.Item("stateid"))
Dim colArgs As COLLECTIONS.ParamterCollection
colArgs = New COLLECTIONS.ParamterCollection
colArgs.Add(DATA.DataPreps.PrepStringForDB(stateid ))

Dim sSQL As String  = "SELECT * FROM STATE WHERE N_STATE_ID = :P"

PrepareSQL(sSQL, colArgs, objDBConfigObject)

Dim objCommand  As OracleCommand = new OracleCommand(sSQL, connection)

objCommand.CommandTimeout = m_nConnectionTimeout

For Each objArgument In colArgs
                        objParam = New Oracle.DataAccess.Client.OracleParameter(":P" & CStr(nInArgIndex), objArgument.enOracleType)
                        objParam.Value = objArgument.varValue
                        objCommand.Parameters.Add(objParam)

                        nInArgIndex += 1

                        objArgument = Nothing
                        objParam = Nothing

                    Next

objCommand.CommandType = CommandType.Text
objDataAdapter = New Oracle.DataAccess.Client.OracleDataAdapter(objCommand)
nRecordsAffected = objDataAdapter.Fill(objDataSet)

【问题讨论】:

尝试删除 ':P' 周围的单引号,看看是否会改变结果? 这是我写在这里的错误。没有引号。我编辑了代码 您确定收到这部分代码的警告吗?您的项目中是否还有其他代码不使用参数化查询?我不知道您使用的工具是否包含易于理解的位置信息,但如果没有,您应该能够通过删除您已检查为安全的代码部分轻松检查(您使用 VCS,对?) 并重新运行分析。 这是对我的代码的总结,实际上项目是非常大的分层应用程序。 Fortify 说“OracleServerExecuteQuery() 方法调用使用来自不受信任来源的输入构建的 SQL 查询。此调用可能允许攻击者修改语句的含义或执行任意 SQL 命令。” 【参考方案1】:

您可以使用 DBMS_ASSERT 验证所有用户输入。阅读此内容

http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm#BABIEIFE

【讨论】:

【参考方案2】:

参数化查询不是灵丹妙药。我想补充几点:

    objParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.VarChar(这是db列数据类型)

    确保您正在执行输入验证以消除任何危险的 SQLi 字符。

    对传递的参数执行一些健全性检查。例如,字符串 stateid 的最大字符数是多少?

【讨论】:

以上是关于Fortify Sql 注入 for Oracle的主要内容,如果未能解决你的问题,请参考以下文章

Java中JSON注入的Fortify错误

HP fortify XML 外部实体注入

JAVA代码审计之WebGoat靶场SQL注入

Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密

Fortify 扫出Access control database;return jdbcTemplate.queryForList(sql);sql指令包

Oracle数据库SQL注入浅析与防护建议