即使删除了'字符,有什么方法可以注入SQL?

时间:2020-03-05 18:55:47  来源:igfitidea点击:

如果从SQL查询中删除了所有的'字符,是否还有其他方法可以对数据库进行SQL注入攻击?

怎么做到呢?谁能给我例子吗?

解决方案

回答

是的,取决于我们使用的语句。我们最好使用存储过程或者至少使用参数化查询来保护自己。

有关预防样本,请参见WikiPedia。

回答

。 。 。大概有五千万种其他方式

也许像" 5"之类的东西;下桌员工; --`

产生的sql可能类似于:
在数字= 5的地方选择*;下桌员工; -和sadfsf`

(--发表评论)

回答

这取决于我们如何组合查询,但从本质上讲是这样。

例如,在Java中,如果要执行此操作(故意过高的示例):

String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

那么我们很有可能会遭受注射攻击。

Java有一些有用的工具可以防止这些攻击,例如PreparedStatements(在其中传递" SELECT NAME_ from Customer WHERE ID =?"之类的字符串,而JDBC层则在为我们替换?令牌的同时处理转义),但是还有其他一些语言对此没有太大帮助。

回答

是的,绝对是:根据SQL方言等,有许多不使用撇号的实现注入的方法。

防止SQL注入攻击的唯一可靠防御方法是使用数据库接口提供的参数化SQL语句支持。

回答

就在这里。维基百科摘录

`" SELECT * FROM data where id =" + a_variable +";"

从该陈述中可以清楚地看出,作者希望a_variable为与" id"字段相关的数字。但是,如果实际上是字符串,则最终用户可以按自己的选择操作该语句,从而避免了对转义字符的需求。例如,将a_variable设置为

1; DROP TABLE用户

将从数据库中删除(删除)"用户"表,因为SQL的呈现方式如下:

SELECT * FROM DATA WHERE ID = 1; DROP TABLE用户;

SQL注入不是简单的攻击方法。如果我是你,我会做非常仔细的研究。

回答

撇号可能是真正的输入,当在代码中使用内联SQL时,我们必须通过加倍来避免它们。我们正在寻找的是一个正则表达式模式,例如:

\;.*--\

用来提前结束真正语句的半冒号,先注入一些SQL,然后再加上双连字符以注释掉原始真正语句中的尾随SQL。连字符可以在攻击中省略。

因此,答案是:不,仅删除撇号并不能保证SQL注入的安全性。

回答

与其试图找出要过滤掉的字符,不如我坚持使用参数化查询,并彻底消除问题。

回答

是的,这绝对有可能。

如果我们有一种形式,希望下一个SELECT语句成为整数,则可以输入类似的内容:

SELECT * FROMthingyWHERE attributeID =

  • 5(好答案,没问题)
  • 5; DROP表users; (不好,不好,不好...)

以下网站详细介绍了经典的SQL注入技术:SQL注入速查表。

使用参数化查询或者存储过程并不是更好。这些只是使用传递的参数进行的预制查询,这些参数也可以作为注入源。此页面上也有描述:在SQL中攻击存储过程。

现在,如果我们禁止使用简单的引号,则只能防止一组给定的攻击。但不是所有人。

与往常一样,不要信任来自外部的数据。在以下3个级别过滤它们:

  • 明显内容的界面级别(下拉选择列表比自由文本字段更好)
  • 与数据性质(整数,字符串,长度),权限(此用户可以在此页面上使用此类型的数据)相关的检查的逻辑级别...
  • 数据库访问级别(转义简单引号...)。

玩得开心,别忘了查看WikiPedia的答案。

/维

回答

此外,即使我们只查找单引号,也不想删除它。我们想逃脱它。我们可以通过用两个撇号替换每个撇号来实现。

但是参数化查询/存储过程要好得多。

回答

参数化的嵌入式SQL或者参数化的存储过程是保护自己的最佳方法。正如其他人指出的那样,仅剥离/转义单引号字符是不够的。

我们会注意到,我专门谈论"参数化"存储过程。如果我们还原为将过程的传递参数串联在一起,则仅使用存储过程是不够的。换句话说,将完全相同的易受攻击的SQL语句包装在存储过程中不会使其变得更安全。我们需要像使用内联SQL一样在存储过程中使用参数。

回答

我只能重复别人说的话。参数化的SQL是必经之路。当然,对接编码有点麻烦,但是一旦完成一次,剪切并粘贴该代码并进行所需的修改就不难了。我们有很多.Net应用程序,它们允许网站访问者指定整个范围的搜索条件,并且代码可以即时构建SQL Select语句,但是用户可能输入的所有内容都将成为参数。

回答

我建议我们将变量作为参数传递,而不要构建自己的SQL。否则,总会有一种以我们目前不知道的方式进行SQL注入的方法。

我们创建的代码如下:

' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));

如果名字像我的名字一样,其中有一个'。令人讨厌的是,所有的'-字符都被删除或者标记为无效。

我们可能还想看看有关SQL注入的Stackoverflow问题。

回答

当期望数字参数时,应该始终验证输入以确保它是数字。除了帮助防止注入外,验证步骤还将使该应用程序更加用户友好。

如果我们期望id = 1044时收到id =" hello",最好还是向用户返回有用的错误,而不要让数据库返回错误。

回答

由于这是一个相对较老的问题,因此我不会费心编写一个完整而全面的答案,因为一个或者多个张贴者在此提到了该答案的大多数方面。
但是,我确实有必要提出SQL Smuggling所没有解决的另一个问题。在某些情况下,即使我们试图删除引号字符',也可以将其"走私"到查询中。实际上,即使我们使用了正确的命令,参数,存储过程等,这也是可能的。

在http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf上查看完整的研究论文(公开,我是这方面的主要研究人员),或者只是在Google中搜索" SQL Smuggling"。