使用 Samurai 进行 Web 应用程序安全测试
几乎每周媒体都会报道另一起因网站安全性差而导致敏感数据被盗取的案例。Web 应用程序安全性从未像现在这样重要,但许多网站从未以有意义的方式进行过安全审计。尽管细致的应用程序架构可以帮助最大限度地降低代码中的安全风险,但全面的 Web 应用程序安全方法会考虑应用程序的整个生命周期,从开发到部署。为了测试您的网站是否真正安全,请考虑使用攻击者使用的相同工具。
渗透测试是通过模拟一次或一系列攻击来评估系统安全性的艺术。渗透测试的目标不一定是在发现漏洞时利用系统,而是严格审计潜在的攻击向量,并提供可用于评估漏洞利用的潜在风险的数据,并找到保护系统的解决方案。
Samurai Web 测试框架是一个面向安全的发行版,专注于 Web 应用程序的渗透测试。它包括各种图形化、命令行和基于浏览器的工具,用于测试常见的 Web 漏洞。它以 live CD 镜像的形式提供,网址为 samurai.inguardians.com。
在本文中,我将介绍如何使用 Samurai 测试开放 Web 应用程序安全项目 (OWASP) 定义的几个最常见的 Web 应用程序安全风险。这并非专门的攻击向量列表。从技术上讲,下面列出的许多风险都是通过各种形式的 SQL 注入来利用的。相反,此列表是由 OWASP 结合“威胁代理、攻击向量、弱点、技术影响和业务影响……来产生风险”而制定的。OWASP 的十大风险 (www.owasp.org/index.php/Top_10)
注入缺陷。
跨站脚本。
身份验证和会话管理失效。
不安全的直接对象引用。
跨站请求伪造。
安全配置错误。
不安全加密存储。
未能限制 URL 访问。
传输层保护不足。
未验证的重定向和转发。
为了使本文的范围易于管理,我重点关注注入缺陷和跨站脚本。
免责声明: 请勿在生产网站上尝试任何这些示例。Linux Journal 建议您设置一个虚拟机环境,其中包含您网站的副本,以测试漏洞。请勿通过 Internet 进行测试。切勿在不属于您的网站上使用任何这些示例。Linux Journal 对因遵循任何这些示例而可能导致的数据损坏或服务中断概不负责。
当应用程序将用户输入传递给解释器时,未检查其是否可能产生恶意影响,就会发生注入缺陷。注入缺陷可能包括操作系统命令注入、LDAP 注入以及 Web 应用程序使用动态查询调用的许多其他解释器的注入。最常见的注入向量之一是 SQL 注入。根据具体的漏洞,攻击者可以读取密码或信用卡号、将数据插入数据库以获得对应用程序的访问权限,或者恶意篡改或删除数据。在极端情况下,可以读取操作系统文件或执行任意系统命令——这意味着 Web 服务器游戏结束。
登录表单是 SQL 注入的主要目标,因为成功的利用将使攻击者能够访问应用程序。为了开始测试应用程序是否存在 SQL 注入漏洞,让我们使用一些在 SQL 中具有特殊含义的字符来尝试生成 SQL 错误。最简单的测试,使用单引号 (') 作为用户名,未能生成错误,因此让我们尝试使用双引号后跟单引号 ("')
SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"''' at line 1 SQL Statement: SELECT * FROM accounts WHERE username='"'' AND password='"''
此表单不仅容易受到 SQL 注入攻击,而且错误消息还抛出了正在使用的确切 SQL 语句。这就是您入侵此应用程序所需的所有信息,只需在用户名和密码字段中使用以下文本即可
' or 1=1 --
这会将原始查询更改为可以匹配正确的用户名和密码,或者测试 1=1 的查询。由于 1=1 将评估为真,因此应用程序接受此作为您的登录凭据并对您进行身份验证。更糟糕的是,假设您不是攻击者,一旦您登录,您现在可以看到您是管理员用户。这是因为 SQL 查询将逐行查看每一行,以查看哪一行查询返回 true。因为您已篡改它使其始终返回 true,所以 MySQL 将返回第一行。因为创建的第一个用户通常是管理员或 root 用户(图 1)。

图 1. 用户表的第一行通常包含管理员用户。
并非所有应用程序都如此容易被攻破——特别是那些在错误消息中没有透露太多关于数据库和表结构信息的应用程序。审计工具可让您快速迭代一系列可能的字符串。Web 应用程序攻击和审计框架 w3af 具有一系列插件,可帮助扫描和利用漏洞,包括 SQL 注入。
从“应用程序”→“Samurai”→“发现”菜单启动 w3af GUI。在“目标:”字段中输入您要测试的网站 URL,然后展开插件框中的“发现”下的选项。向下滚动直到找到 webSpider 插件,然后选中其框以启用它。在右侧窗格中,将显示 webSpider 插件的选项。勾选 onlyForward,然后选择“保存配置”。现在,滚动回到插件框的顶部,然后展开“审计”。向下滚动到 sqli 并选中其框以启用它。
扫描完成后,您可以查看“结果”选项卡,看到 w3af 在应用程序中发现了七个单独的位置,这些位置可能被 SQL 注入利用(图 2)。

图 2. w3af 结果选项卡,显示已发现的漏洞
Samurai 中包含的另一个可以发现 SQL 注入漏洞的工具是 Grendel-Scan。从“应用程序”→“Samurai”→“发现”菜单启动 Grendel-Scan。在“基本 URL”下,插入您要测试的 Web 应用程序的 URL,然后单击“添加”。取消选中“启用内部代理”。让我们改用 Grendel 的 Web 爬虫模块。在“扫描输出”下,选择一个目录供 Grendel-Scan 存储其输出报告。此目录必须不存在。应用程序将期望创建它。从“扫描”菜单中选择“开始扫描”以启动。
扫描将需要几分钟才能完成,具体取决于 Web 应用程序的大小。完成后,导航到指定的输出目录以查看报告。在这里,report.html 告诉您,在其他问题中,发现了一个可能的 SQL 注入漏洞(图 3)。Grendel-Scan 的简洁输出使其成为向高层管理人员发送有吸引力且易于阅读的漏洞报告作为报告要求的一部分的绝佳工具。
当应用程序接受用户输入并将其发送回浏览器时,未对其恶意代码进行验证,就会发生跨站脚本。XSS 攻击有两种类型:反射型和存储型。存储型攻击将代码注入到页面中,该代码是持久性的,并且将在受害者的浏览器请求页面时被激活。存储型跨站脚本攻击的一个常见示例是通过评论字段、论坛帖子或留言簿注入的脚本。如果应用程序不防范潜在的恶意输入数据并允许存储脚本,则下一个加载页面的用户的浏览器将执行恶意代码。
相比之下,反射型或非持久性跨站脚本攻击要求受害者单击来自另一个来源的链接。在这里,恶意脚本不是存储在 Web 应用程序的数据库中,而是编码在 URL 中。XSS 漏洞利用可能允许攻击者破坏网站、将合法流量重定向到他们自己的网站或他们选择的网站,甚至通过 cookie 窃取会话数据。
第一个测试利用了一个强大的工具,该工具在攻击者中广受欢迎——Web 浏览器。尽管自动化工具可以消除迭代长列表测试的痛苦,但开始测试您的网站是否存在 XSS 漏洞的最简单方法是使用浏览器。您需要找到应用程序上您要测试的页面,该页面接受用户输入,然后显示它——例如留言簿、评论字段,甚至是将搜索字符串显示为结果一部分的搜索对话框。
XSS 漏洞的规范检查被认为是下面的代码片段
<script>alert('xss!')</script>
如果网站没有正确过滤输入,此脚本将在浏览器中执行,然后显示一条弹出消息,文本为“xss”。对于我的小型 Web 应用程序来说,这是一个坏消息。它非常脆弱,以至于最简单的字符串就能够利用它(图 4)。
通常,至少会采用某种形式的输入过滤,并且此字符串不会完整通过。通过检查生成的页面的源代码,您可以尝试诊断哪些字符被过滤以制作更复杂的字符串。如果您将相同的字符串注入到稍微更安全的 Web 表单中,您可以通过结果看到脚本标记已被剥离,单引号已被转义
Name: Me! Message: alert(\'XSS!\')
您可以继续编码字符串的不同部分并观察结果,以尝试绕过过滤器。或者,为了加快流程,您可以使用自动化工具。Samurai 包括 Security Compass 提供的 Firefox 插件 XSS Me。导航到您要测试的页面,然后从“工具”菜单中选择“XSS Me”→“打开 XSS Me 侧边栏”。从侧边栏中选择“使用顶级攻击测试所有表单”。对于好奇的人,XSS Me 使用的字符串可以在“工具”→“XSS Me”→“选项”→“XSS 字符串”中查看,并且可以添加更多字符串。
图 5 显示 XSS Me 已发现此应用程序容易受到基于 DOM 的 XSS 攻击。这是一种特别阴险的利用应用程序的方式,因为它不依赖于应用程序将恶意代码嵌入到 HTML 输出中。
可以在 Samurai 中扫描 XSS 漏洞的另一个工具是 w3af。这个强大的工具能够扫描和利用几乎任何您想命名的漏洞。在这里,让我们将其配置为扫描 Web 应用程序是否存在 XSS 漏洞。
从“应用程序”→“Samurai”→“发现”菜单启动 w3af GUI。在“目标:”字段中输入您要测试的网站 URL,然后展开插件框中的“发现”下的选项。向下滚动直到找到 webSpider 插件并选中其框以启用它。在右侧窗格中,将显示 webSpider 插件的选项。勾选 onlyForward,然后选择“保存配置”。现在,滚动回到插件框的顶部,然后展开“审计”。向下滚动到 xss,然后选中其框以启用它(图 6)。
单击“开始”以启动审计过程。根据 Web 应用程序的大小,这可能需要几分钟时间,因为 spider 插件会发现每个 URL,然后审计插件会测试所有适用的表单是否存在 XSS 漏洞。完成后,导航到“结果”选项卡,该选项卡将逐项列出发现的漏洞。
虽然渗透测试很有用,但这只是全局的一部分。为了真正解决这些风险,应用程序的设计、实施和部署必须以安全性为中心。代码分析工具对于定位应用程序代码处理用户输入的位置很有帮助,因此可以审计代码以进行输入验证、强大的输出编码和安全的引号处理。使用最小权限原则并采用 chroot jail 进行谨慎部署可以帮助最大限度地减少攻击者在获得对您的应用程序的访问权限后可能造成的损害。永远不要允许您的数据库或 Web 服务器进程以 root 用户身份运行。
希望本文可以作为帮助您从更积极的角度看待 Web 应用程序安全的跳板,但本文未涵盖这些特定漏洞的许多漏洞利用和方面。如需进一步阅读,请访问 OWASP Wiki,网址为 www.owasp.org。
Jes Fraser 是新西兰 Open Systems Specialists 的 IT 顾问。她热衷于在企业中推广开源和 Linux。