即使删除了'字符,有什么方法可以注入SQL?
如果从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 * FROMthingy
WHERE 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"。