内容


Web 应用程序安全性:测试漏洞

使用开源工具测试网站

Comments

Web 的应用日益广泛,而安全性却越来越低。事实上,Web Application Security Consortium (WASC) 在 2009 年初就估计,所有 Web 站点中有 87% 是有漏洞,会被攻击的(有关更多信息,请参见 参考资源 中的链接)。尽管一些公司请得起外部安全分析师来测试 exploit,但不是每家公司都有财力花 2~4 万美元做外部安全审计。相反,组织变得依赖于自己的开发人员了解这些威胁和确保代码没有任何此类漏洞。

要编写安全的代码,必须首先了解您的应用面临的威胁。本文讨论一些比较流行的漏洞,比如跨站脚本编程和 SQL 注入,并介绍一些工具,可以用来帮助您不仅保护站点还保护那些支持站点的数据和网络。本文不旨在成为安全分析师的替代,也不讲授核心安全技能。而是着重于教您如何找到代码中的潜在 exploit 并修复漏洞。

常见漏洞

首先,需要了解一些您要寻找的漏洞。第一个漏洞是最流行的:跨站脚本编程(cross-site scripting,XSS)。XSS 由注入 Web 站点的恶意脚本而导致。例如,Mallory 编写了一个脚本,会将用户发送到 Alice 创建的一个受信任的 Web 站点。Mallory 将该脚本插入一个流行的论坛。当 Bob 在论坛上看到这个链接时,他点击并在 Alice 的 Web 站点上创建一个帐户。该脚本就利用了 Alice 的 Web 站点中的一个 XSS 缺陷,然后将 Bob 的 cookie 发送给 Mallory。Mallory 现在可以模仿 Bob 并盗取他的信息。

SQL 注入是第二个最流行的漏洞,这主要是因为 Web 站点对数据库的依赖性日益增加。SQL 注入实际上相当简单:通过找到一个连接到数据库的 Web 站点,恶意黑客在开发人员不打算忽略身份验证或进行数据操纵的地方执行一个 SQL 查询。这就是 Albert Gonzalez 用来盗取 1.3 亿信用卡号的那类攻击。在 SQL 注入攻击中,Mallory 找到 Alice 创建来售电的一个 Web 站点。不是输入通常的用户名-密码组合,Mallory 输入 ‘) OR 1=1- 作为用户名。由于她包含了连字号(-),所以任何其他东西都不需要;由于 1=1 总是为真,所以她将能够成功登录。现在,她可以操纵数据库,盗取 Bob 的客户信息。尽管本例以最简单的形式演示了一个 SQL 注入,但是您可以看出攻击者利用 SQL 注入有多么容易。

没有专门的安全分析师团队,一般的 Web 开发人员似乎对这些漏洞束手无策。幸运的是,事实本非如此。有很多工具可用,可以帮助您找到站点上可能的漏洞,以便采取必要的措施修复漏洞。诸如 WebScarab 和 Paros 之类的工具捕获浏览器和服务器之间的会话,爬行 Web 站点以帮助您识别潜在的风险。有了这些信息,就可以检查这些漏洞并进行防御。

WebScarab

WebScarab 由开放 Web 应用程序安全项目(Open Web Application Security Project,OWASP)开发,是首款用于分析浏览器请求和服务器应答的代理软件。除了用作数据包分析工具之外,还可以用来“fuzz”站点,寻找前面提到的那些 exploit。要使用 WebScarab,首先在 Web 浏览器中配置代理设置。对于 Mozilla Firefox,执行以下步骤(参见 Firefox 键盘快捷键 了解备选的可访问步骤):

  1. 单击 Tools > Options > Advanced > Network
  2. 单击 Settings

    Connection Settings 窗口打开。

  3. 选择 Manual proxy configuration 选项。
  4. 对于 HTTP ProxySSL Proxy,都输入 localhost,并将端口设置为 8008。
  5. 确保 No proxy for 框为空,然后单击 OK

图 1 显示了 Firefox 的连接设置。

图 1. Firefox 连接设置
屏幕快照:Manual proxy configuration 选中;HTTP Proxy 是 localhost,Port 是 8008。SSL Proxy 是 localhost,Port 是 8008;SOCKSv5 选中。
屏幕快照:Manual proxy configuration 选中;HTTP Proxy 是 localhost,Port 是 8008。SSL Proxy 是 localhost,Port 是 8008;SOCKSv5 选中。

对于 Windows® Internet Explorer®,执行以下步骤(参见 IE 帮助菜单中的 Internet Explorer 键盘快捷键,了解备选的可访问步骤):

  1. 单击 Tools > Internet Options > Connections
  2. 单击 LAN Settings 打开 Proxy Settings 窗口。
  3. Proxy Servers 下,选中 Use a proxy server for your LAN 复选框,然后单击 Advanced
  4. 对于 HTTPSecure,在 proxy address to use 下输入 localhost,然后在 port 下输入 8008
  5. 确保 Exceptions 框为空,然后单击 OK

图 2 显示了 Internet Explorer 的代理设置。

图 2. 设置代理
代理设置:HTTP 设置为 localhost,端口为 8008。Secure 设置为 localhost,端口为 8008。
代理设置:HTTP 设置为 localhost,端口为 8008。Secure 设置为 localhost,端口为 8008。

现在可以扫描 Web 站点了。

利用 WebScarab 扫描站点

下面例子中使用了 Hacme Casino 站点,该站点由 Foundstone 构建,具有几个漏洞,可以用于练习(参见 参考资源)。该站点随同 Apache Tomcat 打包在一起,如果您愿意,也可以在本地运行它。

接下来,打开 WebScarab。一旦启动它,将只会看到两个选项卡:SummaryIntercept。因为您想要使用 WebScarab 进行 fuzz,所以通过单击 Tools > Use full-featured interface > OK 改变视图。然后会要求您重启 WebScarab。这样做之后,首先看到的界面如 图 3 所示。(WebScarab 提供一个 键盘快捷键 的列表 — 不幸的是只有两个。)

图 3. WebScarab 界面
WebScarab 界面的屏幕快照
WebScarab 界面的屏幕快照

要启动新的会话,单击 File > New。会出现一个框,询问您要将会话保存到哪里。选择或创建存储目录,然后单击 OK。对 Hacme Casino 使用 WebScarab 时,在打开浏览器之前启动服务器。然后,在浏览器的地址栏中输入 http://localhost:3000

一旦打开浏览器,就应该开始在 WebScarab 中看到一些活动,因为 WebScarab 正在捕获浏览器和服务器之间的所有请求和应答。由于您想要使用 fuzzing 特性来测试漏洞,所以首先来看哪些地方可以存在各种不同的漏洞。首先来看登录,这是一个潜在的 exploit。要测试登录,您应该记录浏览器和服务器之间发生的交互。这里不需要成功登录,所以对于用户名和密码,您可以输入任何符号:对于本例来说,用户名和密码都输入 casino,然后单击 Login

当然,登录不成功,但是这不是我们感兴趣的。相反,回到 WebScarab。在 Path 列中,右键单击 account\login,然后单击 Use as fuzz template,如 图 4 所示。

图 4. fuzzing 模板
Fuzzing 模板的屏幕快照,显示了各种 web 链接数据类似于电子表格的视图。
Fuzzing 模板的屏幕快照,显示了各种 web 链接数据类似于电子表格的视图。

执行以下步骤:

  1. 单击 WebScarab 界面顶部的 Fuzzer 选项卡。
  2. 单击 Source
  3. 浏览到您的词典的位置。(我使用的是 all_attack.txt;参见 参考资源 中的链接。)
  4. 提供 Source 的描述,然后单击 Add
  5. 单击 Close 回到 Fuzzer 窗口。

现在,转到 user_login 参数并在 Fuzz Source 列下的区域中单击。由于您只加载了一个源 — All attack,所以从下拉菜单中选择它。对 user_password 参数做相同的事情,如 图 5 所示。

图 5. 选择攻击文件
攻击文件的屏幕快照,显示了可被编辑的各种参数的一个网格。
攻击文件的屏幕快照,显示了可被编辑的各种参数的一个网格。

既然已经定义了源,就单击 Start 开始 fuzz 过程。Fuzzer 将来自文件的参数插入到用户名和密码输入中。您应该在工具完成每次尝试时在屏幕上看到一些活动。通常,您需要检查结果中的每个 ID,以分析每次尝试发生了什么事情。但是,您由于知道添加的字符串将产生一个结果,所以能够明白 fuzzer 成功时会发生什么。

双击例子中的第一个字符串,如 图 6 所示。

图 6. 找到漏洞
屏幕快照,显示一个页面的已解析信息。URL encoded variables 下面 user_login 和 user_password 的数据已画圈。Parsed 下面 Location 和 Site Cookie 的数据也已画圈。
屏幕快照,显示一个页面的已解析信息。URL encoded variables 下面 user_login 和 user_password 的数据已画圈。Parsed 下面 Location 和 Site Cookie 的数据也已画圈。

注意,在上面的圈中,user_loginuser_password 的值是 ‘) OR 1=1--。接下来,注意位置已从 http://localhost:3000(这是主页)更改为 http://localhost:3000/lobby/games(这是用户成功登录后会看到的页面)。这意味着什么呢?意味着您的站点是容易受攻击的。由于 ‘) OR 1=1-- 是一个 SQL 字符串,所以说站点容易受到 SQL 注入攻击。使用 Next 按钮滚动结果,并寻找那个值。注意,这里位置保持为 http://localhost:3000。从这个结果可以知道,插入该类型的字符串不会导致成功的登录尝试,所以站点不容易受到这种类型的攻击。

Paros Proxy

另一个有用的安全测试工具是 Paros Proxy。跟 WebScarab 一样,Paros 捕获浏览器和服务器之间的会话,以进行分析。也可以使用它来测试站点上的漏洞。要运行 Paros,必须更改浏览器代理设置中使用的端口号。对于 WebScarab,使用的是 8008;在运行 Paros 之前将该端口更改为 8080,否则该工具不能工作。对于本练习,例子中使用了 WebGoat,这是出自 OWASP 的另一个工具(参见 参考资源)。跟 Hacme Casino 一样,WebGoat 运行使用 Tomcat 服务器作为本地主机。对于本文的目的,WebGoat 在 Paros 扫描中显示的漏洞比 Hacme Casino 中的多。

更改端口之后,打开 Paros。然后执行以下步骤:

  1. 在 WebGoat 文件夹中,双击 WebGoat.ba 启动 Tomcat。
  2. 打开浏览器,然后输入 http://localhost/WebGoat/attack
  3. 用户名和密码都输入 guest
  4. 单击 Start WebGoat

现在,回到 Paros 并启动 WebGoat 站点的扫描。当然,您也可以使用自己的站点,在地址栏输入站点的 URL。

在 Paros 中,展开 Sites 文件夹,在目录树中看到 http://localhost。展开该文件夹,出现 WebGoat。突出显示 WebGoat,然后单击 Analyse Scan。这将马上开始站点扫描。大站点可能要花点时间,但是本例站点应该只要几秒钟。一旦开始扫描,底部窗格自动更改为 Alerts 选项卡(参见 图 7)。扫描完成时,单击弹出窗口中的 OK,该窗口告诉您去哪里找到报告。

图 7. 查看警告
Alert 屏幕显示一个典型的 IDE 风格的划分窗口,左上窗格中显示站点树,右上窗格中显示所选条目的详细信息,底部窗格中显示警告树。
Alert 屏幕显示一个典型的 IDE 风格的划分窗口,左上窗格中显示站点树,右上窗格中显示所选条目的详细信息,底部窗格中显示警告树。

可以展开警告,以显示更详细的信息。也可以查看报告,报告中提供了更多信息。但是,首先保存扫描结果,方法是单击 File > Save As,为扫描选择一个位置和文件名,然后单击 Save

要查看报告,单击 Report > Last Scan Report。单击弹出窗口中的 OK,将打开一个新的浏览器选项卡,其中是扫描结果的报告,如 图 8 所示。该报告提供有关检测到的每个漏洞的大量信息,包括对处理特定 exploit 的 OWASP 页面的引用。

图 8. Paros 报告
Paros 报告的屏幕快照,在警告顶部显示一个汇总表,下面是每个警告的详细信息。
Paros 报告的屏幕快照,在警告顶部显示一个汇总表,下面是每个警告的详细信息。

测试误报

尽管扫描程序是找到 Web 站点中可能存在的漏洞的很好方式,但是由于存在误报,最好的安全公司还总是要手动测试可能的漏洞。测试这些可能的 exploit 意味着,实际进入站点中被报告为容易受攻击的区域,在站点中插入 SQL 代码或脚本,看有何响应,然后进入站点并堵塞任何 exploit。大公司通常雇用擅长于这类测试(称之为漏洞验证(vulnerability validation))的专业程序员,但是您作为开发人员,可以自己执行这些测试。这样做不仅可以帮助您确保自己的站点更为安全,还会帮助您构建未来的站点。

SQL 注入误报

再次使用 Hacme Casino 站点,我们来看一下 WebScarab 发现的漏洞:在登录时出现一个 SQL 注入 exploit。保持 Hacme Casino 正在运行,在站点的 Login 输入区域输入 WebScarab 成功使用过的 SQL 代码 —‘) OR 1=1--。单击 Login 时,帐户 Andy_Aces 打开。由于 1=1 将会为真,所以 SQL 注入最基本的形式在这里出现。至于 Andy,他运气不佳,成为数据库中的第一个帐户。

这是如何工作的呢?在后端,数据库运行一个类似这样的查询:

SELECT * FROM users WHERE (username=username AND password=password)

通过 Login 框注入的代码将有效的查询变成:

SELECT * FROM users WHERE (username=’’) OR 1=1—AND password=’’)

该查询为站点的第一个用户(即不幸的 Andy)返回一个成功的登录。

当然,本例只涉及到了 SQL 注入的皮毛。随着一些人在攻击 Web 站点方面变得越来越精通,他们会实际利用该漏洞来创建用户、更改密码以及从站点抽取敏感数据。保护站点免受这些攻击涉及到采取以下几个步骤:

  • 使用参数化查询或存储过程来访问数据库,而不是使用字符串连接。参数化查询要求您定义所有的 SQL 代码,然后向查询传入每个参数。这允许数据库区分代码和数据,所以不管提供的是什么类型的用户输入都无所谓。存储过程类似于参数化查询,也要求您首先定义 SQL 代码,然后再传入参数。不同之处在于,用于存储过程的 SQL 代码定义并存储在数据库本身中,然后从应用程序中进行调用。
  • 通过列出允许的字符串清洁用户输入。如果您被要求输入一个名称,那么只允许 a-z 和 A-Z。对于电话号码,字符限制为 0-9。使用您的数据库支持的适当验证技术来做到这一点。
  • 使用数据库设置的字符转义方案转义用户提供的输入。转义特殊的字符会告诉数据库,查询中提供的字符实际上是数据,而不是代码。如果所有用户提供的输入都使用适当的方案进行了转义,那么数据库就不会将输入与您编写的代码混淆。
  • 不要给攻击者以任何帮助。确保错误消息不要泄露以后可被用来攻击站点的信息。

XSS 误报

要演示一个 XSS 攻击的例子,回到 WebGoat。单击 Cross Site Scripting > LAB: Cross Site Scripting > Stage 1: Stored XSS 启动该站点。用一个用户名 Larry Stooge 和密码 larry 登录到演示站点 —Goat Hills Financial。现在,攻击者需要找到某个地方来输入恶意脚本。Search Staff 功能可能具有一个文本框(有人可以在这里输入名称):单击 Search Staff 以显示它,如 图 9 所示。

图 9. 一个 XSS 入口点
Goat Hills Financial Human Resources 的 XSS 入口点的屏幕快照,显示一个用于搜索用户的文本字段,带有一个标注为 FindProfile 的按钮。
Goat Hills Financial Human Resources 的 XSS 入口点的屏幕快照,显示一个用于搜索用户的文本字段,带有一个标注为 FindProfile 的按钮。

Name 框中,输入 alert("You got me with XSS");。该脚本可能只显示一个类似于 图 10 所示的警告框,但是请想一想,若脚本会将用户重定向到一个假的人力资源站点,要求用户必须输入社会保障号、家庭地址、银行信息等,那会怎么样呢?改变与 OK 按钮相关的操作可以做到这一点。对于真正创造性的恶意黑客,若是用户信任他们,那么他们的目的总是会达到。

图 10. 一个成功的 XSS 攻击
警告框显示消息“You got me with XSS”,底部有一个 OK 按钮。
警告框显示消息“You got me with XSS”,底部有一个 OK 按钮。

要防止遭受 XSS 攻击,需要清理所有输入。如果输入以后会被用作操作系统命令、脚本和数据库查询的参数,那么对输入进行清理是非常重要的。通过在允许非信任的数据被插入到 HTML 元素内容和 HTML 公共属性之前先进行转义,可以清理用户输入。OWASP 推荐,所有小于 256 的 ASCII 值被转义。JavaScript™ 数据值、HTML 风格属性值和 HTML 值属性也可以被转义。当然,在转义输入数据之前,确保已经验证了 Web 站点的任何输入。如果您期望的是特定的输入值、数字、字母、电子邮件地址等诸如此类的内容,那么就只允许这种类型的数据,并拒绝任何其他东西。

结束语

在了解 Web 站点会遭受的一些比较常见的攻击时,有必要了解这些攻击是如何工作的。通过知道攻击者在寻找什么并解决这些漏洞,可以防止不太有经验的攻击者攻破站点以及为更加有组织的攻击者制造更多的麻烦。尽管本文中列出的防范措施和执行的扫描只给出了这些攻击如何工作和被阻止的肤浅知识,但是打下了一个基础,您可以在此基础之上扩展这方面的知识。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development, Open source
ArticleID=461564
ArticleTitle=Web 应用程序安全性:测试漏洞
publish-date=01142010