跳到内容

REST 评估备忘单

关于 RESTful Web 服务

Web 服务是用于机器到机器通信的 Web 技术实现。因此,它们被用于应用程序间通信、Web 2.0 和 Mashups,以及桌面和移动应用程序调用服务器。

RESTful Web 服务(通常简称为 REST)是基于 RESTful 设计模式的轻量级 Web 服务变体。实际上,RESTful Web 服务利用与常规 HTTP 调用相似的 HTTP 请求,这与 SOAP 等其他利用复杂协议的 Web 服务技术形成对比。

RESTful Web 服务的主要相关特性

  • 使用 HTTP 方法(GETPOSTPUTDELETE)作为所请求操作的主要动词。
  • 非标准参数规范
    • 作为 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 段的值设置为预期无效的值,有助于确定它是否是路径元素或参数。如果是路径元素,Web 服务器将返回 *404* 消息;而对于参数的无效值,由于该值在 Web 服务器级别是合法的,响应将是应用程序级别的消息。

分析收集到的请求以优化模糊测试 - 在确定要模糊测试的潜在参数后,分析每个参数的收集值以确定

  • 有效值与无效值,以便模糊测试可以专注于边缘无效值。
    • 例如,对于始终为正整数的值发送 *0*。
  • 允许模糊测试超出假定分配给当前用户的范围的序列。

最后,在进行模糊测试时,不要忘记模拟所使用的身份验证机制。