sqlmap简介

顾名思义,sqlmap是一个自动化sql注入的开源的渗透工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。他有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层文件系统和通过带外连接在操作系统上执行命令。官方网址
如果想要深入了解此工具,那你首先要对SQL注入有一定的了解,可以查看我写的SQL手工注入原理,我们要用的测试环境也在此博客中存在,你也可以使用我个人搭建的环境,(但不保证环境的持续稳定运行)
sqlmap官方中文介绍

sqlmap特性

  • 全面支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP MaxDB,Informix,MariaDB,MemSQL,TiDB,CockroachDB,HSQLDB,H2,MonetDB,Apache Derby,Amazon Redshift, Vertica,Mckoi,Presto,Altibase,MimerSQL,CrateDB,Greenplum,Drizzle,Apache Ignite,Cubrid,InterSystems Cache,IRIS和eXtremeDB数据库管理系统。
  • 全面支持六种SQL注入技术:基于布尔的盲注,基于时间的盲注,基于错误,基于UNION查询,堆叠查询和带外。
  • 通过提供DBMS凭据,IP地址,端口和数据库名称,支持直接连接到数据库而无需通过SQL注入。
  • 支持枚举用户,密码哈希,特权,角色,数据库,表和列。
  • 自动识别密码哈希格式并支持使用基于字典的攻击来破解它们。
  • 支持完全转储数据库表,根据用户的选择转储一系列条目或特定列。用户还可以选择仅转储每列条目中的一部分字符。
  • 支持搜索特定数据库名称,所有数据库中的特定表或所有数据库表中的特定列。例如,这对于识别包含自定义应用程序凭据的表很有用,其中相关列的名称包含诸如name和pass之类的字符串。
  • 当数据库软件是MySQL,PostgreSQL或Microsoft SQL Server时,支持从数据库服务器基础文件系统下载和上传任何文件。
  • 支持以执行任意指令和检索他们的标准输出底层当数据库软件MySQL和PostgreSQL或Microsoft SQL Server操作系统的数据库服务器上。
  • 支持在攻击者机器与底层操作系统的数据库服务器之间建立带外状态TCP连接。根据用户的选择,此通道可以是交互式命令提示符,Meterpreter会话或图形用户界面(VNC)会话。
  • 通过Metasploit的Meterpreter 命令支持数据库进程的用户特权升级getsystem。

sqlmap下载安装与启动

  1. 在官网中下载sqlmap官网
  2. 使用kali内置此应用
  3. 如果是windows可以使用wsl,wsl的kali也同样携带sqlmap。wsl系统的安装与使用
    如果是官网下载的,需要进行环境配置

如果是在虚拟机中启动kali或者wsl的kali直接输入salmap即可启动,如果是windows系统中启动需要先cd到sqlmap的解压目录中然后在已python sqlmap.py方法来启动
在这里插入图片描述

测试环境

测试环境可以自行搭建我在SQL手工注入原理中写了测试环境,也可以用我个人并不保证能稳定运行的在线环境 之后我用的最多的就是sqli这个测试环境。

sqlmap基础使用

输出详细程度

选项: -v

此选项可用于设置输出消息的详细程度。有七个详细级别。默认级别为1,其中显示信息,警告,错误,严重消息和Python回溯(如果发生)。

  • 0:仅显示Python回溯[tracebacks],错误[ERROR]和严重消息[CRITICAL]。
  • 1:还显示信息[INFO]和警告消息[WARNING]。
  • 2:还显示调试消息[DEBUG]。
  • 3:还显示注入的有效载荷。
  • 4:还显示HTTP请求。
  • 5:还显示HTTP响应的标头。
  • 6:还显示HTTP响应的页面内容。

进一步了解sqlmap的功能的合理详细程度是2级,主要用于检测阶段和接管功能。而如果您想查看工具发送的SQL有效负载,则级别3是您的最佳选择。当您向开发人员提供潜在的错误报告时,也建议使用此级别,请确保将标准选项发送的流量日志文件发送给标准输出-t。为了进一步调试潜在的错误或意外行为,我们建议您将详细程度设置为4级或更高。应该注意的是,也可以通过使用此选项的较短版本来设置详细程度,其中字母的数量v提供的开关(而不是选项)内部确定详细程度(例如,-v代替-v 2,-vv代替-v 3,-vvv代替-v 4,等等)

sqlmap直连数据库

这个功能用处不大,先提一下吧
直连数据库需要用到-d
python sqlmap.py -d "数据库类型(比如mysql)://用户名:密码@地址:端口/数据库名字" -f --banner --dbs --users
其中-ffingerprint-bbanner,效果相似都为查看数据库具体版本,--dbs为获取当前有哪些数据库, --users为获取东区有哪些用户

sqlmap对指定网址进行SQL注入

选项:-u或–url

针对单个目标URL运行sqlmap。此选项需要以下格式的目标URL: http(s)://目标URL[:端口]/[参数]
如 : python sqlmap.py -u "http://114.67.75.192/newsqli/Less-1/?id=1" -f --banner --dbs --users

sqlmap常用文件类型进行SQL注入

  1. 扫描给定文本文件中列出的多个目标
    参数是:-m
    提供给定批量文件(.txt格式)中列出的目标URL的列表,sqlmap将逐个扫描每个URL。

  2. 从文件加载HTTP请求
    参数是:-r
    sqlmap的可能性之一是从文本文件加载原始HTTP请求。这样,您可以跳过许多其他选项的使用(例如,设置Cookie,发布数据等)。

  3. 从配置INI文件加载选项
    参数是:-c
    可以从配置INI文件传递用户的选项,例如sqlmap.conf。(在sqlmap解压文件中有这个文件)
    请注意,如果您从命令行提供其他选项,则在运行sqlmap时会评估这些选项并覆盖配置文件中提供的那些选项。
    在这里插入图片描述

  4. 从Burp或WebScarab代理日志解析目标
    参数是:-l
    此选项需要一个参数,该参数是代理的HTTP请求日志文件。Burp官网添加链接描述WebScarab官网这两个是代理抓包软件,Burp是kali中内置的软件,之后可能会考虑写一篇这些软件的使用教程。WebScarab已经逐渐被淘汰很少会在使用了。

-g(根据google搜索结果进行注入)国内较少使用,这里就不做介绍了

避免错误请求过多而被屏蔽

有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量错 误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。

参数

  • --safe-url=URL地址 隔一会就访问一下的安全URL
  • --safe-post=POST数据 访问安全URL时携带的POST数据
  • --safe-req=文件 从文件中载入安全HTTP请求
  • --safe-freq=URL地址 每次测试请求之后都会访问一下的安全URL

绕过反CSRF保护

许多站点都以令牌,每个页面响应期间随机设置的隐藏字段值的形式结合了反CSRF保护。SqlMap的会自动尝试识别并绕过这种保护,但也有选项–csrf-token,并–csrf-url可以用来进一步微调它。选项–csrf-token可用于设置包含随机标记的隐藏值的名称。在网站为此类字段使用非标准名称的情况下,这很有用。选项–csrf-url可用于从任意URL地址检索令牌值。如果易受攻击的目标URL首先不包含必需的令牌值,但需要从其他位置提取该令牌值,则此功能很有用。CSRF和SQL与XSS一样,是一种针对web攻击的手段,我之后会专门写一篇分析此攻击的博客。

参数

  • --csrf-token=csrf令牌 用于保存反CSRF令牌的参数
  • --csrf-url=CSRF URL 提取反CSRF令牌要访问的URL地址

sqlmap优化

输出预测

此开关在推理算法中用于对要检索的值的字符进行顺序统计预测。根据给定的文件(sqlmap解压路径\data\txt\common-outputs.txt)以及当前使用的枚举知识,将构建具有最有希望的字符值的统计表。如果可以在公共输出值中找到该值,则随着过程的进行,后续字符表的范围将越来越窄。

参数

  • --predict-output

注:此参数和多线程--threads相互冲突,不能同时存在

HTTP保持活动

此选项指示sqlmap使用持久HTTP连接。相当于HTTP报文中设置connection:keep-alive。
参数

  • --keep-alive

注:此参数与代理--proxy互相冲突,不能同时存在

HTTP NULL连接

使用此方法后如果服务器支持特定的技术,可以直接获得HTTP响应的大小而不用获得HTTP响应体。这种技术常用于盲注的时候区分True与False。开启此选项后,sqlmap将尝试测试和利用两种不同的NULL连接技术:Range和HEAD。如果目标Web服务器支持其中任何一种,则可以明显节省已使用的带宽,从而提高速度。

参数

  • --null-connection

注:此参数与--text-only相互冲突,不能同时存在

并发HTTP(S)请求

可以指定允许sqlmap执行的并发HTTP(S)请求的最大数量。此功能依赖于Python多线程概念,并继承了它的优点和缺点。(主要缺点是Cpython的GUI锁造成的)

此功能适用于暴力破解(洪水攻击,穷举法攻击)以及SQL盲注技术完成数据提取的情况。对于后一种情况,sqlmap首先在单线程中计算查询输出的长度,然后启动多线程。每个线程都被分配为检索查询输出的一个字符。检索到该字符后,线程结束-使用sqlmap中实现的二等分算法,最多需要7个HTTP(S)请求。

出于性能和站点可靠性的原因,并发请求的最大数量设置为10。

参数

  • --threads

注:此参数和预测输出--predict-output相互冲突,不能同时存在

测试等级

使用参数: --level
测试等级越高,sqlmap进行的有效负载(Payload)就越多越细,且时间也就相对越长。默认等级为一,共有五个级别
始终测试GET和POST参数,从级别2开始测试HTTP Cookie请求头值,从级别3开始测试HTTP User-Agent / Referer请求头。

风险

使用参数: --risk
此参数用于指定风险等级,有1~3共3级。默认风险等级为1,此等级在大多数情况下对测试目标无害。风险等级2添加了基于时间的注入测试,等级3添加了OR测试。
在某些情况下,例如在update语句中进行SQL注入,注入OR基于-的有效负载(Payload)可能导致表中所有条目的更新,这肯定不是测试者想要的。sqlmap的有效负载(Payload)配置文件在sqlmap解压路径\data\xml\payloads可以手动修改有效负载来避免条目的更新。

页面比较

选项:–string,–not-string,–regexp和–code
使用sqlmap进行注入测试时判断True与False时通常会避免被页面中的动态内容所干扰,但也会出现一些特殊情况让其判断失败。
--string=字符串: 此字符串可以出现在原始页面上(虽然不是必需的),也可以出现在所有True注入查询页面上,但不是 False 页面上。
--not-string=选项: 该字符串不存在于原始页面上,也不存在于所有True注入查询页面上,而是始终出现在False 页面上。
--regexp=正则表达式: 用户可以提供正则表达式来代替静态字符串。
--code=状态码: 如果页面可以使用状态码来判断是否成功可以使用此值,如:–code=200。

SQL注入技术进行测试

此选项可用于指定要测试的SQL注入类型。默认情况下,sqlmap测试其支持的所有类型/技术。 在某些情况下,您可能只想测试一种或几种特定类型的SQL注入技术,这就是该选项起作用的地方。
参数: --technique
技术:
B:基于布尔的盲注(Boolean-based blind)
E:基于错误(Error-based)
U:基于联合查询(Union query-based)
S:堆叠查询(Stacked queries)
T:基于时间的盲注(Time-based blind)
Q:内联查询(Inline queries)
如: --technique ES 为使用基于错误的查询和堆叠查询。默认值为BEUSTQ。

二阶攻击

一些网站进行SQL注入测试时,针对一个URL的SQL注入测试可能会在另一个URL中显示。通常是由于用户在原始测试页面上提供的输入,数据库进行了存储而发生的。
选项:
--second-url: 进行SQL注入的目标URL
--second-req: 显示效果的URL地址

注入参数

这些选项可用于指定要测试的参数,提供自定义注入有效负载和可选的篡改脚本。

可测试的参数

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

添加参数

默认情况下(--level 1),sqlmap测试所有GET参数和POST参数。当测试等级在2(--level 2)或2级以上时,它还会测试HTTP Cookie请求头。当测试等级大于等于3级时,它还会测试SQL注入的HTTP User-Agent和HTTP Referer请求头。通过-p "参数"可以直接指定需要测试的内容。
如:想要测试请求头中的参数id和User-Agent是否存在注入点,可以写-p "id,user-agent"

排除参数

如果用户希望从测试中排除某些参数,方法:参数--skip。当您要使用更高的值–level并测试所有可用参数(不包括通常要测试的某些HTTP标头)时,这特别有用。
如:当等级五(--level=5)时,想要跳过对User-Agent与Referer的测试可以写--skip="user-agent,referer"

基于正则表达式排除参数

可以使用正则表达式来从测试中排除某些参数。方法:参数 --param-exclude
如: 要跳过包含字符串token或session属性的参数的测试,可以写--param-exclude="token|session"

注入点

当url注入点位于url中间的某一个位置,并非是在传参?后方时,需要手动在注入点位置处加入*号来表示注入点。(当使用Apache Web服务器的mod_rewrite模块或其他类似技术时,此功能特别有用。)
如: python sqlmap.py -u "http://目标url/参数1/内容1*/参数2/内容2/"
除了url外,其余地方的注入点也可以用星号*指定,比如说POST请求,HTTP请求头(--headers,--user-agent,--cookie),已文件方式请求(-r)等地方的注入点。
如: python sqlmap.py -u "http://目标url" --cookie="参数1=内容1*;参数2=内容2"

强制选择数据库管理系统(DBMS)与操作系统名称

如果我们已知测试目标使用的数据库管理系统(DBMS),这时候我们就可以去指定数据库管理系统(DBMS)来加快SQL注入的进程,并且减少探测次数也可以降低风险,同样我们如果事先知道目标使用的系统,也可以事先指定
选项:
--dbms : 指定目标数据库管理系统(仅支持sqlmap支持的数据库类型,本博客开头的时候写过sqlmap支持哪些数据库管理系统)
--os : 指定目标系统(大多数服务器都是linux,也有少部分是windows,基本没有其他系统的了)

如果--fingerprint与一起提供--dbms,则sqlmap仅对指定的数据库管理系统执行版本认定
如 : python sqlmap.py -u "http://目标url/?参数=1" --dbms mysql -f 会只去确定此数据库管理系统(DBMS)是MySQL中那个版本,而不会再去测试其他数据库,如果此数据库管理系统(DBMS)不是MySQL则无法找到数据库详细信息。
请注意,此选项不是强制性的,强烈建议仅在绝对确定后端数据库管理系统或底层操作系统时使用此选项。如果您不知道,请让sqlmap为您自动识别。

Sqlmap自定义注入负载位置

在某些情况下,只有当用户提供要附加到注入负载的特定后缀时,易受攻击的参数才可被利用。当用户已经知道查询语法并希望通过直接提供注入有效负载前缀和后缀来检测和利用SQL注入时,这些选项就派上用场了。
选项:
--prefix 设置SQL注入Payload前缀
--suffix 设置SQL注入Payload后缀
比如

假设SQL语句为 = "SELECT * FROM users WHERE id=('.$_GET['id'].') LIMIT 0, 1";

python sqlmap.py -u "http://ip/sqlmap/mysql/get_str_brackets.php\
?id=1" -p id --prefix "')" --suffix " AND ('abc'='abc"

相当于SQL语句 = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";

混淆注入数据

sqlmap本身不会混淆发送的有效负载,除了单引号之间的字符串被char()类似的表示形式所取代之外。sqlmap通过Tamper脚本来绕过Web应用防护系统(WAF)等防御措施,可以在sqlmap解压路径/tamper文件夹下找到所有sqlmap自带的tamper脚本。(如果有能力,可以直接写tamper脚本)
如: python sqlmap.py -u "http://目标URL?id=1" --tamper "between.py,randomcase.py,space2comment.py"
下列使用范围基于sqlmap的1.4.2.42版本编写

tamper自带脚本 作用 适用范围
apostrophemask.py 将单引号 url 编码,用于过滤了单引号的情况。 所有
apostrophenullencode.py 将单引号替换为宽字节 unicode 字符,用于过滤了单引号的情况 所有
appendnullbyte.py 在你构造的payload后面加一个空字符 Access
base64encode.py 进行base64编码 所有
between.py 将大于符号和等号用 between 语句替换,用于过滤了大于符号和等号的情况 所有
bluecoat.py 用随机的空白字符代替空格,并且将等号替换为 like ,用于过滤了空格和等号的情况 MySQL 5.1, SGOS
chardoubleencode.py 用 url 编码两次你的 payload 所有
charencode.py 用 url 编码一次你的 payload 所有
charunicodeencode.py 用 unicode 编码 payload ,只编码非编码字符 ALL,但是需要 asp 和 asp.net 环境
charunicodeescape.py 以指定的payload反向编码未编码的字符
commalesslimit.py 将 payload 中的逗号用 offset 代替,用于过滤了逗号并且是两个参数的情况 MySQL
commalessmid.py 将 payload 中的逗号用 from for 代替,用于过滤了逗号并且是三参数的情况 MySQL
commentbeforeparentheses.py 在某个单词后的第一个括号前面加入 /**/ ,用于过滤了函数的情况 ALL
concat2concatws.py 用于过滤了 concat 函数的情况 MySQL
equaltolike.py 将等号用 like 代替,用于过滤了等号的情况 ALL
escapequotes.py 将单引号转换成 ’ ,双引号转换成 " ,用于过滤了单引号或双引号的情况 ALL
greatest.py 用 greatest 代替大于符号,用于大于符号被过滤了的情况 ALL
halfversionedmorekeywords.py 在关键字前添加注释,用于过滤了关键字的情况 MySQL < 5.1
hex2char.py 根据名称猜测是十六进制字符
htmlencode.py 将 payload 进行 html 编码 ALL
ifnull2casewhenisnull.py 改变ifnull语句的写法
ifnull2ifisnull.py 将 ifnull() 函数转为 if(isnull()) 函数,用于过滤了 ifnull 函数的情况 MySql
informationschemacomment.py 在 information_schema 后面加上 /**/ ,用于绕过对 information_schema 的情况 ALL
least.py 替换大于号为least
lowercase.py 将 payload 里的大写转为小写 ALL
luanginx.py 未知
modsecurityversioned.py 用注释来包围完整的查询语句,用于绕过 ModSecurity 开源 waf MySQL
modsecurityzeroversioned.py 用注释来包围完整的查询语句,用于绕过 waf ,和上面类似 MySQL
multiplespaces.py 在关键字周围添加多个空格 ALL
overlongutf8.py ”转换给定的 payload 当中的所有字符“,类似空格大于小于这种 ALL
overlongutf8more.py 以指定的payload转换所有字符
percentage.py 用百分号来绕过关键字过滤,具体是在关键字的每个字母前面都加一个百分号 ALL, 但是需要 ASP 环境
plus2concat.py 用 concat 函数来替代加号,用于加号被过滤的情况 SQL Server 2012+
plus2fnconcat.py 用 fn concat 来替代加号,和上面类似 Microsoft SQL Server 2008+
randomcase.py 将 payload 随机大小写,可用于大小写绕过的情况 ALL
randomcomments.py 在 payload 的关键字中间随机插入 /**/ ,可用于绕过关键字过滤 ALL
securesphere.py 在 payload 后面加入字符串,可以自定义 ALL
sp_password.py 在 payload 语句后添加 ssp_password ,用于迷惑数据库日志 SQL Server
space2comment.py 用 /**/ 替代空格,用于空格的绕过 ALL
space2dash.py 用注释符–和一个随机字符串加一个换行符替换控制符 SQL Server、 SQLite
space2hash.py 和上面类似,不过这儿是用#注释符 MySQL
space2morecomment.py 将空格用 /_/ 替代 ALL
space2morehash.py 和 space2hash.py 类似,但是这儿多一个 # 和换行符 MySQL >= 5.1.13
space2mssqlblank.py 用这些随机空白符替换 payload 中的空格 SQL Server
space2mssqlhash.py 用 # 加一个换行符替换 payload 中的空格 SQL Server、MySQL
space2mysqlblank.py 用这些随机空白符替换payload中的空格 MySQL
space2mysqldash.py 用 – 加一个换行符替换空格 MySQL、SQL Server
space2plus.py 用 + 替换空格 ALL
space2randomblank.py 用这些随机空白符替换 payload 中的空格 ALL
symboliclogical.py 用 && 替换 and ,用 || 替换 or ,用于这些关键字被过滤的情况 ALL
unionalltounion.py 用 union select 替换union all select ALL
unmagicquotes.py 用宽字符绕过 GPC addslashes ALL
uppercase.py 将 payload 大写 ALL
varnish.py 添加一个 HTTP 头 “ X-originating-IP ” 来绕过 WAF ALL
versionedkeywords.py 对不是函数的关键字进行注释 MySQL
versionedmorekeywords.py 注释每个关键字 MySQL >= 5.1.13
xforwardedfor.py 添加一个伪造的 HTTP 头 “ X-Forwarded-For ” 来绕过 WAF ALL
nonrecursivereplacement.py 关键字双写,可用于关键字过滤(sqlmap1.4.2中无此文件) ALL

tamper脚本作用范围大部分摘录自:https://blog.csdn.net/dyw_666666/article/details/83420362也有一些为我个人补充的

暴力攻击

暴力攻击又称为洪水攻击和穷举法攻击,攻击方式简单来说就是去一个个试错,简单粗暴。且在大多数时候都很有效。

表名的暴力破解

在某些情况下,--tables不能检索到数据库的表名。这些情况通常属于以下类别之一:

  • 数据库管理系统(DBMS)是MySQL <5.0,不存在系统表information_schema
  • 数据库管理系统(DBMS)是Microsoft Access,系统表MSysObjects不可读(默认设置)。
  • 数据库用户权限过低无法读取表名。
    暴力破解表名用的字典是sqlmap解压路径\data\txt\common-tables.txt,您可以根据需要对其进行编辑。
    参数: --common-tables

列(表头)名的暴力破解

在某些情况下,--columns不能检索到数据库表的列(表头)名。这些情况通常属于以下类别之一:

  • 数据库管理系统是MySQL <5.0,不存在系统表information_schema
  • 数据库管理系统是Microsoft Access,其中系统表内部不提供此类信息。
  • 数据库用户权限过低无法读取列(表头)名。

暴力破解列(表头)名用的字典是sqlmap解压路径\data\txt\common-columns.txt,您可以根据需要对其进行编辑。
参数: --common-tables

接下来的内容涉及控制底层操作系统权限,在底层操作系统执行命令,改动注册表,和底层系统建立tcp连接等已经脱离基础使用范围,脱离小白我的能力范围。

常用专有名词

Payload: 有效载荷,sqlmap中每执行一条sql注入都算是一个有效载荷
DBMS: 数据库管理系统(Database Management System)比如:MySQL,Oracle,Microsoft SQL Server,Microsoft Access…
CSRF:跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
WAF:Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF).。

sqlmap 参数意义

我是根据sqlmap的-hh命令中的参数进行翻译的,我进行了一些对比发现官方文档并没有-hh命令中的参数全面。

基础信息

简写 全写 意义
-h --help 显示基本帮助消息并退出
-hh 显示高级帮助消息并退出
--version 显示程序的版本号并退出
-v VERBOSE 详细程度:0-6(默认为1)
-d DIRECT 直接连接数据库的连接字符串
-u URL --url=URL 指定连接的目标URL
-l LOGFILE 从Burp或WebScarab代理日志文件中解析目标
-m BULKFILE 扫描文本文件中给定的多个目标
-r REQUESTFILE 从文件加载HTTP请求
-g GOOGLEDORK 将Google dork结果作为目标URL处理
-c CONFIGFILE 从配置INI文件加载选项

请求操作

参数 意义
--method=方法 强制使用给定的HTTP方法(例如:get,post)
--data=数据 通过POST发送的数据字符串(例如:“ id = 1”)
--param-del=字符 用于分割参数值的字符(例如:&)
--cookie=cookie HTTP Cookie请求头的值 (例如:“PHPSESSID=a8d127e…”)
--cookie-del=cookie分割字符 用于分割Cookie值的字符(例如:;)
--load-cookies=文件 包含Netscape/wget格式cookies的文件
--drop-set-cookie 忽略响应中的 Set-Cookie 头
--mobile 通过HTTP User-Agent请求头模仿智能手机
-A 请求头--user-agent=请求头 HTTP User-Agent的请求头(浏览器信息)
--random-agent 使用随机选择的HTTP User-Agent请求头
--host=HOST HTTP Host 请求头(主机信息)
--referer=referer HTTP Referer 请求头(从何方网站来到此网站)
-H 请求头--header=请求头 额外的一个请求头(例如:“X-Forwarded-For:127.0.0.1”)
--headers=多个请求头 额外的多个请求头 (例如: “Accept-Language: fr\nETag: 123” 每个标头必须用换行符分隔)
--auth-type=验证类型 HTTP身份验证类型(基本、摘要、NTLM或PKI)
--auth-cred=验证凭据 HTTP身份验证凭据(名称:密码)
--auth-file=验证文件 HTTP认证PEM证书或私钥文件
--ignore-code=忽略代码 忽略(有问题的)HTTP错误代码(例如401)
--ignore-proxy 忽略系统默认代理设置
--ignore-redirects 忽略重定向尝试
--ignore-timeouts 忽略连接超时
--proxy=代理 使用代理连接到目标URL(格式:--proxy http(s)://ip[端口])
--proxy-cred=代理凭证 代理身份验证凭据(名称:密码)
--proxy-file=代理文件 从文件加载代理列表
--tor 使用Tor匿名网络
--tor-port=Tor代理端口 设置除默认以外的Tor代理端口
--tor-type=Tor代理类型 设置Tor代理类型(HTTP,SOCKS4或SOCKS5(默认))
--check-tor 检查Tor是否正确使用
--delay=延迟秒数 在考虑超时HTTP请求之前,可以指定等待的秒数。有效值是一个浮点数,比如10.5秒。默认是30秒
--timeout=等待秒数 超时连接之前等待的秒数(默认为30)
--retries=重试次数 在连接超时时重试(默认3)
--randomize=RPARAM 每次请求期间随机更改其值得参数名称。长度和类型根据提供的原始值保持一致
--safe-url=URL地址 隔一会就访问一下的安全URL
--safe-post=POST数据 访问安全URL时携带的POST数据
--safe-req=文件 从文件中载入安全HTTP请求
--safe-freq=URL地址 每次测试请求之后都会访问一下的安全URL
--skip-urlencode 跳过有效负载数据的URL编码
--csrf-token=csrf令牌 用于保存反CSRF令牌的参数
--csrf-url=CSRF URL 提取反CSRF令牌要访问的URL地址
--force-ssl 强制使用SSL/HTTPS
--hpp 使用HTTP参数污染方法
--chunked 使用 HTTP 分块传输编码(POST)请求
--eval=EVALCODE 在请求之前评估提供的Python代码(例如“import hashlib;id2=hashlib.md5(Id).hedigest()”)

性能优化

参数 意义
-o 打开所有优化开关(相当于–keep-alive --null-connection --threads=3)
--predict-output 预测常见查询输出
--keep-alive 设置连接为持久连接。相当于HTTP请求头中设置connection:keep-alive
--null-connection sqlmap中设置空连接,表示不接受HTTP当中的Body。 可以直接获得HTTP响应的大小而不用获得HTTP响应体,常用在盲注过程中
--threads=THREADS 并发 HTTP 请求的最大数量(默认值1)
--level=测试等级 要执行的测试级别(1-5,默认值1)
--risk=风险等级 要执行的测试的风险(1-3,默认值1)
--string=字符串 正确情况(True)下页面应该出现的字符串
--not-string=字符串 错误情况(False)下页面应该出现的字符串
--regexp=正则表达式 正确情况(True)下页面应该出现的正则表达式对应的内容
--code=代码 查询计算为True时要匹配的HTTP代码
--smart 当拥有一个潜在目标url的大列表(如 -m),使用--smart能加快找到有注入点的url。
--text-only 仅基于文本内容比较页面(常用于页面中要大量活动内容,不如axjx)
--titles 仅根据标题比较页面(布尔盲注的时候根据指定标题来判断真假值,比如成功页面标题 True 失败页面标题 False --titles)
--technique=SQL注入技术 要使用的SQL注入技术(默认为“ BEUSTQ”全部)
--time-sec=盲注等待时间 设置基于时间的SQL盲注的响应时间。默认情况下,它的值设置为5秒。
--union-cols=最大行数 进行联合查询注入时,Sqlmap自动检测列(表头)数,范围是1到10。当level值较高时列数检测范围的上限会扩大到50。可以通过此参数来指定最大行数。
--union-char=字符值 Sqlmap进行联合查询注入时使用空字符(NULL)(level值较高时Sqlmap会生成随机数用于联合查询注入)。 因为有时使用空字符注入会失败而使用随机数会成功。 您可以通过使用–union-char带有所需字符值(例 --union-char 123)的选项。
--union-from=表名 在某些UNION查询SQL注入情况下,需要在FROM子句中强制使用有效且可访问的表名。有时候可能必须要用到指定的表SQL语句才能正确执行(例如–union-from=users)。
--dns-domain=DNS域名 用于DNS渗透攻击的域名

--second-url=目标URL: 二阶攻击进行SQL注入的目标URL
--second-req=URL地址: 二阶攻击显示效果的URL地址

注入参数

参数 意义
-p 测试参数 可测试参数(比如说提供-p "id,user-agent",会去请求头中的id与user-agent中寻找是否存在注入点)
--skip=跳过参数 跳过给定参数的测试(具体介绍看上方,可测试的参数)
--skip-static 跳过看起来不是动态的测试参数
--param-exclude=正则表达式 从测试中排除参数的正则表达式(例如“ses”)
--param-filter=测试参数 按位置选择可测试参数(例如“POST”)
--dbms=数据库管理系统(DBMS) 指定数据库管理系统(DBMS)
--dbms-cred=用户:密码 数据库管理系统(DBMS)身份验证凭据(用户:密码)
--os=OS 指定数据库管理系统(DBMS)使用的操作系统
--invalid-bignum 使用大数字来使值无效 当需要让参数无效时,sqlmap默认使用经典值,比如id=13的无效值为id=-13,有了这个参数,就可以强制使用大整数值来实现相同的目标(例如id=99999999)。
--invalid-logical 使用布尔值来使值无效 有了这个参数,就可以强制使用布尔操作来实现相同的目标(例如id=13 and18=19)。
--invalid-string 使用随机字符串使值无效 有了这个参数,就可以强制使用随机字符串来实现相同的目标(例如id=akewmc)。
--no-cast 关闭有效载荷(Payload)释放机构
--no-escape 关闭字符串转义机制
--prefix=Payload前缀 设置SQL注入有效载荷(Payload)前缀
--suffix=Payload后缀 设置SQL注入有效载荷(Payload)后缀
--tamper=指定混淆脚本 使用混淆技术将SQL语句混淆注入

检索信息

简写 全写 意义
-a --all 获取一切能获取到的信息
-b --banner 检索数据库管理系统(DBMS)版本信息
-f --fingerprint 检索数据库管理系统(DBMS)指纹信息(和-b效果类似,但版本信息更加详细,-b,-f配合使用效果最好)
--current-user 检索当前数据库管理系统(DBMS)当前使用用户信息
--current-db 检索当时数据库管理系统(DBMS)用的中使用的数据库名
--hostname 检索数据库管理系统(DBMS)使用的服务器的主机名
--is-dba 检查当前账号是否为数据库管理系统(DBMS)管理员账户
--users 检索数据库管理系统(DBMS)所用用户
--passwords 检索数据库管理系统(DBMS)用户密码散列
--privileges 检索数据库管理系统(DBMS)用户权限
--roles 检索数据库管理系统(DBMS)用户角色(效果和–privileges类似,都能获取用户和对应的权限)
--dbs 检索数据库管理系统(DBMS)当前有哪些数据库
--tables 检索数据库管理系统(DBMS)存在哪些表
--columns 检索获取数据库管理系统(DBMS)当前数据库中的表头信息
--schema 检索数据库管理系统(DBMS)获取所有数据库中的表头信息
--count 检索表中有多少条数据
--dump 检索当前数据库库中所有表中的数据
--dump-all 检索所有数据库中的所有表中的数据
--search 搜索列、表或数据库名称(需要配合-D、-T、-C使用)
--comments 检索数据库中的注释信息
-D DB 数据库管理系统(DBMS)中指定数据库
-T TBL 数据库管理系统(DBMS)中指定表
-C COL 数据库管理系统(DBMS)中指定列(表头)
-X EXCLUDE 不枚举的数据库管理系统(DBMS)数据库标识符
-U USER 数据库管理系统(DBMS)中指定的用户
--exclude-sysdbs 排除数据库管理系统(DBMS)中的系统库
--pivot-column=P.. 数据透视列名
--where=where条件 表转储时使用where条件
--start=limit start 要检索的第一个转储表项
--stop=limit stop 要检索的最后一个转储表项
--first=第一个字符 要检索的第一个查询输出字字符
--last=最后一个字符 要检索的最后一个查询输出字字符
--sql-query=SQL语句 要执行的SQL语句
--sql-shell 提示交互式SQL Shell
--sql-file=SQL文件 从给定文件执行SQL语句

暴力攻击

参数 意义
--common-tables 暴力破解表名
--common-columns 暴力破解列名
--common-files 暴力破解寻找存在的文件