介绍代理增强序列图(PESD)
2023年2月14日 - 作者:Francesco Lacerenza
PESD导出器现已公开!
我们发布了一个内部工具,以加速复杂功能流中的测试和报告工作。我们很高兴地宣布,PESD导出器现已在Github上可用。
背景
现代Web平台设计涉及与其他应用程序和云服务的集成,以添加功能、共享数据并丰富用户体验。由此产生的功能流具有多个状态更改步骤,涉及复杂的信任边界和责任分离。
在这种情况下,Web安全专家如果希望用整个功能逻辑的可视化来支持他们的分析,就必须手动建模序列图。
我们都知道,手动构建序列图是繁琐、容易出错、耗时的,有时甚至不切实际(处理单个流中超过十条消息)。
什么是PESD?
代理增强序列图(PESD)是我们的内部Burp Suite扩展,用于以促进复杂功能流场景中的分析和报告的方式可视化Web流量。
格式介绍
代理增强序列图(PESD)是一种特定的消息语法,用于序列图模型,旨在带来有关所表示HTTP流量的丰富信息。使用MermaidJS序列图语法来渲染最终图表。
虽然软件工程的经典序列图用于抽象可视化,所有信息都由图表本身携带,但PESD设计为包括以元数据形式表示的底层HTTP流量的详细信息。
格式名称中的“增强”部分源于图表与元数据的可链接性。实际上,图表中的HTTP事件被标记为标志,可用于从元数据访问特定信息。
例如,URL查询参数将在箭头事件中找到,作为可点击展开的UrlParams。
关键特性
- 视觉分析,特别适用于多参与者场景中的复杂应用流,其中列出的代理视图不适合可视化抽象逻辑
- 测试人员特定的语法,以促进分析和整体可读性
- 从Web流量解析的元数据,以支持进一步的分析自动化
- 可用于报告目的,如当前实现的文档或概念验证图表
PESD导出器 - Burp Suite扩展
该扩展处理Burp Suite流量到PESD格式的转换,并提供执行模板的可能性,以丰富导出结果。
一旦加载,将项目发送到扩展将直接导致导出所有活动设置。
目前支持两种操作模式:
- 域作为参与者 - 涉及流量中的每个域在图表中表示为参与者。适用于多域流分析
- 端点作为参与者 - 涉及流量中的每个端点(路径)在图表中表示为参与者。适用于单域流分析
导出功能
- 可扩展元数据。下划线的标志可以点击以显示流量中的底层元数据在可滚动的弹出窗口中
- 掩码URL路径中的随机值。在路径段中识别的UUID和伪随机字符串映射到变量名<UUID_N> / <VAR_N>。重新渲染将重塑图表以提高流可读性。每个具有相同值的出现保持相同的名称
- 注释。Burp Suite中的注释转换为结果图表中的注释。在Burp Suite注释中使用
以获得PESD导出中的多行注释 - 保存为:
- SVG格式的序列图
- Markdown文件(MermaidJS语法)
- JSON格式的流量元数据。在格式定义页面的“导出部分”阅读有关元数据结构的信息
使用模板扩展图表、语法和元数据
PESD导出器支持通过模板执行来扩展语法和元数据。
目前支持的模板包括:
- OAuth2 / OpenID Connect - 模板匹配标准OAuth2/OpenID Connect流并添加相关标志和流框架
- SAML SSO - 模板匹配SAML V2.0的单点登录流并添加相关标志和流框架
模板匹配示例用于SAML SP发起的SSO与重定向POST:
模板引擎还确保在交叉流和不良实现的情况下的一致性。当前检查防止嵌套流框架,因为它们无法在真实场景中找到。结果markdown中的嵌套或未关闭框架被删除和合并,以允许MermaidJS渲染。
注意:每当涉及支持框架的导出中未显示流框架时,强烈建议手动审查。此行为应被视为应用程序使用非标准实现的警告。
您想通过编写自己的模板来贡献吗?请遵循模板实现指南。
为什么使用PESD?
在测试规划和审计期间
PESD导出允许可视化复杂功能的全部内容,同时仍然能够访问其底层逻辑的核心部分。每个参与者的角色可以轻松推导,并用于在深入Burp Suite之前构建测试计划。
它还可以用于发现与标准框架的差异,得益于HTTP消息语法以及OAuth2/OpenID和SAML SSO模板。
特别是,模板使测试人员能够通过匹配结果图表中的标准流来识别不常见的实现。通过这样做,可以一目了然地发现自定义变体。
以下详细示例摘自我们的测试活动:
- SAML响应双重支出。SAML响应发送了两次,其中一次提交发生在流框架之外
- OIDC与后续OAuth2。在这种情况下,CLIENT.com是第一个流中的SP与Microsoft(OIDC),然后在第二个流中(OAuth2)与租户子域是IdP
在报告期间
研究输出的主要好处是将PESD生成的图表与漏洞分析相结合。在报告中包含PoC特定导出允许以直接的方式描述问题。
导出使测试人员能够通过指定其ID在图表中引用流中的请求,并在描述中链接它。
漏洞描述可以适应不同的测试方法:
- 黑盒测试 - 描述可以参考流中感兴趣的序列号以及观察到的行为和缺陷
- 白盒测试 - 描述可以直接引用代码库中识别的端点处理函数。此结果特别有助于帮助读者将代码片段与它们在整个流中的位置联系起来
在这种意义上,PESD可以积极影响复杂功能流中漏洞的报告风格。
以下基本示例摘自我们的客户参与之一。
报告示例 - 通过未经身份验证的内部API端点任意用户访问
超级管理员使用的内部(内联网)Web应用程序允许应用程序内的特权用户获得对面向Web平台中客户账户的临时访问。
为了限制对客户数据的访问,支持访问必须由面向Web平台中的租户管理员授予。通过这种方式,内部应用程序的管理员仅通过有效授予对组织具有用户访问权限。
以下序列图表示在内部应用程序中用户模拟访问期间截获的流量:
第一个请求(1)的处理函数检查所请求用户租户的访问授予是否存在。如果有有效授予,则返回在AWS的API网关中定义的内部API的重定向URL。该API仅暴露在可通过VPN访问的内部网络中。
第二个请求(3)指向AWS的API网关。端点由AWS Lambda函数处理,输入包含URL参数:tenantId、user_id等。返回的输出包含所请求模拟会话的身份验证详细信息:access_token、refresh_token和user_id。应注意,内部API网关端点未强制执行调用者的身份验证和授权。
在第三个请求(5)中,获得的身份验证详细信息提交到web-facing.platform.com,并设置会话。在此步骤之后,内部管理员用户在面向Web平台中作为指定目标用户进行身份验证。
在所描述的流中,身份验证和授权检查(请求1的处理)与实际创建模拟会话(请求3的处理)解耦。
结果,任何可以访问内部网络(VPN)的员工都能够调用负责发布模拟会话的内部AWS API,并获得对面向Web平台中任何用户的访问。通过这样做,绕过了对内部应用程序的有效超级管理员访问(身份验证)和特定目标用户访问授予(授权)的需求。
敬请期待!
更新即将到来。我们期待收到新的改进想法,以进一步丰富PESD。
欢迎通过拉取请求、错误报告或增强功能来贡献。
这个项目是在Doyensec研究岛上由Francesco Lacerenza用爱制作的。该扩展是在他的实习期间用50%的研究时间开发的。