多疑的企鹅 - 通过 WebGoat 获取线索

作者:Mick Bauer

随着越来越多的关键应用程序采用 Web 浏览器前端,Web 安全已成为互联网安全最关键的前线。然而,年复一年,同样类型的 Web 应用程序安全错误不断出现在安全公告中:SQL 注入、跨站脚本攻击、身份验证机制“失效打开”等等。作为 Web 开发人员或管理员,您如何避免在自己的 Web 应用程序中犯这些错误?

WebGoat 可以提供帮助。WebGoat 由开放 Web 应用程序安全项目 (OWASP) 开发,是一个“有意不安全”的 Tomcat Web 应用程序,它将引导您了解常见的 Web 安全错误、漏洞利用和解决方案。在本文中,我将解释如何在 Linux 系统上安装 WebGoat,并使用它来教育自己了解 Web 应用程序安全。

获取和安装 WebGoat

Linux 上的 WebGoat 有一个关键依赖项:Java 1.5 软件开发工具包 (JDK 1.5)。因此,请确保您已安装发行版的 JDK 1.5 软件包。在 SUSE 和 OpenSUSE 系统上,此软件包称为 java-1_5_0-sun-devel。在 Debian 和 Debian 衍生发行版(如 Ubuntu)上,它称为 sun-java5-jdk。请注意,Red Hat 及其衍生发行版没有自己的 JDK 1.5 软件包;请参阅“资源”部分,其中提供了两篇可能有所帮助的文章的链接。

您的 JDK 1.5 软件包的安装脚本应将您的 JAVA_HOME 环境变量设置为 JDK 的根目录。(在我的 OpenSUSE 系统上,这是 /usr/lib/jvm/java,它实际上是一系列指向 /usr/lib/jvm/java-1.5.0-sun-1.5.0_12/ 的链接。)您可能需要注销并重新登录才能使此变量“生效”,但无论如何,必须正确设置它才能运行 WebGoat。如有疑问,请执行以下操作:echo $JAVA_HOME从 bash 会话中检查它是否已正确设置。

请注意,您需要安装 Apache 即可运行 WebGoat。实际上,如果已安装,我建议您将其关闭。WebGoat 在其自己的捆绑 Tomcat 安装上运行,因此,尽管确实需要 Tomcat,但您无需单独安装它。

要获取最新版本的 WebGoat,请访问 WebGoat 的 SourceForge 网站 (sourceforge.net/project/showfiles.php?group_id=64424&package_id=61824) 或其 Google Code 下载站点 (code.google.com/p/webgoat/downloads/list)。除了 WebGoat 的 Windows 版本外,您还会找到适用于 UNIX/Linux 的独立 Web 应用程序存档文件 (WAR) 版本,以及包含 Tomcat 的“Release”版本。您应该选择后者,除非您的系统上已经安装了可用的 Tomcat。

在我的 OpenSUSE 系统上,我在我的主目录中解压缩了 Release 版本 (Unix_WebGoat-5.0_Release.zip),这导致了一个新的子目录 WebGoat-5.0 (/home/mick/WebGoat-5.0/)。此目录包含一个 readme 文件 (readme.txt)、WebGoat 的启动脚本 (webgoat.sh) 和另一个目录 tomcat,其中包含 Tomcat servlet 引擎,当然还有 WebGoat WAR 文件。

辅助工具

现在您已经安装了 WebGoat 及其依赖项,但在深入 Web 黑客攻击之前,您还需要一件东西:一个好的图形化本地 Web 代理。不是像 Squid 这样的代理服务器;而是一个本地代理,您可以使用它来拦截、查看和更改您的 Web 浏览器发送到 Web 服务器的数据。这是 Web 黑客工具包中的关键工具——对于需要对其自己的 Web 应用程序进行故障排除的 Web 开发人员来说,它也非常有用——您将需要它来完成 WebGoat 中的许多课程。

OWASP 推荐官方 OWASP 代理 WebScarab,可在 www.owasp.org/index.php/OWASP_WebScarab_Project 获取。WebScarab 是一个免费的、功能齐全的 Web 代理和网络爬虫(网络爬虫会跟踪网站上的所有链接,有效地对其进行编目),所有这些都具有方便的 GUI。它也是用 Java 编写的,这意味着它是跨平台的。

WebScarab 可以下载为“自包含”JAR 文件(Java 存档),并使用以下命令运行:java -jar ./webscarab-selfcontained-20070504-1631.jar或作为安装程序(当前为 webscarab-installer-20070504-1631.jar),当通过命令执行时:java -jar webscarab-installer-20070504-1631.jar,将 WebScarab 解压缩到您主目录中的 WebScarab 目录中,并在您的 KDE 或 GNOME 开始菜单中安装一个快捷方式。通过此快捷方式或通过使用以下命令执行自包含版本来启动 WebScarab:java -jar命令。

另一个好的图形化、基于 Java 的本地 Web 代理是 Paros,可在 www.parosproxy.org/index.shtml 获取。也许我只是更熟悉它,但我更喜欢 Paros 的界面。在我看来,它对非专家用户更友好一些。您自己判断——WebScarab 和 Paros 都是免费的,因此没有理由不试用一下它们。

Paros 以 zip 文件的形式提供,解压缩到目录 paros。在其中,除其他外,还有几个不同版本的启动脚本。您想要的是名为 startserver.sh 的脚本。使用以下命令启动它:sh ./startserver.sh.

请注意,您无需成为 root 用户即可安装或启动任何一个代理。实际上,您没有充分的理由成为 root 用户,因为默认情况下,这两个代理都监听非特权端口 TCP 8008。您可以在 WebScarab 的“Listener”选项卡或 Paros 的“工具”→“选项”→“本地代理”屏幕中更改监听端口。

配置您的浏览器

您几乎可以开始使用 WebGoat 了,但还有最后一件事要做:配置您的 Web 浏览器以将所有流量定向到您的本地代理(例如,WebScarab 或 Paros)。这与指定代理服务器的方式完全相同;对于 Web 浏览器来说,本地代理和代理服务器是同一回事。唯一的真正区别在于,您需要给出名称 localhost 或 IP 地址 127.0.0.1,而不是正确的完全限定域名。务必指定正确的端口——您的本地代理正在监听的端口(8008,除非您更改了它)。

图 1 显示了 Firefox 中的代理配置屏幕。从“编辑”菜单访问此屏幕:“编辑”→“首选项”→“高级”→“网络”→“连接”→“设置”。此对话框在其他浏览器中非常相似。如果您的浏览器的代理配置对话框具有代理例外字段,例如图 1 中显示的 Firefox 的“不使用代理:”框,请确保此字段为空,或者至少包含值 127.0.0.1 或 localhost。

Paranoid Penguin - Get a Clue with WebGoat

图 1. 配置 Firefox 以使用代理

启动 WebGoat

现在,您已经安装了 JDK 1.5,您已经运行了一个本地 Web 代理,并且您已经重新配置了浏览器以使用该代理。是时候挤牛奶了!

要启动 WebGoat,请在您选择的终端窗口程序中打开一个 bash shell(我仍然偏爱普通的 xterm),并将您的工作目录更改为 WebGoat 解压缩到的目录——在我的系统上是 /home/darthelm/WebGoat-5.0。您无需以 root 用户身份登录即可启动 WebGoat,但您确实需要以 root 权限启动 WebGoat——例如,通过 sudo,因此您将需要 root 密码。因此,要启动 WebGoat 以监听 TCP 端口 80,请发出以下命令:

sudo sh ./webgoat start80

如果您在 TCP 端口 80 上运行 Apache 或其他进程(尽管我不建议这样做),您可以使用以下命令在 TCP 端口 8080 上启动 WebGoat:

sudo sh ./webgoat start8080

在任何一种情况下,系统都会提示您输入 root 密码,WebGoat 将启动,并将启动消息和错误记录到您的 shell 以及文件 WebGoat-5.0/tomcat/logs/catalina.out 中。请注意,您可以通过在启动命令后附加一个 & 符号 (&) 在后台安全地运行 WebGoat,但这没有什么意义。尽管如此,您将能够从同一个 shell 发出其他命令,但所有这些日志消息仍然会使该特定 shell 几乎无法使用。最好只是打开另一个终端窗口。

使用 WebGoat

现在,您可以登录 WebGoat 了。只需将您刚刚重新配置的浏览器指向 http://127.0.0.1/WebGoat/attack(如果您在 TCP 8080 上启动了 WebGoat,则指向 http://127.0.0.1:8080/WebGoat/attack)。系统将提示您输入用户名和密码。用户名和密码都输入“guest”。如果您收到图 2 中显示的页面,则表示您已准备就绪!

Paranoid Penguin - Get a Clue with WebGoat

图 2. WebGoat 欢迎屏幕

如果您没有看到图 2 中显示的屏幕,请仔细检查浏览器的代理设置,确保您的本地 Web 代理正在运行,并检查您启动 WebGoat 的终端中是否有错误消息。此外,请确保您使用 sudo 启动 WebGoat——您可能会认为使用start8080命令会使这变得不必要,因为 TCP 8080 是一个非特权端口,但我从未成功以非特权进程身份运行 WebGoat。

获得欢迎屏幕后,单击“Start WebGoat”按钮开始。

WebGoat 结构和提示

WebGoat 中的第一课是对 WebGoat 界面的介绍。它将引导您完成一个简单的 HTTP 事务,并让您有机会使用 WebGoat 的各种按钮:“Hints”、“Show Params”、“Show Cookies”、“Show Java”和“Lesson Plans”。“Hints”和“Lesson Plans”按钮尤为重要(您的本地 Web 代理对于查看 HTTP 参数和 cookie 更有用),但我发现“Lesson Plan”弹出窗口在 KDE 的 Konqueror 浏览器下无法正确呈现(它们在 Firefox 中可以正常呈现)。

在第一课之后,WebGoat 中的课程倾向于假设在运行 WebGoat 之前,您至少通过阅读报告“OWASP Top 10 2007”(可从 www.owasp.org 的“Top 10 Project”部分获得)已经学习了一些 Web 应用程序安全知识。因此,我强烈建议您下载此报告的完整 PDF 版本,仔细阅读,并在运行 WebGoat 时保持可用。

WebGoat 的某些课程是不言自明的;课程文本本身或课程计划会告诉您成功完成练习所需的一切知识。但是,其他课程并不那么直接。“Hints”按钮可以提供帮助,但即使这样,您也可能会发现自己复制并粘贴提示中建议的攻击字符串,而没有真正理解攻击是如何工作的。

因此,我的另一个建议,除了阅读“OWASP Top 10 2007”之外,是随意在课程之间跳转。据我所知,它们的呈现不是按难度顺序排列的,后来的课程也不会以前面的课程为基础。如果给定的课程对您来说太难,请随意尝试其他课程。您始终可以在以后再次尝试更难的课程。

这并不意味着 WebGoat 组织不善;这只是意味着课程是非顺序的,而是按类型分组(代码质量、无效参数、缓冲区溢出等等)。总而言之,如果您首先阅读“OWASP Top 10 2007”,尝试任何您喜欢的课程,注意每节课的“Lesson Plan”按钮,并在必要时单击“Hints”按钮,您将获得更积极的 WebGoat 体验。而且,如果所有其他方法都失败了,总有 Google!

本地 Web 代理:好还是坏?

您需要使用本地 Web 代理才能执行 WebGoat 中的许多练习攻击。但是,使它们成为“练习”攻击的唯一原因是您正在针对在您自己的系统上运行的教育性 Web 应用程序运行它们。完全相同的工具和技术可以用于好的方面坏的方面。

与任何渗透测试工具一样,负责任和合乎道德地使用您的本地 Web 代理取决于您自己。如果您在与别人的 Web 服务器交互时运行 WebScarab 或 Paros,您可能会违法(例如,通过探测站点或发送故意格式错误的请求),即使您只是想学习。

除非您被聘请进行合法的、完全授权的渗透测试,否则您应该仅在您自己的系统上和针对您自己的系统运行这些工具。

使用 WebGoat:示例课程

由于 WebGoat 本身就是一个教程,因此对于我来说,逐一介绍每个课程将是多余的(并且超出了单篇文章的范围)。同样,Web 代理非常通用和复杂,无法在此处完全解释。(将来,我很可能会专门写一篇文章介绍它们。)但是,我可以引导您完成一个 WebGoat 示例课程,包括正确的代理使用,作为示例。

我最喜欢的 WebGoat 课程之一是关于失效打开身份验证机制的课程。如果有可能使用户身份验证事务以导致成功身份验证的方式失败,则该身份验证机制被称为“失效打开”。不用说,这不是安全的访问机制的行为方式!但是,这是一个常见的 Web 编码错误。

WebGoat 在“错误处理不当”部分下的“如何绕过失效打开身份验证方案”课程中涵盖了这一点。要开始本课程,请单击 WebGoat 界面左侧框架上的“错误处理不当”链接,然后单击其下方出现的“如何绕过失效打开身份验证方案”链接。

在本课程中,您将输入用户名和密码,使用本地 Web 代理拦截生成的 HTTP 请求,然后再将其发送到服务器 (WebGoat),编辑请求,然后将其发送出去。

因此,您需要将 Web 代理置于拦截模式(Paros 上的陷阱模式)。图 3 显示了为拦截设置的 WebScarab——您只需选中“Intercept requests”旁边的框即可。Paros 类似:单击“Trap”选项卡,然后选中“Trap request”旁边的框。

Paranoid Penguin - Get a Clue with WebGoat

图 3. 将 WebScarab 置于拦截模式

现在,每当您导航到新网页或提交 Web 表单时,生成的 HTTP 请求都将被您的本地代理拦截并停止,从而允许您在转发请求之前对其进行更改。(WebScarab 将在与您的浏览器会话相同的虚拟桌面中弹出一个编辑窗口;Paros 不会,因此您需要手动单击您的 Paros 窗口。)

继续示例课程,您现在可以返回到浏览器,并键入用户名webgoat和一些任意字符串作为密码(图 4)。

Paranoid Penguin - Get a Clue with WebGoat

图 4. 输入用户名和密码

在单击“Login”按钮之前,请确保您的本地 Web 代理处于拦截/陷阱模式。单击后,WebScarab 将弹出一个“Edit Request”窗口,如图 5 所示。

Paranoid Penguin - Get a Clue with WebGoat

图 5. 编辑拦截的 HTTP 请求

现在,我们开始施展魔法。在此“Edit Request”窗口中,单击“Text”选项卡,选择字符串 Password=blobbo&,然后删除它。没错,我们正在从身份验证提交中删除整个“Password”参数。这应该会导致身份验证失败,对吧?

但是,当您单击“Edit Request”窗口的“Accept”按钮并切换回浏览器时,您将看到图 6 中显示的屏幕。

Paranoid Penguin - Get a Clue with WebGoat

图 6. 攻击成功!

攻击成功:您刚刚在不知道甚至没有尝试提交密码的情况下登录了!在单击其他链接之前,您可能需要关闭 Web 代理的拦截/陷阱模式;否则,您将需要反复单击代理的“Accept”按钮(Paros 中的“Continue”)才能导航到并加载页面。

在离开本课程之前,您应该做的最后一件事可以说是最重要的:单击 WebGoat 的“Show Java”按钮,并查看究竟是什么编码错误导致了这种失效打开情况。您会发现 WebGoat 的代码注释良好且易于分析,即使您是编程新手也是如此。请记住,使用 WebGoat 的全部意义不仅在于了解可能出现的问题,还在于学习如何从一开始就防止问题发生。

结论

OWASP 网站包含有关 WebGoat、WebScarab 和 Web 安全的更多信息。您可能会发现 WebGoat 部分中的《WebGoat 用户和安装指南》特别有用。注意安全!

资源

开放 Web 应用程序安全项目主页,其中包含指向其 WebGoat、WebScarab、OWASP Top 10 和 OWASP Guide 项目的链接:www.owasp.org

Paros 主页,您可以在其中下载免费的 Paros 本地 Web 代理:www.parosproxy.org

Russ Herrold 的“如何在 CentOS 4 和 CentOS 5 上安装 Java”:wiki.centos.org/HowTos/JavaOnCentOS

Jan K. Labanowski 的“Fedora Core 7 上的 Sun Java 6 开发工具包”:ccl.net/cca/software/SOURCES/JAVA/JSDK-1.6

Mick Bauer (darth.elmo@wiremonkeys.org) 是美国一家大型银行的网络安全架构师。他是 O'Reilly 出版的《Linux 服务器安全》第二版(原名《使用 Linux 构建安全服务器》)的作者,偶尔在信息安全会议上发表演讲,也是“网络工程波尔卡舞曲”的作曲者。

加载 Disqus 评论