AJAX 编程时代的安全性测试






3.11/5 (3投票s)
2006 年 9 月 28 日
6分钟阅读

25598
了解更多关于保护您的网站的AJAX编程安全的信息。
引言
AJAX (Asynchronous JavaScript and XML) 编程是近来最激动人心的新技术之一。AJAX 允许网页仅刷新一小部分数据,而不是像传统网页编程那样强制重新加载和绘制整个页面。由于可以进行频繁的小更新,使用 AJAX 编程编写的 Web 应用程序可以呈现出更像桌面应用程序的用户界面,这对大多数用户来说是更自然和直观的界面。然而,正如本·帕克(即蜘蛛侠™)的本叔1所说,能力越大,责任越大。Web 应用程序现在已成为恶意用户和进行 SQL 注入及类似攻击的黑客的主要目标。
AJAX 编程为开发人员提供的灵活性和创造性,也相应地增加了开发人员确保代码免受这些新威胁侵害的负担。此外,由于交付安全应用程序是交付高质量应用程序的一部分,因此质量保证 (QA) 团队感受到的负担可能更大。QA 团队现在需要开发一套全新的功能、性能和安全测试方法,以彻底测试使用 AJAX 编程的应用程序在 SQL 注入攻击和其他安全问题方面的质量。
问题出在代码里
例如,考虑一个假设的 the gourmet food 电子商务网站。该网站向用户显示一张世界地图,当用户将鼠标指针移到每个国家上时,页面使用 AJAX 编程连接到 Web 服务器,并检索该国家生产的商品列表。以下 C# 代码片段展示了查询数据库的 Web 方法。
[System.Web.Services.WebMethod]
public System.Collections.IEnumerable GetProducts(string country)
{
// update the select command to use the country parameter
this.SqlDataSource1.SelectCommand =
"SELECT * FROM [Product] WHERE Country = '" + country + "'";
// query the database and return the results
return this.SqlDataSource1.Select(DataSourceSelectArguments.Empty);
}
一些读者可能会注意到这段代码中存在一个明显的安全漏洞。数据库查询是动态构建的,未经验证的用户输入直接发送到数据库。这种不安全的编程技术会导致 SQL 注入攻击的漏洞,这可能对 Web 应用程序及其用户造成毁灭性的打击。SQL 注入漏洞允许攻击者针对数据库执行他们自己的 SQL 查询和命令,而不是 Web 网站开发人员预期的命令。整个数据库,包括客户姓名、地址和信用卡号,都可能被此类命令下载。产品价格可能会被修改。整个数据库本身也可能被永久删除。显然,这是一个非常严重的问题。如果开发人员未能发现问题,下一道防线就是 QA 团队。
普通开发人员在将应用程序交给 QA 部门之前,可能会进行一次快速、粗略的测试,而不会彻底检查 SQL 注入漏洞或其他重要问题。相反,他会鼠标移到地图上的几个国家,检查显示的结果是否与数据库中的匹配,然后将代码移交。而普通的 QA 工程师,通常会更彻底。他会鼠标移到地图上的每个国家,并检查结果是否匹配。他甚至可能设置一个自动化测试脚本,该脚本会鼠标移到屏幕上的每一个像素,并检查 AJAX 编程或底层页面代码是否存在任何错误。但是,即使这种极端的彻底性也不足以发现 SQL 注入漏洞。通过使用 Web 浏览器(或从 Web 浏览器录制的自动化脚本)作为测试工具,测试人员将自己潜在的请求限制在浏览器能够发送的范围内,而浏览器本身受到网页源代码的限制。在上面的例子中,浏览器将被限制为只向 GetProducts
方法发送有效的国家参数,因为页面代码中只存在有效的国家。换句话说,无论用户(或 QA 工程师)鼠标移到哪里,唯一会发送的参数都是“GBR”、“FRA”、“USA”等。仅使用这些有效、格式正确的参数将永远无法暴露 SQL 注入漏洞。要做到这一点,QA 团队需要将他们的测试工具库扩展到浏览器之外。
由于浏览器如此有限,黑客通常不会使用它们来入侵 Web 应用程序或执行 SQL 注入攻击和其他破解。他们使用操作级别低得多的工具,这些工具能够向地址发送原始 HTTP 请求并显示原始 HTTP 响应。Netcat 是一个流行的工具,telnet 也是如此,它还有一个优点是几乎所有现代操作系统都默认安装。因此,黑客不会打开浏览器,导航到页面,然后查看渲染的 HTML 响应,而是会输入
nc 172.16.60.250 80 GET / HTTP/1.0
然后接收响应
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 10 May 2006 18:04:56 GMT…
虽然与 AJAX 编程的交互可能看起来不会产生服务器的往返请求,因为它不会刷新整个页面,但在幕后,它就是这样做的。与标准超链接导航或表单提交编程一样,AJAX 编程操作始终都有一个 HTTP 请求和响应。因此,有了他的低级 HTTP 请求工具,黑客就可以自由地对应用程序进行攻击,而这是仅靠浏览器永远不可能实现的。他可以发送“XXX”、“!@#$%”或“x’ OR ‘1’ = ‘1”,而不是发送“GBR”或“FRA”,在后一种情况下,这将成功利用 SQL 注入漏洞。
像黑客一样思考
为了成功抵御黑客的 SQL 注入或其他攻击,QA 工程师必须像黑客一样思考。由于黑客不局限于只使用浏览器来攻击 Web 应用程序(无论是否使用 AJAX 编程),QA 工程师也不应该只使用浏览器来测试它。至少,应用程序应该使用黑客使用的同一种原始 HTTP 工具进行测试。更好的方法是使用执行这些测试的自动化安全分析工具。自动化工具可以在一小时内发送数千个测试请求;而 QA 工程师手动完成这些工作可能需要一周或更长时间。此外,这些工具通常拥有一套广泛的技术来检测安全缺陷,例如 SQL 注入漏洞。除非 QA 工程师有信息安全背景,否则他们不太可能了解这些技术。市面上有几种优秀的商业安全分析工具。有关 Web 应用程序安全和安全分析工具的更多学习资源包括 Web Application Security Consortium (WASC)(WASC)、Open Web Application Security Project (OWASP)(OWASP)和 SANS (SysAdmin, Audit, Network, Security) Institute(SANS)。
使用 AJAX 编程的 Web 应用程序似乎是 Web 开发的未来。由 AJAX 编程组成的网页所能提供的强大用户界面,在可用性方面比传统网页有了巨大的飞跃。但是,这种能力也付出了代价:程序员和 QA 工程师在测试应用程序时,必须超越仅使用浏览器。安全性漏洞可能隐藏在仅通过专门的低级请求工具才能访问的代码中。黑客很乐意使用这些工具来攻击你的 Web 应用程序,所以你的 QA 团队必须采用相同的策略来首先找到这些漏洞。
1Spider-Man 是 Marvel Enterprises, Inc. 的注册商标。