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、爆字段
posted @ 2020-09-17 20:54  m0rn00  阅读(766)  评论(0)    收藏  举报