如何在Oracle上进行SQL注入

如何在Oracle上进行SQL注入,oracle,oracle10g,sql-injection,Oracle,Oracle10g,Sql Injection,我正在对一个系统进行审计,开发人员坚持认为它是SQL注入的证明。他们通过去掉登录表单中的单引号来实现这一点,但是后面的代码没有参数化;它仍在使用文字SQL,如下所示: username = username.Replace("'", ""); var sql = "select * from user where username = '" + username + "'"; 这真的安全吗?是否有另一种插入单引号的方法,可能是使用转义字符?正在使用的数据库是Oracle 10g。那么,没有人可

我正在对一个系统进行审计,开发人员坚持认为它是SQL注入的证明。他们通过去掉登录表单中的单引号来实现这一点,但是后面的代码没有参数化;它仍在使用文字SQL,如下所示:

username = username.Replace("'", "");
var sql = "select * from user where username = '" + username + "'";

这真的安全吗?是否有另一种插入单引号的方法,可能是使用转义字符?正在使用的数据库是Oracle 10g。

那么,没有人可以在他们的系统中使用像O'Brian这样的名字

如果参数为数字,则单引号检查将无效-然后
1;删除表用户--会引起一些麻烦=)

我想知道他们如何处理日期


如果执行查询的机制变得像PHP一样智能,并且将查询限制为只运行一个查询,那么注入攻击就不应该有问题了……

也许你也可以让它们失败,因为不使用绑定变量会对性能产生非常负面的影响。

看看这里的测试指南:这应该会给你更多的测试场景,可能足以促使重新评估SQL编码策略:-)

一些提示:
1-不一定是可以用作引号的“字符”。试试这个:

select q'#Oracle's quote operator#' from dual;

2-《无辜代码》一书中的另一个技巧是:不要通过对无效输入进行处理来使其有效(通过转义或删除)。阅读本书的相关章节,了解一些非常有趣的例子。规则摘要为。

否,它不安全。SQL注入不需要单个引号字符就可以成功。您可以使用AND、OR、JOIN等使其发生。例如,假设一个web应用程序的URL如下:
http://www.example.com/news.php?id=100


如果未正确验证ID参数,则可以执行许多操作。例如,如果未选中其类型,则可以简单地使用以下命令:
?id=100并将其插入新闻(id…)值(…)
。这同样适用于JOIN等。我不会教你如何探索它,因为并不是所有的读者都像你一样有良好的意图。因此,对于计划使用简单替换的用户,请注意这不会阻止攻击。

什么是客户端语言?也就是说,我们必须确切地确定用户名的数据类型是什么,以及Replace方法对该数据类型做了什么。以及该数据类型的实际连接工作方式。可能会有一些字符集转换,将UTF-8中类似引号的字符转换为“常规”引号

对于您展示的非常简单的示例,它应该可以正常工作,但性能将非常糟糕(根据Thilo的评论)。您需要查看游标共享的选项

对于此SQL

select * from user where username = '[blah]'
只要[blah]没有包含单个引号,就应该将其解释为单个字符值。如果字符串超过4000字节,它将引发一个错误,我很想看看是如何处理的。类似地,空字符串或仅由单引号组成的字符串。控制字符(例如文件末尾)也可能会给它带来一些问题,但这可能取决于是否可以在前端输入它们

对于用户名,将字符集限制为字母数字是合法的,并且可能限制为一组标点符号(可能是点和下划线)。因此,如果您确实采用了字符过滤方法,我更希望看到可接受字符的白名单,而不是将单引号、控制字符等列入黑名单


总之,作为一种通用方法,它的安全性较差,并且会对性能产生负面影响。在特定情况下,它可能(可能?)不会暴露任何漏洞。但是你需要做大量的测试以确保它不会出现。

第67页-Oracle黑客手册使用O'Brien作为PL/SQL注入的一个例子:我提到的一个是规则#16。同意。试图向我的一些同行开发人员解释这一点,他们的回答是,这是Oracle的另一个问题。事实上,我在SQL注入行方面比在性能行方面更幸运。谢谢-这个链接足够好,可以给你一个答案:)+1用于引用,即使您不知道它(例如,字符集翻译):)