SQL注入总结

SQL注入第一次为公众所知,是在1998年的著名黑客杂志《Phrack》第54期上,一位叫rfp的黑客发表的一篇题为“NT Web Technology Vulnerabilities”的文章。(http://phrack.org/issues/54/8.html#article

注入攻击的本质,是把用户输入的数据当做代码执行。注入攻击有两个关键条件:

  1. 用户能控制数据的输入。
  2. 原本要执行的代码,拼接了用户的输入。

 

 

SQL注入攻击技巧

1. 盲注(Blind Injection)

在SQL注入过程中,如果网站的web服务器开启了错误回显,错误回显披露了敏感信息,则会为攻击者提供极大的便利。很多时候,web服务器关闭了错误回显,为此攻击者研究出了“盲注”的技巧。

所谓“盲注”,就是在服务器没有回显时完成注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的调试信息,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。

最常见的盲注的验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。如下例:

  1. 攻击者先输入条件“and 1=1”,服务器返回正常页面,这是因为“and”语句成立。
  2. 再输入条件“and 1=2”, SQL语句执行后,因为1=2永远不可能为真,因此SQL语句无法返回查询到的数据。

由此可以判断漏洞存在。

 

2. Timing Attack

在MySQL中,有一个BENCHMARK()函数,它是用于测试性能的。它有两个参数BENCHMARK(count, expr), 函数执行的结果,是将表达式expr执行count次。因此,利用BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间的长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中被称为Timing Attack。

在不同的数据库中,都有类似的BENCHMARK()的函数,可以被Timing Attack所利用。

MySQL

BENCHMARK(100000,md5(1))

or SLEEP(5)

PostgreSQL

PG_SLEEP(5)

or GENERATE_SERIES(1, 100000)

MS SQL ServerWAITFOR DELAY '0:0:5'

3. 命令执行

在MySQL中,除了可以通过导出webshell间接地执行命令外,还可以利用“用户自定义函数”的技巧,即UDF(User-Defined Functions) 来执行命令。在流行的数据库中,一般都支持从本地文件系统中导入一个共享文件作为自定义函数。

后来安全研究者在MySQL中找到,通过lib_mysqludf_sys 提供的几个函数执行系统命令,其中最主要的是sys_eval() 和 sys_exec()。

在MS SQL Server 中,则可以直接使用存储过程“xp_cmdshell” 执行系统命令。

在Oracle数据库中,如果服务器同时还有Java 环境,那么也可能造成命令执行。当SQL注入后可以执行多语句的情况下,可以在Oracle中创建Java的存储过程执行系统命令。

 

4. 攻击存储过程

在MS SQL Server 和 Oracle 数据库中,都有大量内置的存储过程。在注入攻击的过程中,存储过程将为攻击者提供很大的便利。如MS SQL Server中的存储过程”xp_cmdshell“。

 

5. 编码问题

在有时候,不同的字符编码也可能导致一些安全问题。在注入的历史上,曾经出现过”基于字符集“的注入技巧。注入攻击中常常会用到单引号”‘“、双引号”’“等特殊字符。

 

6. SQL Column Truncation

在MySQL 的配置选项中,有一个sql_mode选项。当MySQL的sql-mode设置为default时,即没有开启STRICT_ALL_TABLES选项时,MySQL对于用户插入的超长值只会提示warnning,而不是error(如果是error则插入不成功),这可能导致发生一些”截断“问题。

 

防御SQL注入

1. 使用预编译语句

一般来说,防御SQL注入的最佳方式,就是使用预编译语句,绑定变量。

 

2. 使用存储过程 

我们还可以使用安全的存储过程对抗SQL注入。使用存储过程的效果和使用预编译语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题,因此应该尽量避免在存储过程内使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。

 

3. 检查数据类型

检查输入数据的数据类型,在很大程度上可以对抗SQL注入。

 

4. 使用安全函数

一般来说,各种Web语言都实现了一些编码函数,可以帮助对抗SQL注入。

 

5. 统一字符集

需要统一数据库、操作系统、Web应用所使用的字符集,以避免各层对字符的理解存在差异。统一设置为UTF-8 是一个很好的办法。

 

6. 数据库自身

在设计数据库安全方案时,可以禁止普通数据库用户具备操作文件的权限。在建立数据库账户是应遵循“最小权限原则”, 避免Web应用直接使用root、dbowner等高权限账户直接连接数据库。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值