SAMLRCE
https://www.netstarsec.com/%E4%BA%94%E5%88%86%E9%92%9F%E5%AD%A6%E4%BC%9Asaml%E5%8D%8F%E8%AE%AE%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%8F%91%E7%8E%B0%E4%B8%8E%E5%88%A9%E7%94%A8/ https://xz.aliyun.com/t/12584?time__1311=mqmhD50KBIPGxiqGNveeuqWT3qI24pm71YD&alichlgref=https%3A%2F%2Fwww.google.com%2F
saml 是什么
(Security Assertion Markup Language)saml【其中文意思是 安全断言标记语言】是一种用于在不同的安全域之间进行身份验证和授权的XML标准。它是一种基于声明的身份验证协议,通常用于在身份提供者(Identity Provider,简称IdP)和服务提供者(Service Provider,简称SP)之间传递身份验证信息。其作用是在不同的安全域当中进行交换认证和授权数据。 基于声明的身份验证协议:身份验证过程依赖于被称为声明的有关用户的信息。 声明通常包含用户的身份信息、角色、权限等。 在基于声明的身份验证中,身份提供者idP 生成声明【断言】(一般包含 SP确认用户身份需要的所有信息,断言的来源,签发实践,以及断言满足的条件),并将其提供给服务提供者SP 来验证用户的身份和授权访问。 断言的分类
- 身份验证断言证明了用户的身份,并提供了用户登录的时间以及他们使用的身份验证方法(即,Kerberos,双因素等)
- 归属断言将SAML属性传递给服务提供商 - SAML属性是提供有关用户信息的特定数据片段。
- 授权决策断言表示如果用户被授权使用该服务,或者由于密码失败或缺乏对服务的权限,身份提供商拒绝了他们的请求。
saml最主要的作用是 为了 SSO 单点登录。
saml进行传输,分为saml_request和 saml_response
在IDp和 sp之间进行传输的时候需要进行确定好两者之间的传输格式 saml Binding,其分为HTTP Redirect Binding ,常见的
HTTP POST Binding
通过Form表单以POST请求的方式将SAML Request发到SP,IdP通过立即提交的Form表单以POST请求的方式将SAML Response 发送到 SP
saml常见的部署架构
某企业购买了一个软件,其软件可能是saas服务,但是不想利用其中的登录页面,想使用本地的sso自行进行配置登录,此时就需要使用saml将办公平台和该saas软件的平台身份打通,此时即使用双方都支持的saml协议。 其中主要的数据包为 AuthnRequest和 AuthnResponse,四个比较关键的点为
- SP 生成 AuthnRequest
- IDP 响应 AuthnRequest
- IDP 生成 AuthnResponse
- SP 收到 AuthnResponse
过程中:通常不会对 IDP不会对 AuthnRequest进行检验,IDP生成 Response的时候会对断言进行签名 (断言当中的信息 为认证的用户的信息 )
认证的架构
在SP收到 AuthnResponse主要会校验两个 securityPolicies
- SAML2HTTPPostSimpleSignRule是校验post传输中数据的签名。
- SAMLProtocolMessageXMLSignatureSecurityPolicyRule是校验Saml Response中的签名。
- SP从证书中提取public key,用public key对SignatureValue解密,解密值是Signedinfo的摘要。
- 对Signedinfo重新摘要,和解密的摘要值进行对比。
- 接着还会对比DigestValue摘要值,这个值是Response中除了Response子标签Signature的摘要,这里的处理是重新计算这部分的摘要。
- 后面还会对Assertion进行校验,校验了Assertion中的Sianature、摘要信息,还校验了Conditions是否过期,Subject中的接收者是否是预期的接收端点等校验,这一系列校验之后,就成功返回一个Credential,里面包含了用户的一些信息。
认证所面对的安全问题是什么?
- 签名是否是必须的:判断是否携带了Signature,携带就校验,没有携带就不校验。
- 签名是否进行验证?有可能未进行强制验证。
- 校验是否是信任的证书,即可以伪造证书,然后对SAML信息进行篡改,重新签名
- 响应中正确的部分是否签名:Response、Asseration。如果实现上没有验证签名到正确的位置,那么将签名引用到不同的位置,也会让SP认为签名是有效的。即部分签名
saml所面临的攻击面是哪些?
因为saml是基于xml的认证协议,所以其可能存在xml所带来的问题:xxe xslt xsw等安全风险,加上其为认证协议,所以其也可能存在逻辑漏洞。 XXE漏洞的主要原因是因为没有禁用外部实体 XSLT攻击 是 将XML格式转换为其他格式的语言,利用XSLT来进行执行恶意代码或获取敏感信息 ,SAML签名前使用了多个transform对签名内容进行一系列处理,每一个transform定义了数据处理算法
<ds:Transform Algorithm=”http://www.w3.org/2001/10/xml-exc-c14n#”/>
规定的是规范化算法
<ds:Transform Algorithm=”http://www.w3.org/2000/09/xmldsig#enveloped-signature”/>
表示的是数字签名算法
如果在服务端没有任何校验的情况下就对SAML签名进行验证就会产生 XSLT漏洞
XML移除签名
saml当中的签名标准允许 我们可以对文档的一部分进行签名,而不是对整个文档进行签名,并且将签名嵌入到应该进行验证的文档当中,即为 内联签名 。该签名会出现在SAML消息当中的不同位置,并且覆盖消息的各个部分。 这可能导致,我们保留原有的消息内容,再增加新的内容,同时修改部分的结构,可以精心构造出一个合法签名的新消息。另外如果消息是通过安全信道进行传输,那么可以不进行签名,saml的使用者会在签名存在的时候进行验证,并在签名删除的情况下跳出验证。
- 具体的利用细节是什么?
- saml漏洞的本质是什么?
- 我们应该如何从白黑/盒角度进行发现?
- 我们之间所发现的saml是什么漏洞?
相关文档
《Hacking the Cloud With SAML》