前言

SQLMap是每个渗透测试师的必备工具。这是众多强大的主流工具之一,尤其是在测试OWASP Top 10中的SQL注入漏洞时。从扫描SQL注入漏洞到获取数据库名字、表和列,以及获得系统访问权限,其可被用于多种目的。

在本文中,我们将看到不同的SQLMap命令,在对不同场景下的SQL注入进行利用时可能会比较得心应手。

可以从如下链接下载SQLMap:

Windows

Linux: git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

出于演示目的,我用的是Vulnhub上的这个虚拟机。

让我们一起来看看SQLMap这款工具在GET和POST请求上的基本用法。

GET请求

  • sqlmap -u http://site-to-test.com/test.php?id=1 -p id
  • sqlmap -u http://site-to-test.com/test.php?id=1*
  • -u:要扫描的URL
  • -p:要扫描的字段
  • *:要扫描的字段(如果不用-p来指定的话)

POST请求

我们可以在SQLMap扫描中指定POST请求体中的数据。

  • sqlmap -u http://site-to-test.com/admin/index.php –data=”user=admin&password=admin” -p user
  • –data=POST数据

另外一种方式是复制Burp请求到一个文件里,然后同样传给SQLMap。

  • sqlmap –r 请求文件的路径

让我们再深入地了解一下SQLMap的其他选项。

扫描POST登录页面

POST请求的登录页面是通过cookie头来进行身份认证的,也就是GET或者POST请求时,包含在HTTP头里的。我们必须给SQLMap提供有效的cookie才能对登录页面的POST请求进行扫描。

  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –cookie=”cookie value

/admin/index.php?id=1 是一个登录页面的POST请求。

  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –user-agent=infosec
  • sqlmap -u http://192.168.202.163/admin/index.php?id=1 –referer= http://192.168.202.163/admin/index.php

除此以外,我们还可以通过–random-agent选项来随机指定user-agent头。

爬取

爬取(crawl)是一个非常重要的选项,可以让SQLMap从网站根目录开始爬取,爬取深度可以在命令中指定。

sqlmap -u http://192.168.202.160/ –crawl=1

–crawl: 指定爬取深度。(例如:指定值为2表示让SQLMap最多爬取两层目录)

如果想排除爬取范围内的任意页面,我们可以通过使用–crawl-exclude参数。当爬取POST型的登录页面时,该选项十分有用。

  • sqlmap -u http://192.168.202.163/ –crawl=3 –cookie=”cookie value” –crawl-exclude=”logout”

该命令可以最多爬取三层目录,并排除任何存在“logout”(注销)关键字的URL。

如下图所示,SQLMap爬取了网站,但是排除了注销的URL。

去掉–crawl-exclude选项,再运行一次同样的命令:

如下图所示,去掉–crawl-exclude选项后,SQLMap爬取了注销URL。该URL由于注销会导致退出当前会话(session),失效的会话会导致无法完成扫描。

通过代理使用SQLMap

我们可以指定一个代理来记录传递的请求。如果想通过Burp这样的代理工具来传递请求,打开Burp Suite并配置其监听本机的8080端口。接着使用如下SQLMap命令:

  • sqlmap -u http://192.168.202.162/cat.php?id=1 -p id –proxy=”http://localhost:8080″

现在想象一下这样的场景:当SQL注入关键字,比如OrderBy和Union,被服务器端加到黑名单了。对于这种场景,我们可以通过驼峰拼写法来绕过这类限制。用SQLMap将流量转发到Burp,然后用Burp的“匹配和替换(match and replace)”功能来绕过以上限制。

匹配和替换功能可以在Burp的“Proxy”标签下的“Options”标签下找到。

这样就可以检查请求中是否存在“union”这样的关键字。如果存在,那么将其替换为“UnIoN”。

在某些网站只能通过代理服务器访问的场景下,同样可以用下面的命令来指定:

  • sqlmap -u http://192.168.202.162/cat.php?id=1 -p id –proxy=”http://localhost:8080″ –proxy-cred=username:password

批(量)处理

批处理(batch)命令适用于非交互的会话。在扫描的时候,SQLMap可能会让我们提供一些输入:比如,在用爬取功能的时候,会问用户是否想扫描指定的URL。当在命令中指定–batch选项时,SQLMap会用一个默认值来处理,而不再问用户。

表单

存在表单字段的页面URL(比如登录页面)可以通过–form选项来解析该页面,并引导用户去测试指定字段。

现在,可以通过–form和–batch选项一起来高效地测试存在大量表单字段的页面了。因为这样可以解析该页面,并代替用户自动提供输入来测试这些表单字段。

如果想要扫描整个网站,可以同时用crawl和form选项。

线程

线程(threads)选项可以让用户指定SQLMap发送的并发请求数量,这样可以减少整体的测试时间。不过别总是保持一个较高的值,因为可能会影响结果的准确性。

危险和级别(Risk and level)

危险(risk)可以指定SQLMap使用的payload类型。默认情况下值为1,最高可以设置为3。值为3时,就是最大值,包含了一些严重的SQL查询。

级别(level)指定要执行的检查或payload的数量。值的范围时从1到5。最大值为5,扫描时会用到大量的payload。

当SQLMap使用默认设置无法扫描注入点时,建议增加risk和level的值。(译者注:此举存在风险【risk】)

详细信息

假如我们想看看SQLMap发送的payload,可以用详细信息(verbose)参数,其值范围是从1到6。

数据库枚举

众所周知,SQLMap主要用于对SQL注入的利用,一起来看看这些通过SQL注入漏洞来枚举数据库的命令。

 1. –dbs: 该选项用于枚举数据库。

2. 现在得到了数据库名。要获得“photoblog”数据库的表,可以执行如下命令:

3. 要获得“users”表中的字段细节,可以执行如下命令:

4. 要转储(dump)“users”这张表中的数据,可以用–dump命令:

5. 查看当前数据库用户:

6. 查看当前数据库名:

7. 查看权限(privileges)、角色(roles),并查看当前数据库用户是否是数据库管理员:

用tamper脚本绕过WAF

很多时候,我们会遇到网站被WAF(Web Application Firewall)保护的场景,我们可以用下面的命令来检查目标网站是否被WAF保护:

  • –identify-waf (译者注:新版本中已移除)

识别出WAF后,我们就可以用tamper脚本来进行绕过。tamper脚本可以修改请求来绕过WAF检测。这些脚本可以在/usr/share/sqlmap/tmper/ 目录下找到。

执行系统命令

如果当前数据库用户拥有DBA权限,我们就可以使用如下选项来执行操作系统级别的命令:

  • 对于Linux目标服务器:
  •  sqlmap -u http://192.168.202.162/cat.php?id=1 –os-shell
  • 对于Windows目标服务器:
  •  sqlmap -u http://192.168.202.162/cat.php?id=1 –os-cmd cmd命令

执行SQL查询

我们还可以用下面的命令在数据库中执行SQL语句:

  • sqlmap -u 192.168.202.164/cat.php?id=2 –sql-shell

其他选项

一些其他选项如下:

1. 扫描一些被类似Basic、NTLM和Digest这样的HTTP身份认证保护的页面:

  • sqlmap -u http://example.com/admin.aspx –auth-type Basic –auth-cred “admin:admin”

2. 扫描被基于密钥认证保护的页面:

  • sqlmap -u http://example.com/admin.aspx –auth-file=PEM证书或私钥文件路径

3. 随机化发起攻击的IP地址(在比如WAF检测,或者为了增加被溯源的难度,隐藏攻击来源等场景下很有用)。

使用默认的Tor(洋葱路由)匿名网络:

  • sqlmap -u http://example.com/admin.aspx –tor

指定Tor的端口:

  • sqlmap -u http://example.com/admin.aspx –tor-port=tor代理端口

4. 如果需要在每次HTTP请求之间延时:

  • sqlmap -u http://example.com/admin.aspx –delay=1 #延时1秒

5. 如果页面被CSRF token保护,同样可以用下面的命令:

  • sqlmap -u http://example.com/admin.aspx –csrf-token=csrf token

6. 在二阶注入中,SQL注入的payload会被存储在目标网站的数据库中,之后在访问其他页面的时候被执行。我们指定一个SQLMap用来请求的已被注入的URL。然后让SQLMap用如下命令来注入:

  • sqlmap -r /root/Desktop/Burp.txt –second-order “http://target/vulnerbalepage.php”

Burp.txt是包含将要用于测试的文件,其中包含注入点。

  • –second-order “URL” 指定的是每次注入后SQLMap去访问的URL。

总结

在检测和利用SQL注入漏洞方面,SQLMap是一个不错的工具。其支持如此多的选项,开关以及可以创建并使用自定义脚本,让它从众多检测SQL注入漏洞的开源工具中脱颖而出。