SQL注入-SQL注入本质及分类
1、SQL注入本质
SQL注入的本质:把用户输入的数据当作代码执行。
关键条件:1、用户能够控制输入、2、程序拼接用户输入的数据。
例如上图所示:
变量id的值由用户提交,在正常情况下,假如用户输入的是1,那么SQL语句会执行:select * from information where id = 1 limit 0,1但是假如用户输入一段有SQL语义的语句,比如: 1 or 1 =1 %23那么,SQL语句在实际的执行时就会如下:select * from information where id = 1 or 1 = 1 %23
本质原因:未对用户输入进行过滤。
2、SQL注入的分类
SQL注入主要分为三类,带内注入、推测注入、带外注入
1、带内(In-band)SQLi,也叫经典SQLi
顾名思义,带内的意思就是攻击者可以在同一个信道里进行攻击,并且拿到结果。
最常见的两种带内SQLi 就是基于报错(Error-based)的SQLi,和基于联合查询语句(Union-based)的SQLi。
- 基于报错(Error-based)的SQLi
比如mysql中的mysql_error()函数。这种功能本来是为了给开发用来调试代码找问题的。而攻击者可以利用程序中的报错,拿到SQLi的结果。
- 基于联合查询语句(Union-based)的SQLi
利用SQL语句中的UNION操作符拼接两个或更多的SELECT语句,得到一个结果,然后作为HTTP响应返回来的攻击方式。
2、推测SQL注入(盲注)
这种SQLi,跟带内SQLi 相比,可能要花费更长的时间了。这种攻击方式下,攻击者并不能在带内看到SQLi成功的数据结果,但是他可以通过构造大量的SQL语句,通过观察返回的响应来推测数据库中的数据。
盲注分两种:布尔(Boolean-based)盲注,和时间(Time-based)盲注。
- 布尔盲注
布尔盲注,是攻击者通过发起不同请求观察响应内容的相同与否,判断某条SQL判断的结果是TRUE还是FALSE,来间接地猜测数据库中的数据。
- 时间盲注
时间盲注就是攻击者通过注入延时语句(比如sleep )强制数据库延时一种长的时间,用于判断某条判断语句是TRUE还是FALSE,从而间接地猜测数据库中的数据。
3、带外SQLi
依赖于具体的DBMS上是否开启某些发起HTTP/DNS请求的功能。比如SQL Server的xp_dirtree命令,可以用来向攻击者可控的域名发起DNS请求,实现带外注入;比如Oracle数据库的UTL_HTTP包,可以发起HTTP请求。
3、SQL注入位置
SQL注入常见位置如下所示:
|
内部实现/流程角度
|
业务点
|
|
URL 传参
|
查询位置
|
|
表单POST
|
注册、登陆
|
|
User-Agent
|
修改用户信息
|
|
XFF
|
找回密码
|
|
Cookie
|
搜索框
|
|
……
|
……
|
总结如下:用户可以输入的地方、用户可以导入导出的地方、与后端进行查询交互的地方
4、SQL注入的步骤
4.1 SQL注入一般步骤
1、求闭合字符
2、选择注入模式
3、爆数据库
4、爆表名
5、爆列名
6、爆字段

浙公网安备 33010602011771号