常用的sql注入攻击方法总结

在网站开发中我们一个不小心可能就给人来了一个安全问题,下面我来介绍一些常用的sql注入攻击方法总结,新手朋友们可尝试参考。

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

在用户的输入没有转义字符过滤时,就会发生这种形式的注入或攻击,它会被传递给一个sql语句。这样就会导致应用程序的终端用户对数据库上的语句实施操作。比方说,下面的这行代码就会演示这种漏洞:

代码如下

“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语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:

代码如下

“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错误。例如:

代码如下

Posted in 未分类