报错注入
什么是报错注入
0.1 定义:
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式。
响应过程:
用户在前台页面输入检索内容后台将前台页面上输入的检索内容无加区别的拼接成sql语句,送给数据库执行数据库将执行的结果返回后台,后台将数据库执行的结果无加区别的显示在前台页面
报错注入存在基础:后台对于输入输出的合理性没有做检查
0.2 类型
1、ExtractValue函数
ExtractValue()
函数是MySQL数据库中用于提取XML数据中指定路径的值的函数。它基于XPath语法,允许用户根据特定的路径表达式从XML格式的数据中获取所需信息。以下是关于MySQL中ExtractValue()
函数的详细讲解:
1.1语法
EXTRACTVALUE(xml_data, xpath_expression)
xml_data
: 包含XML数据的字段或表达式。xpath_expression
: XPath路径表达式,用于指定要提取值的位置。
1.2 在sql注入中
在使用ExtractValue()函数时,无效的XPath表达式(xpath_expression)可能会导致报错。通过将恶意的SQL语句拼接放在xpath_expression处,可以使得该条SQL语句报错,并执行我们注入的恶意语句
例如:
SELECT * FROM users WHERE username = 'input_username' AND password = ExtractValue(1, CONCAT('username:', (SELECT database())));
1
其中payloadAND password = ExtractValue(1, CONCAT('username:', (SELECT database())));
使用了extractvalue函数,将xml数据设置为1
,xpath_expression部分设置为CONCAT('username:', (SELECT database())
此时的xpath_expression为“username: 数据库名”
,由于1
中并没有“username: 数据库名”
因此会产生报错,可以从报错结果中看到我们想要的数据库名
2、uodataxml()函数
2.1 语法:
UPDATEXML(XML_document, XPath_string,new_value);
- 第一个参数:XML_document是String格式,为XML文档对象的名称
- 第二个参数:XPath_string (Xpath格式的字符串),Xpath语法
- 第三个参数:new_value,string格式,替换查找到的符合条件的数据
2.2 用法:
将书标题修改为1
SELECT updatexml(doc,'/book/title','1') FROM xml;
直接将<title></title>替换为1
3、floor()函数
3.1 原理
floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函数执行后的结果。
参考文章:https://www.secpulse.com/archives/140616.html
这篇文章对于floor的介绍十分详细,
4、NAME_CONST()
exists(select * from (select * from(selectname_const(@@version,0)) as a join (select name_const(@@version,0)) as b) as c);
了解更多:https://www.cnblogs.com/Triomphe/p/9489639.html
5、基于join的报错方式(已知库名和表名时可用来获取列名或用于绕过","被注释的情况)
(1)Payload:
select * from(select * from 库名.表名 a join 库名.表名 b)c
(2)各元素作用
join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
可以使用的 JOIN 类型,以及它们之间的差异。
1.JOIN: 如果表中有至少一个匹配,则返回行
2.LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
3.RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
4.FULL JOIN: 只要其中一个表中存在匹配,就返回行
(3)join报错注入分析:
1.比较列名是否有重复,会返回重复列名。
2.可作为连接符代替特殊字符。
(4)使用场景
已知库名和表名时可用来获取列名或用于绕过","被注释的情况。
6、基于exp的报错方式
(1)Payload:
exp(~(select * from (select user())a))
(2)各元素作用
MySQL
中,exp
与ln
和log
的功能相反,简单介绍下,就是log
和ln
都返回以e为底数的对数
指数函数为对数函数的反函数,exp()
即为以e为底的对数函数(exp注入适用于MySQL5.5.5以上)
(3)exp报错注入分析:
通过子查询与按位求反,造成一个DOUBLE overflow error
,并借由此注入返回数据
(4)使用场景
属于BigInt溢出型注入,用求反的方式爆出数据。
7、基于GeometryCollection()报错(混合数据类型)
(1)Payload:
GeometryCollection((select from(select from(select user())a)b))
(2)各元素作用
GeometryCollection 是零个或更多个 geometry(几何) 或 geography(地理) 实例的集合。
GeometryCollection 可以为空。
(3)GeometryCollection报错注入分析:
因为输入查询的数据并不满足Geometry或者Geography,会产报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
8、基于polygon()报错
(1)Payload:
polygon((select from(select from(select user())a)b))
(2)各元素作用
Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。
(3)polygon报错注入分析:
因为输入查询的数据并不满足polygon函数储存数据的条件,会产生报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
9、基于multipoint()报错
(1)Payload:
multipoint((select from(select from(select user())a)b))
(2)各元素作用
MultiPoint 是零个点或更多个点的集合。 MultiPoint 实例的边界为空。
(3)multipoint报错注入分析:
因为输入查询的数据并不满足multipoint函数储存数据的条件,会产生报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
10、基于multlinestring()报错
(1)Payload:
multilinestring((select from(select from(select user())a)b))
(2)各元素作用
MultiLineString 是零个或多个 geometry 或 geographyLineString 实例的集合。
(3)multlinestring报错注入分析:
因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
11、基于multpolygon()报错
(1)Payload:
multipolygon((select from(select from(select user())a)b))
(2)各元素作用
MultiPolygon 实例是零个或更多个 Polygon 实例的集合。
(3)multpolygon报错注入分析:
因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
12、基于linestring()报错
(1)Payload:
linestring((select from(select from(select user())a)b))
(2)各元素作用
LineString 是一个一维对象,表示一系列点和连接这些点的线段。
(3)linestring报错注入分析:
因为输入查询的数据并不满足函数储存数据的条件,会产生报错,并借由此注入返回数据。
(4)使用场景
并不常用的报错方式可用来尝试。
了解更多:https://www.tr0jan.top/archives/6/
https://www.cnblogs.com/Triomphe/p/9489639.html
这两篇文章个人十分推崇