翻译来自:掣雷小组
成员信息:
thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt、
6.6、使用SQLMap查找和利用SQL注入
正如前面的小节所示,开发SQL是一个非常辛苦的过程。SQLMap是Kali Linux中包含的命令行工具,它可以帮助我们使用多种技术对各种数据库自动检测和利用SQL注入。
在这小节中,我们将使用SQLMap来检测和利用SQL漏洞,并获取应用程序的用户名和密码。
实战演练
浏览http://192.168.56.11/mutillidae,进入OWASP Top10 | A1 – SQL injection | SQLi Extract Data| User Info:
1. 尝试任何用户名和密码,例如user和password,然后单击View Account Details。
2. 登录将失败,但我们对URL感兴趣。转到地址栏,将完整的URL复制到剪贴板。应该是这样的: http://192.168.56.11/mutillidae/index.php?page=user-info.php&username=user&password=password&user-info-php-submit-button=View Account Details
3. 现在,在终端窗口中,输入以下命令:
代码语言:javascript复制sqlmap -u "http://192.168.56.11/mutillidae/index.php?page=user-info.php&username=user&password=password--curent-user --current-db --is-dba
可以看到-u参数的值是复制的URL。使用-p,我们告诉SQLMap,我们希望在用户名参数中查找SQLi,一旦漏洞被利用,我们希望它检索当前数据库用户名和数据库名称,并知道该用户在数据库中是否具有管理权限。检索这些信息是因为我们只想知道用户名参数中的URL中是否有SQLi。下面的截图显示了这个命令以及SQLMap如何表示执行:
4. 一旦SQLMap检测到应用程序使用的DBMS,它还会询问我们是否要跳过对其他DBMS的测试,是否要包含对所检测的特定系统的所有测试,即使它们超出了当前级别和配置风险的范围。在这种情况下,我们回答Yes以跳过其他系统,而回答No以则进行所有测试。
5. 一旦我们指定的参数被发现是存在sql注入的,SQLMap将询问我们是否需要测试其他参数。我们对这个问题的回答是No的,然后我们会看到结果:
6. 如果我们想要获得用户名和密码,就像我们在前面的小节中所做的那样,我们需要知道具有这些信息的表的名称。在终端执行以下命令:
代码语言:javascript复制sqlmap -u"http://192.168.56.11/mutillidae/index.php?page=user-info.php&username=test&password=test-D nowasp --tables
SQLMap保存了它执行的注入的日志,因此第二次攻击将比第一次攻击花费更少的时间。如您所见,攻击返回我们指定的数据库中的表列表:
7. Account表看起来像是拥有我们想要的信息。让我们查看的他的字段信息:
代码语言:javascript复制sqlmap -u"http://192.168.56.11/mutillidae/index.php?page=user-info.php&username=test&password=test-D nowasp -T account --dump
我们现在有了完整的用户表,在这种情况下,我们可以看到密码没有加密,所以我们可以直接使用密码进行登录:
8. SQLMap还可以用于在数据库和操作系统中提权。例如,如果数据库用户是管理员权限,我们可以使用--users 和 --password选项提取所有数据库用户的用户名和密码散列,如下图所示:
通常,这些也是操作系统用户,并将允许我们提升到操作系统权限或者可以登录其他网络主机。
9. 我们还可以得到一个shell,它允许我们直接向数据库发送SQL查询,如下所示:
原理剖析
SQLMap使用SQLi字符串测试给定URL和数据中的所有输入参数,或者只测试-p选项中的指定输入参数,并解释响应以发现是否存在漏洞。不过最好不要模糊测试所有输入参数; 有哪位寻找所有可能性的注入可能会花费大量时间,并在网络中产生非常可疑的流量。一般使用SQLMap来利用我们已经知道存在的注入,并且试图缩小搜索过程。可以向它提供更多可用的信息,例如存在sql注入的参数、DBMS类型和其他信息。
在这个小节中,我们已经知道用户名参数容易受到SQL注入的攻击(因为我们使用了mutillidae的SQL注入测试页面)。在第一次攻击中,我们只想确定那里有一个注入,并要求提供一些非常基本的信息:用户名(—curant -user)、数据库名(—current-db)以及用户是否是管理员(—is-dba)。
在第二次攻击中,我们指定了要使用-D选项查询的数据库,以及从上次攻击中获得的名称,并要求提供它包含的表列表。知道我们想要得到什么表(-T account),我们告诉SQLMap用——dump读取它的内容。
因为从应用程序查询数据库的用户是DBA,所以它允许我们向数据库询问其他用户的信息,而SQLMap使用-- user和-password选项使我们的工作更加轻松。这些选项要求用户名和密码,因为所有的dbms都对用户的密码进行了加密,而我们得到的是散列,所以我们仍然需要使用密码破解程序来破解它们。如果SQLMap请求执行字典攻击时您回答了Yes,那么现在您就可能知道一些用户的密码。
我们还使用--sql-shell选项获取一个shell,从这个shell可以向数据库发送SQL查询。当然,这不是一个真正的shell,只是SQLMap通过SQLi发送我们编写的命令并返回这些查询的结果。
译者注: 一般一个完整字母前面是两个杠(--),单个字母前面是一个杠(-)。
更多资料
SQLMap还可以在POST请求中注入输入变量。要做到这一点,我们只需要添加—data选项,后面跟着引号中的POST数据,例如:—data“username=test&password=test”。
有时,为了访问应用程序存在sql注入的URL,我们需要在应用程序中进行身份验证。如果发生这种情况,我们可以使--cookie选项:--cookie“PHPSESSID=ckleiuvrv60fs012hlj72eeh37”将有效的会话cookie传递给SQLMap。这对于测试cookie值中的注入也很有用。
这个工具的另一个有趣的特性是,除了它可以为我们带来一个SQL shell,在其中我们可以发出SQL查询之外,更有趣的是,我们还可以使用os-shell在数据库服务器中获得命令执行(这在注入Microsoft SQL server时特别有用)。要查看SQLMap的所有选项和特性,可以运行SQLMa –help。
另请参阅
Kali Linux还包括其他一些工具,它们能够检测和利用SQL注入漏洞,这些工具可能对使用SQLMap或与SQLMap联合使用时很有用:
- Sqlninja:一个非常流行的工具,专门用于MS SQL Server的开发。
- Bbqsql:用Python编写的盲SQLi框架。
- Jsql:具有完全自动化GUI的基于java的开发工具;我们只需要引入URL并单击一个按钮。
- Metasploit:包括用于不同dbms的各种SQL注入模块。