Skip to content

Database Attack Surface — 数据库攻击全景与决策树 ​

数据库是 Web 应用的核心资产——SQL 注入、NoSQL 滥用、配置泄露、备份暴露。本指南提供系统化的攻击面导航与决策路径。

关键词 ​

SQL注入 NoSQL注入 数据库脱库 数据泄露 SQLi blind injection error-based time-based OOB WAF绕过 宽字节注入 二次注入 order by注入 load_file into outfile 默认密码 数据库备份 连接字符串泄露 ORM注入 PDO MySQL PostgreSQL MongoDB Redis Elasticsearch

攻击面全景 ​

数据库攻击面:
┌──────────────────────────────────────────────────────┐
│  应用层                                              │
│  ├─ SQL 注入 (SELECT/INSERT/UPDATE/DELETE/ORDER BY)  │
│  ├─ NoSQL 注入 (MongoDB/Redis/CouchDB)               │
│  ├─ ORM 注入 (HQL/JPQL/DQL)                          │
│  ├─ 二阶注入 (Stored XSS → SQLi)                     │
│  └─ 盲注 (Boolean/Time/Error/OOB)                    │
├──────────────────────────────────────────────────────┤
│  配置层                                              │
│  ├─ 数据库端口暴露 (3306/5432/27017/6379)             │
│  ├─ 默认凭证 (root:root/sa:sa/admin:admin)           │
│  ├─ 连接字符串泄露 (.env/config.php/web.config)      │
│  └─ 弱密码 + 暴力破解                                 │
├──────────────────────────────────────────────────────┤
│  运维层                                              │
│  ├─ 备份文件暴露 (.sql/.dump/.tar.gz/.zip)           │
│  ├─ phpMyAdmin/Adminer 未授权访问                     │
│  ├─ 日志泄露 (SQL query log/general_log)              │
│  └─ 安装文件残留 (install.sql/install.lock)          │
├──────────────────────────────────────────────────────┤
│  数据层                                              │
│  ├─ 数据库内网可达 (SSRF → RDS)                       │
│  ├─ 数据库复制/订阅泄露                               │
│  ├─ 存储过程/函数滥用 (xp_cmdshell/LOAD_FILE)         │
│  └─ 数据库链接/外部表 (dblink/postgres_fdw)          │
└──────────────────────────────────────────────────────┘

文档索引 ​

文档内容
01-sqli-fundamentals.mdSQL 注入基础:类型、探测、利用
02-sqli-advanced.md高级 SQLi:WAF绕过、二阶注入、OOB
03-nosql-injection.mdNoSQL 注入:MongoDB、Redis、Elasticsearch
04-config-exposure.md数据库配置泄露与默认凭证
05-backup-log-leak.md备份/日志文件暴露
07-data-cleaning.mddump/log/HTML/JSON 泄露数据整理与实体映射

速查决策树 ​

发现数据库相关信号:
├─ URL 参数/表单出现 SQL 错误 → [01] SQL 注入基础
│  ├─ 有详细报错 → Error-based 注入
│  ├─ 无报错但页面行为变化 → Boolean blind
│  └─ 无任何可见变化 → Time-based blind / OOB
├─ WAF 拦截 SQL 关键词 → [02] WAF 绕过技术
├─ 发现 NoSQL 端点 → [03] NoSQL 注入
├─ 发现 .env/config.php 可读 → [04] 配置泄露
├─ 发现 .sql/.dump 文件 → [05] 备份暴露
└─ 混合 dump/日志/HTML 泄露 → [07] 数据整理与实体映射

技术升格路线 ​

数据库板块不要按“漏洞名”线性推进,而要按证据类型切换打法:

已知证据立即判断进入文档下一步
SQL 报错栈DBMS/闭合方式/查询上下文01UNION/Error/Boolean/Time
页面有 True/False 差异可控表达式已执行01二分抽取、排序差异
WAF 拦关键词过滤层在 SQL parser 前02HTTP/编码/AST 分层变形
写入后另一路触发二阶注入02写入点/触发点状态机
JSON body 可传对象NoSQL operator 注入03$ne/$regex/$where
Redis/ES/CouchDB 响应NoSQL 服务可达03key/index/db 枚举
.env/源码可读连接字符串/凭据04登录 DB 或反推注入点
.sql/日志命中Schema/数据/SQL 模板05dump 解析、日志反推
混合泄露数据字段/实体/置信度07CSV/SQLite 索引

每条路线都保留成功样本和失败样本:失败样本能告诉你卡在 HTTP parser、WAF、SQL parser、权限、文件系统还是业务逻辑。

订单/支付闭环路线图 ​

数据库板块和支付板块的交叉点是账本:订单表、支付流水、发货记录、卡密表、余额变更、回调日志。任意入口命中后都要尽快路由到这些账本,而不是停在“拿到一段数据”。

mermaid
flowchart TD
  Signal["SQL/NoSQL/配置/备份信号"] --> Route["按证据类型路由"]
  Route --> SQLi["SQLi oracle"]
  Route --> Config["配置/连接串"]
  Route --> Dump["dump/log/source"]
  SQLi --> Ledger["订单/支付/发货账本"]
  Config --> Ledger
  Dump --> Ledger
  Ledger --> Diff["状态差分: paid/delivered/balance/card"]
  Diff --> Next["签名/回调/竞态/IDOR/数据整理"]
入口最小可复查结果继续转向
SQLiorders/pay_log/cards 关键行支付状态机、回调重放
NoSQLsession/cart/order/queue key登录态、异步发货
配置DB/Redis/Payment/Storage 路由直连抽样、签名密钥、对象存储
备份/日志订单图谱、回调 raw、卡密候选数据整理、签名实现
混合 dumpCSV/SQLite 索引、实体置信度回填订单/商品/卡密

路由器伪代码 ​

python
# database_signal_router.py — 数据库板块入口路由
ROUTES = [
    ("01-sqli-fundamentals.md", ["SQL syntax", "SQLSTATE", "mysql_fetch", "pg_"]),
    ("02-sqli-advanced.md", ["403", "WAF", "chunked", "second-order", "dnslog"]),
    ("03-nosql-injection.md", ["$ne", "$regex", "redis", "_search", "_all_dbs"]),
    ("04-config-exposure.md", [".env", "DATABASE_URL", "DB_HOST", "REDIS_URL"]),
    ("05-backup-log-leak.md", [".sql", ".dump", "general.log", ".git/HEAD"]),
    ("07-data-cleaning.md", ["mixed dump", "HTML stack", "CSV", "prefix cluster"]),
]

def route_signal(text):
    low = text.lower()
    hits = []
    for doc, keys in ROUTES:
        score = sum(1 for k in keys if k.lower() in low)
        if score:
            hits.append({"doc": doc, "score": score})
    return sorted(hits, key=lambda x: (-x["score"], x["doc"]))

攻击链 / 工作流 ​

1. 资产枚举:域名、目录、API、管理后台、数据库端口、备份文件名
2. 信号分类:SQL 报错 / NoSQL 参数 / 配置文件 / 备份日志 / 平台特征
3. 路由文档:按信号进入 01-07 对应技术文档,不在概览页直接深挖
4. 路径验证:确认可控表达式、布尔差异、文件可读性、未授权访问和下一跳
5. 证据固化:保存请求、响应、时间差、错误栈、文件哈希和字段样例
6. 横向关联:配置泄露 → 数据库登录;备份泄露 → 表结构;SQLi → 文件读写
7. 账本闭环:把入口证据转成订单、支付流水、发货、卡密、余额或回调差分
8. 收敛结论:写入 notes/reports,明确影响面、利用条件、下一跳入口和失败分支

Evidence ​

证据类型记录内容
HTTP 证据URL、参数、请求方法、状态码、关键响应片段
数据库指纹DBMS 类型、版本、报错函数、时间函数差异
文件泄露文件路径、大小、哈希、字段样例
权限边界未授权/低权限/管理员权限的对比请求
影响面可读表、可枚举订单、可下载备份、可访问管理工具
账本差分订单状态、支付流水、发货记录、卡密、余额、回调日志变化

MCP 工具映射 ​

攻击步骤MCP 工具说明
按信号路由kb_router输入 SQLi、NoSQL、备份、配置泄露等信号
读取技术文档kb_read_file打开对应 24-database 子文档
HTTP 探测http_probe验证端点、状态码、响应差异
执行 Web 工具run_ctf_tool调用 sqlmap、git-dumper、目录枚举等工具
证据记录workspace_write_text写入 notes/reports 的复现证据

关联技术 ​

  • [[sqli-nosqli]] — SQL/NoSQL 注入
  • [[01-idor-enumeration]] — IDOR 与数据库枚举
  • [[payment-php]] — PHP 支付与数据库交互
  • [[file-upload-xxe-lfi]] — 文件读写与数据库配置
  • [[07-data-cleaning]] — dump/log/HTML/JSON 数据整理

Apache-2.0 · For authorized learning and defensive research only · Disclaimer