前言

本章节将讲解SQL注入中的文件读写相关知识。文件读写功能与我们之前学习的高权限操作密切相关

1. 文件读写的前提条件

  • 必须具备高权限(root权限)
    • 只有高权限用户才能进行文件读写操作。
    • 普通用户无法进行文件读写。
  • 特定配置项需授权
    • 即使是 root 用户,如果没有开启相应的文件读写权限,也无法操作。
    • 该权限可在配置文件中开启。

2. 文件读写的作用

  • 读取功能:可以获取
    • 用户信息(账号、密码)
    • 配置信息(网站部署、敏感配置信息等)
  • 写入功能:常用于
    • 植入一句话木马,作为后门远程操控服务器
    • 简化数据获取流程

3. 配置文件权限设置

常见配置文件位置

  • Linux:/etc/my.cnf
  • Windows:my.ini

示例说明

  • 我的这个 txt 文件没有写权限。
  • 我们可以在 cmd 下查看当前配置:
show global variables like '%secure%';

很显然当前没有权限,需要手动配置。
  • 回到 my.ini 文件
  • 添加如下配置项:
secure_file_priv=
  • 保存后重启服务即可。

权限配置说明

  • secure_file_priv=:对文件读写没有限制
  • secure_file_priv=NULL:不能进行文件读写
  • secure_file_priv=d:/phpstudy/mysql/data:只能对该路径下文件进行读写
权限表述:
  • 空值(''):拥有绝对的读写权限
  • null:没有读写权限,即使是 root 也无法操作
  • 指定路径:仅对该路径有读写权限

4. 利用SQL语句查看权限

  • 可通过 SQL 语句直接查询当前文件读写权限
  • 示例流程:
  1. 登录 MySQL(如:mysql -u root -p)
  2. 执行查询语句,观察返回值判断权限状态

5. 文件读取操作演示

  • 使用函数:load_file()
  • 路径可以是单引号、0x(十六进制形式)、char转换的字符形式
  • ⚠️ 注意:路径中斜杠是 /,不是 \
  • 通常与 union 语句配合,查看如 config.php(即 mysql 的密码)、apache 配置文件等

示例操作

  1. 创建本地文件(如:D盘下 d.txt)
  2. 执行 SQL 语句:
union SELECT 1,LOAD_FILE('D:/d.txt'),3;
  1. 成功后可看到文件内容
我这边再查一下靶场内置的另一个文件
你会发现它不显示,那我们查看一下网页源代码就可以看出来了
你这边看完其实会发现,我们读取这个文件其实并不难,难的是怎么知道它的路径

6. 路径获取技巧

  • 我先帮你提取并整理图片中的文字内容,再补充相关背景说明:

2、知道网站绝对路径

Windows 常见环境路径
序号
环境/软件
常见路径
1
Phpstudy
phpstudy/www
2
Phpstudy
phpstudy/PHPTutorial/www
3
Xampp
xampp/htdocs
4
Wamp
wamp/www
5
Appser
appser/www
Linux 常见环境路径
序号
路径
1
/var/mysql/data
/var/www/html
路径获取常见方式
  • 报错显示
inurl:edu.cn warning
这边就有一些因为报错的路径名
  • 遗留文件(工程文件啥的)
inurl.phpinfo.php
你这边就可以看到很多的信息
  • 漏洞报错
  • 平台配置文件等

💡 补充说明

这些路径在SQL注入(尤其是文件读写操作)中非常关键:
  1. 绝对路径的作用:在使用 load_file() 读取文件或 into outfile 写入文件时,必须知道网站根目录的绝对路径,才能精准定位到目标文件(如config.php)或写入一句话木马。
  2. Windows vs Linux 路径差异
  • Windows 路径分隔符可以用 / 或 \,但注入中更推荐用 / 避免转义问题;
  • Linux 路径固定用 /,常见的Web根目录是 /var/www/html,MySQL数据目录是 /var/mysql/data。
  1. 路径获取技巧
  • 报错信息(如PHP的include错误、SQL注入报错)会直接泄露路径;
  • 探针文件(如phpinfo.php)中 DOCUMENT_ROOT 字段可查看根目录;
  • 配置文件(如Apache/Nginx的虚拟主机配置)中会记录站点路径。

7. 文件写入操作演示

常用写入函数

  • INTO OUTFILE
  • INTO DUMPFILE
区别说明
  • OUTFILE:可写入多行,支持格式输出
  • DUMPFILE:仅写入一行,无格式

写入示例

  1. 构造写入语句:
SELECT '内容' INTO OUTFILE 'D:\\d.txt';
  1. 注意事项
  • 路径需反斜杠
  • 语句末尾如有多余 SQL,可用 -- 或 # 注释掉
  1. 写入后,目标文件内即有指定内容(如一句话木马)
这边就不演示了,其实就是在注入点上面写内容,函数后面写位置
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐