REST 评估备忘单¶
关于 RESTful Web 服务¶
Web 服务是用于机器到机器通信的 Web 技术实现。因此,它们被用于应用程序间通信、Web 2.0 和 Mashups,以及桌面和移动应用程序调用服务器。
RESTful Web 服务(通常简称为 REST)是基于 RESTful 设计模式的轻量级 Web 服务变体。实际上,RESTful Web 服务利用与常规 HTTP 调用相似的 HTTP 请求,这与 SOAP 等其他利用复杂协议的 Web 服务技术形成对比。
RESTful Web 服务的主要相关特性¶
- 使用 HTTP 方法(
GET
、POST
、PUT
和DELETE
)作为所请求操作的主要动词。 - 非标准参数规范
- 作为 URL 的一部分。
- 在请求头中。
- 在参数值、请求体或响应体中使用 JSON 或 XML 的结构化参数和响应。这些是通信机器有用信息所必需的。
- 自定义身份验证和会话管理,通常利用自定义安全令牌:这是必需的,因为机器到机器通信不允许登录序列。
- 缺乏正式文档。Sun Microsystems 提交了一个描述 RESTful Web 服务的拟议标准 WADL,但从未被官方采用。
RESTful Web 服务安全测试的挑战¶
- 检查应用程序无法揭示攻击面,即 RESTful Web 服务使用的 URL 和参数结构。原因如下:
- 没有应用程序利用服务暴露的所有可用功能和参数
- 所使用的功能通常由客户端代码动态激活,而不是作为页面中的链接。
- 客户端应用程序通常不是 Web 应用程序,不允许检查激活链接甚至相关代码。
- 参数是非标准的,这使得很难确定什么是 URL 的一部分或固定请求头,以及什么参数值得进行模糊测试。
- 作为机器接口,使用的参数数量可能非常大,例如一个 JSON 结构可能包含几十个参数。对每个参数进行模糊测试会显著延长测试所需的时间。
- 自定义身份验证机制需要逆向工程,并且会使常用工具失效,因为它们无法跟踪登录会话。
如何对 RESTful Web 服务进行渗透测试¶
通过文档确定攻击面 - 如果允许一定程度的白盒测试并能获取有关服务的信息,RESTful 渗透测试可能会更有效。
这些信息将确保更全面地覆盖攻击面。应寻找此类信息:
- 正式服务描述 - 虽然对于 SOAP 等其他类型的 Web 服务,通常有 WSDL 形式的正式描述可用,但 REST 服务很少有这种情况。尽管如此,WSDL 2.0 或 WADL 都可以描述 REST,并且有时会被使用。
- 使用服务的开发者指南可能不那么详细,但通常可以找到,甚至可能被视为黑盒测试。
- 应用程序源代码或配置 - 在许多框架中,包括 .NET,REST 服务定义可能更容易从配置文件而非代码中获取。
使用代理收集完整的请求 - 虽然这始终是渗透测试的重要一步,但对于基于 REST 的应用程序而言更为重要,因为应用程序 UI 可能无法提供实际攻击面的线索。
请注意,代理必须能够收集完整的请求而不仅仅是 URL,因为 REST 服务不仅仅使用 GET 参数。
分析收集到的请求以确定攻击面
- 查找非标准参数
- 查找异常的 HTTP 请求头 - 这些很多时候是基于请求头的参数。
- 确定 URL 段在不同 URL 中是否存在重复模式。此类模式可以包括日期、数字或类似 ID 的字符串,并表明该 URL 段是 URL 中嵌入的参数。
- 例如:
http://server/srv/2013-10-21/use.php
- 例如:
- 查找结构化参数值 - 这些可能是 JSON、XML 或非标准结构。
- 如果 URL 的最后一个元素没有扩展名,它可能是一个参数。如果应用程序技术通常使用扩展名,或者前一个段确实有扩展名,则尤其如此。
- 例如:
http://server/svc/Grid.asmx/GetRelatedListItems
- 例如:
- 查找高度变化的 URL 段 - 具有许多值的单个 URL 段可能是参数而非物理目录。
- 例如,如果 URL
http://server/src/XXXX/page
中的XXXX
重复出现数百个不同的值,则XXXX
很可能是一个参数。
- 例如,如果 URL
验证非标准参数:在某些情况下(但并非所有情况),将疑似参数的 URL 段的值设置为预期无效的值,有助于确定它是否是路径元素或参数。如果是路径元素,Web 服务器将返回 *404* 消息;而对于参数的无效值,由于该值在 Web 服务器级别是合法的,响应将是应用程序级别的消息。
分析收集到的请求以优化模糊测试 - 在确定要模糊测试的潜在参数后,分析每个参数的收集值以确定
- 有效值与无效值,以便模糊测试可以专注于边缘无效值。
- 例如,对于始终为正整数的值发送 *0*。
- 允许模糊测试超出假定分配给当前用户的范围的序列。
最后,在进行模糊测试时,不要忘记模拟所使用的身份验证机制。
相关资源¶
- REST 安全备忘单 - 本备忘单的另一部分
- YouTube:RESTful 服务,网络安全盲点 - 一个详细阐述本备忘单大部分主题的视频演示。