diff --git a/ch6.md b/ch6.md index 2e282359ab48a4b4a0df6d54c531b0538e0b3c3c..7a689531d83425af52d2e1461b6e60720d4551f5 100644 --- a/ch6.md +++ b/ch6.md @@ -609,3 +609,98 @@ UNION 查询语句用于连接两个拥有相同列数量的查询,通过注 一旦我们知道了数据库和表的名称,我们在这个表中查询所有列,来了解我们需要查找哪一列,它的结果是`user`和`password`。 最后,我们注入查询来请求`dvwa`数据库的`users`表中的所有用户名和密码。 + +## 6.8 使用 SQLMap 发现和利用 SQL 注入 + +我们已经在上一个秘籍汇总看到,利用 SQL 注入是个繁琐的步骤。SQLMap Hige命令行工具,包含在 Kali 中,可以帮我们自动化检测和利用 SQL 注入。它带有多种技巧,并支持多种数据库。 + +这个秘籍中,我们会使用 SQLMap 来检测和利用 SQL 注入漏洞,并用它获得应用的用户名和密码。 + +### 操作步骤 + +1. 访问` http://192.168.56.102/mutillidae`。 + +2. 在 Mutillidae 的菜单中,访问`OWASP Top 10 | A1 – SQL Injection | SQLi Extract Data | User Info`。 + +3. 尝试任何用户名和密码,例如`user`和`password`之后点击`View Account Details`。 + +4. 登录会失败,但是我们对 URL 更感兴趣。访问地址栏并将完整的 URL 复制到剪贴板。 + +5. 现在,打开终端窗口,输入下列命令: + + ``` + sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=user&password=password&user-info-php-submitbutton=View+Account+Details" -p username --current-user --currentdb + ``` + + 你可以注意到,`-u`参数就是所复制的 URL 的值。`-p`告诉 SQLMap 我们打算在用户名参数中查找注入。一旦漏洞被利用,我们想让它获得当前数据库用户名和数据库的名称。我们只打算获得这两个值,因为我们只想判断这个 URL 的`username`参数是否存在 SQL 注入。 + + ![](img/6-8-1.jpg) + +6. 一旦 SQLMap 检测到应用所使用的 DBMS,它会询问我们是否跳过检测其它 DBMS 的步骤,以及是否打算包含所有特定系统的测试。即使它们在当前的配置等级和风险之外。这里,我们回答`Ues`来跳过其它系统,以及`No`来包含所有测试。 + +7. 一旦我们指定的参数中发现了漏洞,SQLMap 会询问我们是否打算测试其它参数,我们回答`No`,之后观察结果: + + ![](img/6-8-2.jpg) + +8. 如果我们打开获得用户名和密码,类似于我们在上一个秘籍那样,我们需要知道含有这些信息的表名称。在终端中执行下列代码: + + ``` + sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp --tables + ``` + + ![](img/6-8-3.jpg) + + SQLMap 会保存所执行的注入日志,所以第二次攻击会花费更少的时间。你可以看到,我们指定了要提取信息(nowasp)的数据库,并告诉 SQLMap 我们想获取这个数据库的表名称列表。 + +9. `accounts`表使含有我们想要的信息的表之一。让我们转储内容: + + ``` + sqlmap -u "http://192.168.56.102/mutillidae/index.php?page=userinfo.php&username=test&password=test&user-info-php-submitbutton=View+Account+Details" -p username -D nowasp -T accounts --dump + ``` + + ![](img/6-8-4.jpg) + + 我们现在拥有完整的用户表,并且我们可以看到,这里密码并没有加密,所以我们可以直接使用它们。 + +### 工作原理 + +SQLMap 会使用 SQL 注入字符串,对给定 URL 和数据的输入进行模糊测试,或者只针对`-p`选项中的特定目标,并且解释其响应来发现是否存在漏洞。不要模糊测试所有输入,最好使用 SQLMap 来利用我们已知存在的注入,并始终尝试缩小搜索过程,通过提供所有可用的信息,例如漏洞参数、DBMS 类型,以及其它。在所有可能性下寻找注入会花费大量时间,并在网络中产生非常大的流量。 + +这个秘籍中,我们已经知道了用户名参数存在注入漏洞(因为我们使用了 Mutillidae 的注入测试页面)。在第一个攻击中,我们只希望确人注入存在,并询问一些非常基本的信息:用户名(`--curent-user`)和数据库名称(`--current-db`)。 + +在第二个攻击中,我们使用`-D`选项,以及前一次攻击者获得的名称指定希望查询的数据库,我们也使用`--tables`询问了所包含的表名称列表。 + +知道我们希望获得哪个表(`-T accounts`)之后,我们告诉 SQLMap 使用`--dump`转储它的内容。 + +### 更多 + +SQLMap 也能够注入 POST 参数中的输入变量。我们只需要添加`--data`选项并附带 POST 数据,例如: + +``` +--data "username=test&password=test" +``` + +有时候,我们需要在一些应用中获得验证,以便能够访问应用的漏洞 URL。如果是这样,我么可以传递有效的会话 COokie给 SQLMap, 使用`--cookie`选项: + +``` +--cookie "PHPSESSID=ckleiuvrv60fs012hlj72eeh37" +``` + +这在测试Cookie值的注入时也非常有用。 + +另一个有趣的特性是,使用` --sql-shell`选项,它可以为我们提供 SQL shell,其中我们可以执行 SQL 查询,就像我们直接连接到数据库那样。或更有趣的是,我们可以使用` --osshell`在数据库服务器中执行系统命令(在注入 MSSQL 服务器时这特别有用)。 + +为了了解 SQLMap 拥有的所有选项和特性,你可以执行: + +``` +sqlmap --help +``` + +### 另见 + +Kali 包含了其它用于检测和利用 SQL 注入漏洞的工具,它们能够用于代替或配合 SQLMap: + ++ sqlninja:非常流行的工具,为利用 MSSQL 服务器而设计 ++ Bbqsql:Python 编写的 SQL 盲注狂阿基 ++ jsql:基于 Java 的工具,带有完全自动化的 GUI我们只需要输入 URL 并按下按钮。 ++ Metasploit:它包含不同 DBMS 的多种 SQL 注入模块。