确定应用入口点
概括
在进行任何彻底的测试之前,枚举应用程序及其攻击面是一个关键的先决条件,因为它允许测试人员识别可能的弱点区域。本节旨在帮助识别和映射应用程序中的区域,一旦枚举和映射完成后应进行调查。
测试目标
- 通过请求和响应分析确定可能的入口和注入点。
如何测试
在开始任何测试之前,测试人员应该始终很好地了解应用程序,以及用户和浏览器如何与之通信。当测试人员遍历应用程序时,他们应该注意所有 HTTP 请求以及传递给应用程序的每个参数和表单字段。他们应特别注意何时使用 GET 请求以及何时使用 POST 请求向应用程序传递参数。此外,他们还需要注意何时使用其他用于 RESTful 服务的方法。
请注意,为了查看在请求正文(例如 POST 请求)中发送的参数,测试人员可能需要使用诸如拦截代理之类的工具(请参阅工具)。在 POST 请求中,测试人员还应该特别注意传递给应用程序的任何隐藏表单字段,因为这些通常包含敏感信息,例如状态信息、项目数量、项目价格,开发人员永远不会旨在供任何人查看或更改。
根据作者的经验,在这个测试阶段使用拦截代理和电子表格非常有用。代理将在测试人员探索应用程序时跟踪测试人员和应用程序之间的每个请求和响应。此外,在这一点上,测试人员通常会捕获每个请求和响应,以便他们可以准确地看到传递给应用程序的每个标头、参数等以及返回的内容。这有时会非常乏味,尤其是在大型交互式网站上(想想银行应用程序)。然而,经验会告诉我们要寻找什么,这个阶段可以大大减少。
当测试人员遍历应用程序时,他们应该记下 URL、自定义标头或请求/响应正文中的任何有趣参数,并将它们保存在电子表格中。电子表格应包括请求的页面(最好还添加来自代理的请求编号,以供将来参考)、有趣的参数、请求类型(GET、POST 等),如果访问是经过身份验证/未经过身份验证的,如果使用 TLS,如果它是多步骤过程的一部分,如果使用 WebSockets,以及任何其他相关说明。一旦他们规划了应用程序的每个区域,他们就可以检查应用程序并测试他们已经确定的每个区域,并记录哪些有效,哪些无效。本指南的其余部分将确定如何测试每个感兴趣的领域,
以下是所有请求和响应的一些要点。在请求部分,重点关注 GET 和 POST 方法,因为它们出现在大多数请求中。请注意,可以使用其他方法,例如 PUT 和 DELETE。通常,如果允许,这些更罕见的请求可能会暴露漏洞。本指南中有一个专门用于测试这些 HTTP 方法的部分。
要求
- 确定在何处使用 GET 和在何处使用 POST。
- 识别 POST 请求中使用的所有参数(这些在请求的正文中)。
- 在 POST 请求中,请特别注意任何隐藏参数。发送 POST 时,所有表单字段(包括隐藏参数)都将在 HTTP 消息正文中发送到应用程序。这些通常是看不到的,除非使用代理或查看 HTML 源代码。此外,显示的下一页、其数据和访问级别都可能因隐藏参数的值而异。
- 识别 GET 请求中使用的所有参数(即 URL),特别是查询字符串(通常在 ? 标记之后)。
- 识别查询字符串的所有参数。这些通常是成对格式,例如
foo=bar
. 另请注意,许多参数可以在一个查询字符串中,例如由&
,\~
,:
或任何其他特殊字符或编码分隔。 - 在识别一个字符串或 POST 请求中的多个参数时需要特别注意的是,执行攻击需要部分或全部参数。测试人员需要识别所有参数(即使已编码或加密)并识别哪些参数由应用程序处理。指南的后面部分将确定如何测试这些参数。在这一点上,只需确保它们中的每一个都被识别出来。
- 还要注意通常看不到的任何其他或自定义类型标头(例如
debug: false
)。
回应
- 确定新 cookie 的设置(
Set-Cookie
标头)、修改或添加位置。 - 确定在正常响应(即未修改的请求)期间存在任何重定向(3xx HTTP 状态代码)、400 状态代码(尤其是 403 Forbidden)和 500 内部服务器错误的位置。
- 还要注意使用任何有趣的标头的位置。例如,
Server: BIG-IP
表示该站点是负载平衡的。因此,如果一个站点是负载平衡的并且一台服务器配置不正确,那么测试人员可能不得不发出多个请求来访问易受攻击的服务器,具体取决于所使用的负载平衡类型。
OWASP 攻击面检测器
Attack Surface Detector (ASD) 工具调查源代码并发现 Web 应用程序的端点、这些端点接受的参数以及这些参数的数据类型。这包括蜘蛛无法找到的未链接端点,或客户端代码中完全未使用的可选参数。它还能够计算应用程序两个版本之间攻击面的变化。
Attack Surface Detector 可作为 ZAP 和 Burp Suite 的插件使用,还提供命令行工具。命令行工具将攻击面导出为 JSON 输出,然后可供 ZAP 和 Burp Suite 插件使用。这对于未直接向渗透测试人员提供源代码的情况很有帮助。例如,渗透测试人员可以从不想提供源代码的客户那里获取 json 输出文件。
如何使用
CLI jar 文件可从https://github.com/secdec/attack-surface-detector-cli/releases下载。
您可以为 ASD 运行以下命令,以从目标 Web 应用程序的源代码中识别端点。
java -jar attack-surface-detector-cli-1.3.5.jar <source-code-path> [flags]
这是针对OWASP RailsGoat运行命令的示例。
$ java -jar attack-surface-detector-cli-1.3.5.jar railsgoat/
Beginning endpoint detection for '<...>/railsgoat' with 1 framework types
Using framework=RAILS
[0] GET: /login (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_contro
ller.rb (lines '6'-'9')
[1] GET: /logout (0 variants): PARAMETERS={}; FILE=/app/controllers/sessions_controller.rb (lines '33'-'37')
[2] POST: /forgot_password (0 variants): PARAMETERS={email=name=email, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/
password_resets_controller.rb (lines '29'-'38')
[3] GET: /password_resets (0 variants): PARAMETERS={token=name=token, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/p
assword_resets_controller.rb (lines '19'-'27')
[4] POST: /password_resets (0 variants): PARAMETERS={password=name=password, paramType=QUERY_STRING, dataType=STRING, user=name=user, paramType=QUERY_STRING, dataType=STRING, confirm_password=name=confirm_password, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/password_resets_controller.rb (lines '5'-'17')
[5] GET: /sessions/new (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '6'-'9')
[6] POST: /sessions (0 variants): PARAMETERS={password=name=password, paramType=QUERY_STRING, dataType=STRING, user_id=name=user_id, paramType=SESSION, dataType=STRING, remember_me=name=remember_me, paramType=QUERY_STRING, dataType=STRING, url=name=url, paramType=QUERY_STRING, dataType=STRING, email=name=email, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '11'-'31')
[7] DELETE: /sessions/{id} (0 variants): PARAMETERS={}; FILE=/app/controllers/sessions_controller.rb (lines '33'-'37')
[8] GET: /users (0 variants): PARAMETERS={}; FILE=/app/controllers/api/v1/users_controller.rb (lines '9'-'11')
[9] GET: /users/{id} (0 variants): PARAMETERS={}; FILE=/app/controllers/api/v1/users_controller.rb (lines '13'-'15')
... snipped ...
[38] GET: /api/v1/mobile/{id} (0 variants): PARAMETERS={id=name=id, paramType=QUERY_STRING, dataType=STRING, class=name=class, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/api/v1/mobile_controller.rb (lines '8'-'13')
[39] GET: / (0 variants): PARAMETERS={url=name=url, paramType=QUERY_STRING, dataType=STRING}; FILE=/app/controllers/sessions_controller.rb (lines '6'-'9')
Generated 40 distinct endpoints with 0 variants for a total of 40 endpoints
Successfully validated serialization for these endpoints
0 endpoints were missing code start line
0 endpoints were missing code end line
0 endpoints had the same code start and end line
Generated 36 distinct parameters
Generated 36 total parameters
- 36/36 have their data type
- 0/36 have a list of accepted values
- 36/36 have their parameter type
--- QUERY_STRING: 35
--- SESSION: 1
Finished endpoint detection for '<...>/railsgoat'
----------
-- DONE --
0 projects had duplicate endpoints
Generated 40 distinct endpoints
Generated 40 total endpoints
Generated 36 distinct parameters
Generated 36 total parameters
1/1 projects had endpoints generated
To enable logging include the -debug argument
您还可以使用-json
标志生成一个 JSON 输出文件,插件可以将其用于 ZAP 和 Burp Suite。有关详细信息,请参阅以下链接。
测试应用程序入口点
以下是有关如何检查应用程序入口点的两个示例。
示例 1
此示例显示了一个 GET 请求,该请求将从在线购物应用程序中购买商品。
GET /shoppingApp/buyme.asp?CUSTOMERID=100&ITEM=z101a&PRICE=62.50&IP=x.x.x.x HTTP/1.1
Host: x.x.x.x
Cookie: SESSIONID=Z29vZCBqb2IgcGFkYXdhIG15IHVzZXJuYW1lIGlzIGZvbyBhbmQgcGFzc3dvcmQgaXMgYmFy
请求的所有参数,如 CUSTOMERID、ITEM、PRICE、IP 和 Cookie,这些参数可以只是编码参数或用于会话状态的参数。
示例 2
此示例显示了一个 POST 请求,该请求将使您登录到应用程序。
POST /example/authenticate.asp?service=login HTTP/1.1
Host: x.x.x.x
Cookie: SESSIONID=dGhpcyBpcyBhIGJhZCBhcHAgdGhhdCBzZXRzIHByZWRpY3RhYmxlIGNvb2tpZXMgYW5kIG1pbmUgaXMgMTIzNA==;CustomCookie=00my00trusted00ip00is00x.x.x.x00
user=admin&pass=pass123&debug=true&fromtrustIP=true
可以注意到参数在几个位置发送:
- 在查询字符串中:
service
- 在 Cookie 标头中:
SESSIONID
,CustomCookie
- 在请求正文中:
user
,pass
,debug
,fromtrustIP
拥有各种注入位置为攻击者提供了链接的可能性,可以提高在处理代码中发现错误的机会。