确定应用程序注入点
ID |
---|
WSTG-INFO-06 |
总结
在进行任何彻底测试之前,枚举应用程序及其攻击面是一个关键的前提,因为它允许测试人员识别可能的弱点区域。本节旨在帮助识别和绘制应用程序中在完成枚举和映射后应调查的区域。
测试目标
- 通过请求和响应分析确定可能的入口和注入点。
如何测试
在开始任何测试之前,测试人员应始终很好地了解应用程序以及用户和浏览器如何与之通信。当测试人员遍历应用程序时,他们应该注意所有 HTTP 请求以及传递给应用程序的每个参数和表单字段。他们应该特别注意何时使用 GET 请求以及何时使用 POST 请求将参数传递给应用程序。此外,他们还需要注意何时使用其他方法进行 RESTful 服务。
请注意,为了查看请求正文(如 POST 请求)中发送的参数,测试人员可能希望使用拦截代理等工具(请参阅工具)。在 POST 请求中,测试人员还应特别注意传递给应用程序的任何隐藏表单字段,因为这些字段通常包含敏感信息,例如状态信息、项目数量、项目价格等,开发人员从未打算让任何人查看或更改这些信息。
在此测试阶段使用拦截代理和笔记应用程序(例如,电子表格软件)在测试人员中很受欢迎。代理将在测试人员和应用程序探索时跟踪每个请求和响应。此外,此时,测试人员通常会捕获每个请求和响应,以便他们可以准确地看到传递给应用程序的每个标头、参数等以及返回的内容。这有时可能非常乏味,尤其是在大型交互式网站上(想想银行应用程序)。但是,经验将显示要寻找的内容,并且可以显着优化此阶段。
当测试人员遍历应用程序时,他们应该记下 URL、自定义标头或请求/响应正文中的任何有趣参数,并将它们保存在电子表格中。电子表格应包括请求的页面(最好也添加来自代理的请求编号,以供将来参考)、有趣的参数、请求类型(GET、POST 等)、访问是否经过身份验证/未经身份验证、是否使用 TLS、是否是多步骤过程的一部分、如果使用 WebSocket 以及任何其他相关说明。一旦他们绘制了应用程序的每个区域,他们就可以浏览应用程序并测试他们确定的每个区域,并记录哪些有效,哪些无效。本指南的其余部分将确定如何测试这些感兴趣的领域中的每一个,但本节必须在任何实际测试开始之前进行。
以下是所有请求和响应的一些兴趣点。在请求部分中,重点关注 GET 和 POST 方法,因为它们构成了大多数请求。请注意,还可以找到其他方法,例如 PUT 和 DELETE。通常,如果允许,此类罕见的请求可能会暴露漏洞。本指南中有一个专门用于测试这些 HTTP 方法的特殊部分。
请求
- 确定 GIT 的使用位置和使用 POST 的位置。
- 标识 POST 请求中使用的所有参数(这些参数位于请求正文中)。
- 在 POST 请求中,请特别注意任何隐藏的参数。发送 POST 时,所有表单字段(包括隐藏参数)都将在 HTTP 消息正文中发送到应用程序。除非使用代理或查看 HTML 源代码,否则通常看不到这些内容。更改这些隐藏参数可能会导致加载的后续页面、它们包含的数据以及授予的访问权限级别发生变化。
- 识别GET请求中使用的所有参数(即URL),特别是查询字符串(通常出现在?标记之后)。
- 标识查询字符串的所有参数。这些通常采用成对格式,例如
foo=bar
.另请注意,&
,\~
,:
许多参数可以位于一个查询字符串中,由 、 、 或任何其他特殊字符或编码分隔。 - 请注意,在一个字符串或 POST 请求中识别多个参数时,执行攻击将需要部分或全部参数。测试人员需要识别所有参数(即使它们是编码或加密的),并确定应用程序正在处理哪些参数。本指南的后面部分将介绍如何测试这些参数。此时,重要的是要确保识别它们中的每一个。
- 还要注意通常看不到的任何其他或自定义类型标头(如
debug: false
)。
反应
-
确定新 Cookie 的设置(
Set-Cookie
标头)、修改或添加到的位置。 -
在正常响应(即未修改的请求)期间识别任何重定向(3xx HTTP 状态代码)、400 状态代码(特别是 403 禁止访问)和 500 个内部服务器错误
-
还要注意使用任何有趣的标头的位置。例如
Server: BIG-IP
,指示站点已负载平衡。因此,如果站点已负载平衡并且一台服务器配置不正确,则测试人员可能必须发出多个请求才能访问易受攻击的服务器,具体取决于所使用的负载平衡类型。
OWASP 攻击面检测器
攻击面检测器 (ASD) 工具调查源代码并发现 Web 应用程序的终结点、这些终结点接受的参数以及这些参数的数据类型。这包括蜘蛛无法找到的未链接端点,以及客户端代码中完全未使用的可选参数。它还能够计算应用程序的两个版本之间的攻击面变化。
攻击面检测器可作为 ZAP 和 Burp Suite 的插件使用,并且还提供命令行工具。命令行工具将攻击面导出为 JSON 输出,然后可供 ZAP 和 Burp 套件插件使用。这对于源代码未直接提供给渗透测试人员的情况很有帮助。例如,渗透测试人员可以从不想提供源代码本身的客户那里获取 json 输出文件。
How to Use
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
拥有各种注入位置为攻击者提供了链接的可能性,可以提高在处理代码中发现错误的机会。