SQL注入攻击
转载http://blog.jobbole.com/105259/
1.大小写变种
这种技巧适用于关键字阻塞过滤器不聪明的时候,我们可以变换关键字字符串中字符的大小写来避开过滤,因为使用不区分大小写的方式处理SQL关键字。
例如:(下面的代码就是一个简单的关键字阻塞过滤器)
通常的输入过滤器都是在应用程序之外的代码实现的。比如入侵检测系统(IDS),这些系统一般是由原生编程语言开发而成,比如C++,为什么空字节能起作用呢,就是因为在原生变成语言中,根据字符串起始位置到第一个出现空字节的位置来确定字符串长度。所以说空字节就有效的终止了字符串。
只需要在过滤器阻止的字符串前面提供一个采用URL编码的空字节即可,例如:
实际上到目前为止,你在网上大部分搜索SQL注入文章 基本都可以归类到”一阶(first-order)”SQL注入中,因为这些例子涉及的事件均发生在单个HTTP请求和响应中,如下所示:
(1) 攻击者在HTTP请求中提交某种经过构思的输入。
(2) 应用处理输入,导致攻击者注入的SQL查询被执行。
(3) 如果可行的话,会在应用对请求的响应中向攻击者返回查询结果。
另一种不同的SQL注入攻击是”二阶(second-order)”SQL注入,这种攻击的事件时序通常如下所示:
(1) 攻击者在HTTP请求中提交某种经过构思的输入。
(2) 应用存储该输入(通常保存在数据库中)以便后面使用并响应请求。
(3) 攻击者提交第二个(不同的)请求。
(4) 为处理第二个请求,应用会检索已经存储的输入并处理它,从而导致攻击者注入的SQL查询被执行。
(5) 如果可行的话,会在应用对第二个请求的响应中向攻击者返回查询结果。
从字面上来看二阶SQL注入对于新手很难理解,所以我来介绍一个经典的例子帮助大家理解。这是一个个人信息应用程序,我们可以更新我们的用户名,也可以查看我们的个人信息。
第二步查看我们个人信息时的SQL语句:
1
|
select * from users where username = '$name'
|
例如:我们在用户名插入
那么后面我们就执行了语句
1
|
select * from users where username = 'zusheng' or '1'='1'
|
- 第六节 探讨SQL注入防御技巧
6.1、输入验证
输入验证是指要验证所有应用程序接收到的输入是否合法。有两中不同类型的输入验证方法:白名单和黑名单验证
- 白名单验证:比如id值,那么我们判断它是否为数字。
- 黑名单验证:使用正则表达式禁止使用某些字符和字符串
应该尽量使用白名单,对于无法使用白名单的,使用黑名单提供局部限制。
6.2、编码输出
我们除了要验证应用程序收到的输入以外,还要对数据进行编码,这样不仅可以防御SQL注入攻击,还能防止出现其他问题,比如XSS