一.判断数字型和字符型sql注入

在表单数据后添加 and 1=1/1=2/3-1如果无论1=1或1=2都能正常登录,说明是字符型sql注入,否则是数字型sql注入。

数字注入
字符注入

以上两个1=1和1=2都能正常登录,说明是字符型sql注入

二.查找注点

在字符型注入表单数据前面或后面加上’ ,” ,’) ,”) 查看引号的包裹方式

注点

三.判断查询的列数

因为union合并的两个查询语句列数必须相同,所以必须查询系统表的列数,然后使注入的sql语句列数与系统表的列数相同。先从大到小以二分法试,直到试对。

查询的函数为group by h和 order by (推荐用group by,更不容易被防火墙拦截)

列数
列数
列数
列数

以上一直查询到3列才显示结果,说明查询的列数是3列。

注意:第一个查询结果无效,比如select 1,2,3 只会显示2,3结果。

四.使注入命令的执行结果能正常显示

在注入后系统只会显示union查询的前一个查询的结果,所以要使前一个查询无效,让前一个查询的结果为空,一般把前一个查询的id设为一个不存在的id(0,-1等)。

前一个

只执行了union前一个id=’1’的查询的结果,而不后面的查询结果。

后一个

让id=-1,使前一个查询无效,让前一个查询的结果为空,就能正常显示注入命令的执行结果。

五.union注入的更多用法

1.union中常用的数据库,表,列

  • 数据库:information_schema
  • 表:tables(在information_schema数据库中)
  • 表:columns(在information_schema数据库中)
  • 列:table_schema(当前数据库名,在tables和columns中都有)
  • 列:table_name(表名,在tables和columns中都有)
  • 列:column_name(列名,在columns中)

2.group_concat函数一次性查询多个数据

单行

使用group_concat函数后可一次性查询多个数据

多行

多列数据用组合查询

组合

3.查询列名例子

查询列名

知道列名后,便可查询列的数据了

查询列数据

以上是字符型sql的union注入的用法,数字型sql注入的用法与字符型sql注入的用法相同,只需把id后的引号或括号去掉即可。

六.extractvalue注入

适用场景

  1. 无显示结果:SQL语句查询结果无法直接显示在页面上。此时页面可能只返回“操作成功”或“失败”,但不显示数据库中的具体数据
  2. 报错显示:目标网站的数据库错误信息(如MySQL错误)会直接显示在网页上。这是EXTRACTVALUE注入成功的关键前提。(同时满足1和2才适用)

基本格式

1
?id=-1' union select 1,2,extractvalue(1,concat(0x7e,要查询的内容))--+

例子:

- 查询表名

查询表名

- 查询列名

查询列名

substring函数

系统默认只显示32个字符,是使用substring函数后可以精准查询每段字符

基本格式

1
2
select substring(字符串,起始位置(从1开始计数),长度)
select substring('134abc5324',1,6)# 134abc

使用前

使用前

使用后

使用后

七.updatexml注入

应用场景

1.与extractvalue注入相同

2. 在extractvalue被过滤或拦截时,可用updatexml注入

基本格式

?id=-1’ union select 1,2,updatexml(1,concat(0x7e,要查询的内容),3)–+

updatexml与extractvalue不同的是,后者只需两个参数(把第一个无效查询结果占掉,第二个输入想要的查询结果),而updatexml需三个参数(两个无效的查询结果把想要的查询结果包裹起来)

例子:

查询用户名

八.floor报错注入

适用条件与extractvalue注入和updatexml注入相同,三个注入哪个被过滤或拦截,就用另外两个注入方法。

实例

floor报错

1.查询少量数据时可以用group_concat函数查询多个数据,当查询的数据量较大时,使用concat加limit0,1 一组一组查询

2.rand()里面一般0或4,作用是随机生成0-1之间的小数

3.concat_ws(‘分隔符’,’字符串1’,’字符串2’,’字符串3…’)作用是将多个字符串用分隔符连接起来

4.floor()作用是取整,将小数部分去掉,只保留整数部分

九.布尔盲注

适用场景

网站没有报错信息和查询结果,只返回成功或失败的信息,无法直接查询数据库中的数据。

实例

布尔盲注
布尔盲注
布尔盲注

  • 以上页面只返回真或假的信息,只能一个一个试,试出所需信息每个字符对应的asc码值,再用chr()函数转换为字符。

  • substr函数可以精确查询每个字符

  • 利用二分法和python脚本可以快速查询出所需信息

十.时间盲注

适用场景与布尔盲注相同

所用函数

- sleep()函数

sleep()函数的作用是使查询语句执行时间延迟,延迟时间可以设置为1秒以上,根据延迟时间的长短,判断查询语句是否成功。

- if()函数

if(条件,条件为true时返回值,条件为false时返回值)

实例

时间盲注一
时间盲注二

由页面延迟了3秒,推断出字符的asc码值为115,即s