文章目录
一.报错注入概述
在SQL注入报错攻击中,攻击者通过在用户输入的位置注入恶意的SQL代码,使应用程序拼接出错误的SQL语句。当数据库执行错误的SQL语句时,会返回错误信息,这些错误信息可能包含数据库的具体错误信息、相关的数据和表结构等敏感信息。攻击者通过分析这些错误信息来获取相关的数据或者进一步攻击数据库。
案例如下:
http://192.168.100.10/sql/Less-1/index.php?id=1' union select 1,2,datadase()--+
案例分析:上述sql注入中认为将正确的sql语句database() 改为错误的sql语句 datadase()
数据库回显内容为:FUNCTION security.datadase does not exist
通过数据库回显信息可逆向分析出当前未注入恶意sql的语句查询的数据库名是securty
因此我们可以通过报错注入推断出部分数据库真实信息
二.报错注入分类
extractValue()函数概述
extractValue()函数在SQL语句中用于提取XML类型的数据中指定节点的值。它接受两个参数:第一个参数是XML类型的列或表达式,第二个参数是XPath表达式。XPath是一种用于在XML文档中定位节点的语言。
extractValue()函数首先对XML数据进行解析,然后基于XPath表达式定位到指定的节点,最后返回该节点的值。如果节点不存在,函数将返回空值。
SELECT extractValue(查询列名, '/root/node') AS node_value
FROM table_name;
#上述SQL语句将从表中名为table_name的记录的xml_column列中提取出位于/root/node路径下的节点的值,并将其作为node_value返回。
利用extractValue()函数报错注入
extractValue()函数对查询路径的符号是否正确十分敏感,当路径符号出现错误,数据库将会回显错误信息,如下图:
因此,可以在执行此报错前插入一些恶意的sql查询语句通过此报错回显一些我们需要的信息。
案例如下:
select extractivalue(doc.concat(0x7e,(select database()))) from xml;
回显错误:XPATH syntax error :"~ctfstu"
通过上述报错回显成功回显当前数据库名ctfstu
注:0x7e :是阿斯克码,会被电脑转译为符号 ~
concat()函数会将括号中的内容拼接,如concat(1,2)执行结果为12
报错分析:数据库优先执行括号中的内容即优先执行select database() 查询到数据库名
concat()函数将~ 与数据库名拼接为 ~ctfstu
数据库最终执行的语句为select extractivalue(doc.~ctfstu) from xml;
当使用函数extractivalue()查询时检测路径符号 ~ 有误从而将报错信息~ctfstu回显
substring()函数
利用updatexml()函数报错注入
floor报错注入
- rand()函数:随机返回0-1的小数
- floor()函数:小数向下取整,向上取整ceiling函数()
- concat_wa("~",2,3)函数“将括号内数据用第一个字段连接起来:2~3
- group by():分组查询
- count():统计
- limit():显示指定行数
演示案例
select count(*),concat_ws('-',(select database()),floor(rand(0)*2)) as a from users group by a;
原理分析:
select database():查询数据库名
(rand(0)*2:取0-2之间的随机值
floor(rand(0)*2):将取出的0-2之间的随机值向下取整即0-1之间的随机数取0 1-2之间取1
concat_ws('-',(select database()),floor(rand(0)*2)):将括号中的参数用'-'符号连接:库名-1/库名-0
count(*):将去取出的值进行统计
上述语句中查询出的结果无非两种情况即库名-1或库名-0.使用count(*)进行统计时会统计该库名出现的次数,然而使用count(*)统计时若统计表中无库名,则会将跳过该库名统计下一行的库名
例如:,floor(rand(0)*2 统计出的前五个库名后缀数字为 0,1,1,0,1
统计时,会统计库名-0,若无该库名,则将库名-1直接放入统计表中并判定库名-1出现1次;
进行第三次统计时,会对库名-1进行统计,由于库名-1在表中存在,因此判定库名-1出现次数+1即2次
进行第四次统计时,会对库名-0进行统计,由于库名-0未在表中,则跳过库名-0直接统计库名-1,此时判定库名-1出现过三次,
当统计结束后库名-0这个库名仍未统计次数,会报错:报错原因:库名-1重复统计,此时我们就可以通过报错回显得到我们想要的库名
不常用报错注入函数
PointFromGeoHash()函数
PointFromGeoHash(version(),1)--+