标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-2662] 作者: future 发表于: [2020-05-11]
本文共 [857] 位读者顶过
[出自:检测如前所述,签名可能出现在SAML消息中的不同位置并且覆盖消息的各个部分。通过保留消息内容,向其中增加新的内容,同时修改剩余部分的结构,我们可以构造出一个新的消息,从技术上讲这个新消息仍然是合法签名的,但是可能被SAML库解析为包含了已签名的关键内容,事实上这个关键内容并不存在。 每当服务提供方进行验证时,有一定的机率验证失败或者进行了不正确的验证,这都给了我们绕过签名验证的机会。打开Burp的拦截功能,捕获SAML请求,然后尝试对这些请求内容进行转换。每一次尝试都要根据一个新的、有效的登录动作来完成,因为通常会有一个Nonce阻止我们重复发送相同的请求。 对于重复测试,按照下面这样设置Burp的Proxy,更方便:
签名是否必需?SAML标准要求所有经过非安全信道(如用户的浏览器)进行传输的消息都要有数字签名。不过,如果消息通过安全信道(如SSL/TLS反向通道)进行传输的话,签名就不是必需的。因此,我们发现SAML使用者在签名存在时,就进行验证;如果签名被删除,就跳过验证。软件基本上假设我们已经检查了来自非安全信道的消息已完成签名,然而并非如此。 所带来的影响是,我们能够直接删除签名,并篡改响应,就好像这里没有签名一样。SAML Raider插件可以很容易完成该测试。
签名是否得到验证?XML签名的验证极其复杂,因为XML签名标准预期在签名验证之前会进行一系列的转换和规范化步骤(e.g.会忽略多余的空白符)。这使得如果没有一个功能齐全的XML签名库在背后做支撑,那么验证签名就极其困难。影响如下:
实现签名标准很困难,并且签名标准自身也存在晦涩难解的特性,这就导致了我们现在看到的问题。 首先,测试一个签名是否有效是很简单的。改变已完成签名内容中的某些数据,看看是否导致中断。 签名是来自正确的签名者吗?另外一个绊脚石就是接收方是否验证了签名者的身份。我们无法看到这一步是否正确,但是SAML Raider插件可以很轻松的做到。 将签名证书复制到SAML Raider的证书存储区:
保存之后对此证书进行自签名,所以现在我们便有了一个相同证书的自签名副本。
这时我们就可以使用这个自签名证书对原始请求进行再签名,可以对整个消息进行签名,或者只对签断言部分签名。
你能够辨别采用这两种选项那个更好,或者两种方式都试一下。 对响应的正确部分进行签名?XSW攻击原理SAML标准所允许的签名存在的位置仅有两处:
SAML标准对允许签名存在的位置以及允许被签名的内容都有具体的描述。 然而没有人为了使用SAML就完整地实现复杂的XML签名机制。该标准是通用的,标准的实现以及为此所开发的软件库也是如此。因此,就有了以下的“职责分离”:
在两个组件之间往往缺少相关规则去规定哪些内容必须签名的。结果就是,我们经常可以对文档的不同部分进行签名,而在接收方看来签名依然有效。 通过复制文档的签名部分,并保证签名数据指向这些副本,我们可以将XML签名库验证的内容和SAML库需要的内容分开。 自动化进行XSW攻击SAML Raider插件可以进行自动化攻击。
尝试下拉菜单中的每一个选项,点击“Apply XSW”发送请求数据。如果没有出现错误,就改变SAML XML中所有的用户名或者其他用户标识符然后重复这个动作。 SAML Raider的局限性尽管SAML Raider插件可以对常见的情况进行测试,但我们仍然有必要对此进行更深层次的理解:
手动XSW如果SAML Raider插件自带的选项都不起作用,你可以尝试手动测试方法:
如果签名验证指向副本,那么你所做的上述改动将被忽略。在实际操作过程中,如果服务器严格限制了请求时间,你应该快速地完成这些步骤。 SAML渗透测试检查表
|