SQLmap指导手册
一、前言
sqlmap是一个开源的渗透测试工具,它自动检测和利用SQL注入漏洞并接管数据库服务器。它配备了强大的检测引擎、最终渗透测试器的许多利基特性和广泛的开关,从数据库指纹、从数据库获取数据到通过带外连接访问底层文件系统和在操作系统上执行命令。
二、特点
- 全力支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、Informix、MariaDB、MemSQL、TiDB、CockroachDB、HSQLDB、H2、MonetDB、Apache Derby、Amazon RedShift、Vertica、Mckoi、Presto、Altibase、MimerSQL、CrateDB、Greenmers、Dlesses、Apache Ignite、Cubrid、InterSystems Cache、IRIS、eXtremeDB和FrontBase数据库管理系统。
- 完全支持六种SQL注入技术:基于布尔的盲查询、基于时间的盲查询、基于错误的查询、基于联合查询的、基于堆栈的查询和带外查询。
- 支持直接连接到数据库通过提供DBMS凭据、IP地址、端口和数据库名称,而无需通过SQL注入传递。
- 支持枚举用户、密码散列、特权、角色、数据库、表和列.
- 密码哈希格式的自动识别和对使用基于字典的攻击破解它们。.
- 支持转储数据库表完整地说,根据用户的选择,有一系列的条目或特定的列。用户还可以选择仅转储每列条目中的字符范围。
- 支持搜索特定数据库名称、跨所有数据库的特定表或跨所有数据库表的特定列。例如,这对于标识包含自定义应用程序凭据的表非常有用,而相关列的名称包含字符串,如name和PASS。
- 支持下载和上传任何文件当数据库软件是MySQL、PostgreSQL或MicrosoftSQLServer时,从数据库服务器底层文件系统。
- 支持执行任意命令并检索其标准输出当数据库软件是MySQL、PostgreSQL或Microsoft SQL Server时,在底层操作系统的数据库服务器上。
- 支持在攻击者计算机和数据库服务器之间建立带外有状态tcp连接。底层操作系统。该通道可以是交互式命令提示符、Meterpreter会话或根据用户选择的图形用户界面(VNC)会话。
- 支持数据库进程的用户权限提升通过Metasploit的Meterpreter的getsystem命令。
三、技法
sqlmap能够检测和利用五种不同的sql注入。类型:
基于布尔的盲注:sqlmap替换或追加到HTTP请求中受影响的参数,这是一个同步有效的SQL语句字符串,包含SELECT子语句,或用户希望检索输出的任何其他SQL语句.对于每个HTTP响应,通过将HTTP响应头/正文与原始请求进行比较,工具将按字符推断注入语句字符的输出。或者,用户可以提供一个字符串或正则表达式来匹配True页面。在sqlmap中实现的执行此技术的二分法能够以最多7个HTTP请求获取输出的每个字符。如果输出不在明文明文字符集内,sqlmap将调整算法的范围,以检测输出。
时间盲注:sqlmap替换或附加到HTTP请求中受影响的参数,这是一个同步有效的SQL语句字符串,包含一个查询,该查询暂停后端DBMS返回一定时间。对于每个HTTP响应,通过比较HTTP响应时间和原始请求,工具将按字符推断注入语句的输出。与基于布尔值盲注的方法一样,本文也采用了二分法.
基于错误的注入:sqlmap替换或附加到受影响的参数中,一个特定于数据库的错误消息引发语句,并解析HTTP响应头和正文,以搜索DBMS错误消息,其中包含注入的预定义字符链和在其中输出的子查询语句。只有当Web应用程序被配置为公开后端数据库管理系统错误消息时,此技术才能工作。
基于联合查询的注入:sqlmap向受影响的参数追加语法上有效的SQL语句,以UNION ALL SELECT。当web应用程序页面直接传递SELECT语句中的for循环,以便在页面内容上打印查询输出的每一行。sqlmap也可以利用部分(单项)联合查询SQL注入控件中未循环语句输出时出现的漏洞。for结构,而只显示查询输出的第一个条目。
堆叠注入:sqlmap测试Web应用程序是否支持堆叠查询,如果支持,它会在HTTP请求中附加受影响的参数,即分号(;)后面跟着要执行的SQL语句。此技术对于运行其他SQL语句非常有用。比如说SELECT,数据定义或数据操纵语句,可能导致文件系统读写访问和操作系统命令的执行取决于底层后端数据库管理系统和会话用户权限。
四、使用
用法:python sqlmap.py [选项]
4.1选项
至少必须提供其中一个选项来定义目标。
-h, --help 显示基本帮助消息并退出
-hh 显示高级帮助消息并退出
--version 显示程序的版本号并退出
-v VERBOSE 冗长度等级: 0-6 (默认为1)
Sqlmap的输出信息按从简到繁共分为7个级别(和葫芦娃一样多),依次为0、1、2、3、4、5和6。使用参数“-v <级别>”来指定某个等级,如使用参数“-v 6”来指定输出级别为6。默认输出级别为1。各个输出级别的描述如下:
0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体。
各个级别输出的信息详细到什么程度,还需要自己尝试下,亲眼见到,才会有明确的认识。
4.2目标
-d 直接连接数据库
使用该参数需要安装python-pymysql,该参数后跟一个表示数据库的字符串,执行如下命令进行连接MySQL、Oracle、Microsoft SQL Server或PostgreSQL
python sqlmap.py -d "数据库类型://数据库用户名:密码@IP:端口/数据库名"
当数据库管理系统是SQLite、Microsoft Access或Firebird等时格式为:
python sqlmap.py -d "数据库类型://数据库用户名:密码@IP:端口/数据库名"
-u --url 注入目标
使用参数此指定一个URL作为目标,该参数后跟一个表示URL的字符串,可以是http协议也可以是https协议,还可以指定端口
python sqlmap.py -u "目标链接"
-l从Burp或WebScarab代理日志文件解析目标
使用参数-l指定一个Burp或WebScarab的代理日志文件,Sqlmap将从日志文件中解析出可能的攻击目标,并逐个尝试进行注入。该参数后跟一个表示日志文件的路径。
python sqlmap.py -l "代理日志文件路径"
-m 扫描文本文件中的多个目标
参数-u一次只能指定一个URL,若有多个URL需要测试就显得很不方便,我们可用将多个URL以一行一个的格式保存在文本文件中,然后使用参数-m,后跟该文本文件路径,让Sqlmap依次读取文件中的URL作为攻击目标。
python sqlmap.py -m "多个url的txt文件路径"
-r 从文件中载入HTTP请求
可以将一个HTTP请求保存在文件中,然后使用参数-r加载该文件,Sqlmap会解析该文件,从该文件分析目标并进行测试。
python sqlmap.py -r "包含HTTP请求txt文件路径"
-g 将Google作为攻击目标
Sqlmap能自动获取Google搜索的前一百个结果,对其中有GET参数的URL进行注入测试。当然,所处的网络环境要能访问Google才行
python sqlmap.py -g "inurl:".php?id=1""
-c 从配置文件中载入攻击目标
使用参数-c指定一个配置文件(如:sqlmap.conf),Sqlmap会解析该配置文件,按照该配置文件的配置执行动作。配置文件中可以指定攻击目标,实际上除了攻击目标外,配置文件还可以指定各种参数的值。Sqlmap的按照目录中有一个名为sqlmap.conf的文件,该文件是配置文件的模板,看看该文件内容,就能明白配置文件是什么意思了。
python sqlmap.py -c "配置文件路径"
4.2请求
这些选项可用于指定如何连接到目标URL。
--method 强制使用给定的HTTP请求方法
一般来说,Sqlmap能自动判断出是使用GET方法还是POST方法,但在某些情况下需要的可能是PUT等很少见的方法,此时就需要用参数--method来指定方法。
python sqlmap.py -u "目标链接" --method=PUT
--data 通过POST发送数据字符串
该参数指定的数据会被作为POST数据提交,Sqlmap也会检测该参数指定数据是否存在注入漏洞。如:
python sqlmap.py -u "目标链接" ---data="POST请求数据"
--param-del 用于分割参数值的字符
例子中--data的数据id=0&name=werner其实由两个部分组成:id=0和name=werner,默认地以&作为分隔符。我们可以使用“--param-del”来指定分隔符。如:
python sqlmap.py -u "目标链接" --data="id=0;name=werner" --param-del=";"
--cookie HTTP 头部的cookie值
选项和切换:--cookie, --cookie-del, --load-cookies和--drop-set-cookie
这些选项和开关可用于两种情况:
- 测试Web应用程序需要基于cookie的身份验证
- 检测和利用此类标头值上的SQL注入。
(1)--cookie和--cookie-del
在浏览器中登录目标网站后复制出维持登录状态的cookie,用参数--cookie来指定这些cookie,如:
python sqlmap.py -u "目标链接" --cookie="cookie值"
与POST参数不同,cookie默认的分隔符为“;”,想要指定cookie中的分隔符,使用参数--cookie-del,和上文中的data中的--param-del参数用发现相似。
(2)--drop-set-cookie
若HTTP响应头中有Set-Cookie,Sqlmap会自动设置Set-Cookie设置的cookie,并对这些cookie进行检测。若不想让Sqlmap这么做,添加参数--drop-set-cookie即可,这样,Sqlmap会忽略Set-Cookie。
python sqlmap.py -u "目标链接" --drop-set-cookie
(3)--load-cookies
该参数用于从文件中载入Netscape或wget格式的cookie。wget可以保存和载入cookie。
--user-agent User-Agent头部值
参数:--user-agent和--random-agent
默认情况下Sqlmap发送的HTTP请求中的User-Agent值为:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
但是,可以用选项来伪装它。使用参数--random-agent,Sqlmap会从文件./txt/user-agents.txt中随机地取一个User-Agent。注意,在一次会话中只有使用同一个User-Agent,并不是每发一个HTTP请求包,都随机一个User-Agent。--user-agent也可以通过提供自定义用户代理作为选项的参数:
--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0"
当“--level”设置为3或更高时,Sqlmap会检测User-Agent是否存在注入漏洞,关于“--level”的更多信息见下文。
--host HTTP Host头部值
使用该参数可以手动指定HTTP头中的Host值。
当“--level”设置为5或更高时,Sqlmap会检测Host是否存在注入漏洞,关于“--level”的更多信息见下文。
python sqlmap.py -u "目标链接" --host="host值"
--referer HTTP Referer头部值
使用该参数可以指定HTTP头中的Referer值。Sqlmap发送的HTTP请求头部默认无Referer字段。
当“--level”设置为3或更高时,Sqlmap会检测Referer是否存在注入漏洞,关于“--level”的更多信息见下文。
python sqlmap.py -u "目标链接" --referer="referer值"
--headers 额外的HTTP头部值
使用该参数可以在Sqlmap发送的HTTP请求报文头部添加字段,若添加多个字段,用“n”分隔。加参数“-v 5”是为了让Sqlamp输出发送的HTTP请求包,便于我们观察。如命令:
python sqlmap.py -u "目标链接" -v 5 --headers "头部名称1:值n头部名称2:值"
--auth-type 认证类型和证书
这些参数用于进行身份认证。“--auth-type”用于指定认证方式,支持以下三种身份认证方式:Basic,Digest,NTLM
--auth-cred用于给出身份认证的凭证,格式是“username:password”。
如:
python sqlmap.py -u "目标链接" --auth-type Basic --auth-cred "testuser:testpass"
--auth-file HTTP协议私钥认证
当web服务器需要适当的客户端证书和用于身份验证的私钥时,应使用此选项。提供的值应该是格式化的PEM。key_file包含证书和私钥的。
--ignore-code 忽略(有问题的)HTTP错误代码
如果测试偶尔会返回HTTP错误代码的站点,而HTTP错误代码会导致常规sqlmap运行出现问题(例如401未经授权),而您希望忽略它并继续进行测试,则可以使用选项--ignore-code。另外的选项还有--ignore-proxy 忽略系统代理设置,--ignore-redirects 忽略重定向尝试,--ignore-timeouts 忽略连接超时。格式是
python sqlmap.py --ignore-code --ignore-proxy --ignore-redirects
--proxy 使用代理连接目标url
参数选项:--proxy、--proxy-cred、--proxy-file和--ignore-proxy
使用参数--proxy来设置一个HTTP(S)代理,格式是
python sqlmap.py --proxy=http(s)://address:port
若代理需要认证,使用参数--proxy-cred来提供认证凭证,格式是
python sqlmap.py -u "目标链接" --proxy-cred username:password
使用参数--proxy-file指定一个存储着代理列表的文件,Sqlmap会依次使用文件中的代理,当某个代理有任何连接问题时就会被弃用而换下一个代理。格式是
python sqlmap.py -u "目标链接" --proxy-file "文件路径"
--tor 使用匿名网络
参数选项:--tor, --tor-port, --tor-type和--check-tor
不管任何原因,需要保持匿名,而不是通过一个预定义的HTTP(S)代理服务器传递,则可以配置TOR客户连同Privoxy或者类似这样的代理软件按照TOR安装指南配置客户端,然后可以用开关--tor让sqlmap将尝试自动设置Tor代理连接设置。如果想要手动指定Tor的类型和端口可以使用参数“--tor-type”和“--