快捷搜索:

SQL攻击:防御和检查SQL注入的手段

虽然前面有许多文章评论争论了SQL注入,但本日所评论争论的内容大概可赞助你反省自己的办事器,并采取响应警备步伐。知彼亲信,方可取胜。首先要清楚SQL注入进击有哪些种类。

察看迩来的一些安然事故及其后果,安然专家们已经获得一个结论,这些要挟主如果经由过程SQL注入造成的。虽然前面有许多文章评论争论了SQL注入,但本日所评论争论的内容大概可赞助你反省自己的办事器,并采取响应警备步伐。

SQL注入进击的种类

知彼亲信,方可取胜。首先要清楚SQL注入进击有哪些种类。

1.没有精确过滤转义字符

在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式进击,它会被通报给一个SQL语句。这样就会导致利用法度榜样的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种破绽:

statement := "SELECT * FROM users WHERE name = '" + userName + "';"

这种代码的设计目的是将一个特定的用户从其用户表中掏出,然则,假如用户名被一个恶意的用户用一种特定的要领捏造,这个语句所履行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:

a' or 't'='t,此时原始语句发生了变更:

SELECT * FROM users WHERE name = 'a' OR 't'='t';

假如这种代码被用于一个认证历程,那么这个例子就能够逼迫选择一个合法的用户名,由于赋值't'='t永世是精确的。

在一些SQL办事器上,如在SQL Server中,任何一个SQL敕令都可以经由过程这种措施被注入,包括履行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上便是走漏了每一个用户的信息)。

a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '%

这就将终极的SQL语句变成下面这个样子:

SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT *

FROM DATA WHERE name LIKE '%';

其它的SQL履行不会将履行同样查询中的多个敕令作为一项安然步伐。这会防止进击者注入完全自力的查询,不过却不会阻拦进击者改动查询。

2.Incorrect type handling

假如一个用户供给的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的进击。当在一个SQL语句中应用一个数字字段时,假如法度榜样员没有反省用户输入的合法性(是否为数字型)就会发生这种进击。例如:

statement := "SELECT * FROM data WHERE id = " + a_variable + ";"

从这个语句可以看出,作者盼望a_variable是一个与“id”字段有关的数字。不过,假如终端用户选择一个字符串,就绕过了对转义字符的必要。例如,将a_variable设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users;

3.数据库办事器中的破绽

无意偶尔,数据库办事器软件中也存在着破绽,如MYSQL办事器中mysql_real_escape_string()函数破绽。这种破绽容许一个进击者根据差错的统一字符编码履行一次成功的SQL注入式进击。

4.盲目SQL注入式进击

当一个Web利用法度榜样易于遭受进击而其结果对进击者却不见时,就会发生所谓的盲目SQL注入式进击。有破绽的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不合的内容。这种进击相称耗时,由于必须为每一个得到的字节而精心构造一个新的语句。然则一旦破绽的位置和目标信息的位置被确立今后,一种称为Absinthe的对象就可以使这种进击自动化。

5.前提相应

留意,有一种SQL注入迫使数据库在一个通俗的利用法度榜样屏幕上谋略一个逻辑语句的值:

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1

这会导致一个标准的面面,而语句

SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在页面易于受到SQL注入式进击时,它有可能给出一个不合的结果。如斯这般的一次注入将会证实盲目的SQL注入是可能的,它会使进击者根据别的一个表中的某字段内容设计可以评判真伪的语句。

6.前提性缺点

假如WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起差错的语句,从而导致一个SQL差错。例如:

SELECT 1/0 FROM users WHERE username='Ralph'。显然,假如用户Ralph存在的话,被零除将导致差错。

7.光阴耽误

光阴耽误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎履行一个长行列步队或者是一个光阴耽误语句。进击者可以衡量页面加载的光阴,从而抉择所注入的语句是否为真。

以上仅是对SQL进击的粗略分类。但从技巧上讲,如今的SQL注入进击者们在若何找出有破绽的网站方面加倍智慧,也加倍周全了。呈现了一些新型的SQL进击手段。黑客们可以应用各类对象来加速破绽的使用历程。我们不妨看看the Asprox Trojan这种木马,它主要经由过程一个宣布邮件的僵尸收集来传播,其全部事情历程可以这样描述:首先,经由过程受到节制的主机发送的垃圾邮件将此木马安装到电脑上,然后,受到此木马感染的电脑会下载一段二进制代码,在其启动时,它会应用搜索引擎搜索用微软的ASP技巧建立表单的、有破绽的网站。搜索的结果就成为SQL注入进击的靶子清单。接着,这个木马会向这些站点发动SQL注入式进击,使有些网站受到节制、破坏。造访这些受到节制和破坏的网站的用户将会受到诈骗,从别的一个站点下载一段恶意的JavaScript代码。着末,这段代码将用户指引到第三个站点,这里有更多的恶意软件,如偷取口令的木马。

曩昔,我们常常警告或建议Web利用法度榜样的法度榜样员们对其代码进行测试并打补丁,虽然SQL注入破绽被发明和使用的机率并不太高。但迩来进击者们越来越多地发明并恶意地使用这些破绽。是以,在支配其软件之前,开拓职员该当加倍主动地测试其代码,并在新的破绽呈现后急速对代码打补丁。

防御和反省SQL注入的手段

1.应用参数化的过滤性语句

要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰好相反,用户的输入必须进行过滤,或者应用参数化的语句。参数化的语句应用参数而不是将用户输入嵌入到语句中。在多半环境中,SQL语句就得以修正。然后,用户输入就被限于一个参数。下面是一个应用Java和JDBC API例子:

PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE

PASSWORD=?");

prep.setString(1, pwd);

总体上讲,有两种措施可以包管利用法度榜样不易受到SQL注入的进击,一是应用代码复查,二是逼迫应用参数化语句的。逼迫应用参数化的语句意味着嵌入用户输入的SQL语句在运行时将被回绝。不过,今朝支持这种特点的并不多。如H2 数据库引擎就支持。

2.还要避免应用解释法度榜样,由于这恰是黑客们借以履行不法敕令的手段。

3.警备SQL注入,还要避免呈现一些具体的差错消息,由于黑客们可以使用这些消息。要应用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。

4.应用专业的破绽扫描对象。但防御SQL注入进击也是不敷的。进击者们今朝正在自动搜索进击目标并实施进击。其技巧以致可以随意马虎地被利用于其它的Web架构中的破绽。企业该当投资于一些专业的破绽扫描对象,如大年夜名鼎鼎的Acunetix的Web破绽扫描法度榜样等。一个完善的破绽扫描法度榜样不合于收集扫描法度榜样,它专门查找网站上的SQL注入式破绽。最新的破绽扫描法度榜样可以查找最新发明的破绽。

5.着末一点,企业要在Web利用法度榜样开拓历程的所有阶段实施代码的安然反省。首先,要在支配Web利用之前实施安然测试,这种步伐的意义比曩昔更大年夜、更深远。企业还该当在支配之后用破绽扫描对象和站点监视对象对网站进行测试。

Web安然拉警报已经响起,安然形式非常严酷,企业绝对不该当草率从事。安然重于泰山!

您可能还会对下面的文章感兴趣: