——鲁迅曾经说过:“有数据库的地方就有SQL注入”

一、SQL注入分类

按数据类型分:

1、数字类型
后台语句可能为:

1
2
$id =  $_POST['id']
select user,password from users where id = $id ;

2、字符类型

1
2
$id =  $_POST['id']
select user,password from users where id ='$id' ;
  • 数字类型直接将后台接收到的数据内容带到数据库中执行;字符型将接收到的内容添加引号直接带到数据库中执行
  • 字符型注入需要考虑语句的闭合问题,而数字类型则不存在

按注入位置分

1、GET方式注入
注入参数以get方式进行提交
2、POST方式注入
注入参数以post方式进行提交
3、基于COOKIE的注入
后台接收cookie内的参数,在http的cookie字段存在注入漏洞
4、基于http头部的注入
后台会接收referer或user-agent字段的参数,http头部中的referer、user-agent字段中存在注入漏洞

盲注

1、基于布尔的盲注
特点: 网站页面在输入条件为TRUE和FALSE的情况下回显示不同,但页面中没有输出。此时需要在SQL语句后添加提哦啊见判断
猜解思路:

  • 猜数据库:先构造条件判断当前数据库的名字长度,然后逐字猜解数据库名。
  • 猜数据表:先构造条件判断数据表的数量,然后猜解,先猜长度然后猜表名。
  • 猜解数据列:指定数据库中的指定表进行猜解字段,先猜字段数目,再猜字段
  • 猜解内容:指定数据列,先查询数据的条数,然后猜内容

2、基于时间的盲注
特点: 网站页面在输入条件为真和为假返回的页面相同,但通过延时函数构造语句,可通过页面响应时间的不同判断是否存在注入
猜解思路:

  • 类似基于布尔的盲注,只是将条件为真转换为延时响应

常用函数

  • if(condition,A,B):若condition返回真则执行A,假则执行B

  • substr(str,A,B):字符串截取函数,截取str字符串从A位置开始,截取B个字符

  • left(str,A):类似字符串截取函数,返回str字符串从左往右数的A个字符

  • count(A):计算A的数目,常用与查询数据表、数据列、数据内容的条数

  • len(A):计算A的长度,常用于返回数据库名、数据表名、数据列名的长度

  • ascii(A):返回A的ascii码,当逐字猜解限制单引号的输入时,可以通过查询ascii码来绕过

基于UNION的注入

联合注入
首先通过order by 进行判断查询参数的数目,然后构造union查询,查看回显。有时需要将前面参数名修改为假的参数。如id=-10’ union select 1,2,查找页面中1和2的位置,在页面中显示的数字的地方构造查询的内容。
若页面无回显但报错可以尝试报错注入

基于报错的注入

常用函数

updatexml(1,concat(‘‘,SQL语句,’‘),1)

extractvalue(1,concat(‘~’,(SQL语句)))

宽字节注入

宽字节注入的原理即为数据库的编码与后台程序的编码不一致,数据库中一个字符占两个字节,而后台程序为一个字符占一个字节,当后台程序对输入的单引号的字符进行转义时,通过在这些转义的字符前输入%bf然后将%bf’带入后台程序时会转义为%bf’,此时带入数据库中,数据库将%bf\看作是一个中文字符从而使用单引号将SQL语句进行闭合。

基于base64加密注入

后台程序在接收用户输入的参数后先进行base64解码然后带入到SQL语句中执行。所以这种类型的注入首先需要将payload进行base64加密

搜索型注入

当搜索关键字时,后台SQL语句可能为:select username from users where id='%$id%',此时构造闭合语句时需要考虑%的闭合

二、SQL注入的产生条件

1、程序中存在未过滤的用户输入:SQL注入攻击通常是利用程序中存在未对用户输入进行有效过滤和检查的漏洞来实现的。当程序接收到用户输入并将其作为SQL查询的一部分执行时,如果未对输入进行恰当的处理,攻击者就可以通过注入恶意的SQL代码来执行任意的数据库操作。

2、程序使用动态拼接SQL语句:如果程序使用动态拼接SQL语句的方式来生成SQL查询,而没有对其中的变量进行正确的转义和处理,那么就有可能导致SQL注入攻击。

3、程序权限过大:如果程序执行数据库操作的权限过大,那么攻击者就可以利用SQL注入漏洞来获取和修改数据库中的任意数据。

4、数据库错误消息泄露:如果程序在执行SQL查询时,将错误消息返回给了用户,而这些错误消息中包含了敏感的数据库信息,那么攻击者就可以利用这些信息来构造SQL注入攻击。(敏感信息泄露)

寻找突破注入点:

1、寻找可以控制的传递给后端的参数 ,参数直接传递给数据库查询
( $SQL = “select * from ‘databse’ where id = $id “)
错误语法验证:
( $SQL = “select * from ‘databse’ where id = $id’ “)
报错,则可以判断该处存在SQL注入点。
给ID传值,可以控制的传递给后端的参数,没有任何过滤直接查询数据库,所以我们可以利用。