Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/illera88/cve-2021-21239
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试身份验证学习与教育
GitHubillera88/cve-2021-21239

CVE-2021-21239

CVE-2021-21239的利用:pysaml2/Redash中的SAML签名验证绕过。通过嵌入公钥伪造SAML响应,以冒充用户并通过JIT预配提升权限。

查看仓库
11个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2021-21239技术报告:Redash SAML认证漏洞

SAML简介

安全断言标记语言(SAML)是一种开放标准,用于在联合身份系统中的各方之间交换身份验证和授权数据。它支持跨域的单点登录(SSO)。关键组件包括:

  • 身份提供者(IdP):对用户进行身份验证并发布SAML断言的服务(例如,Google的SAML IdP)。它使用其私钥对断言进行签名以确保完整性和真实性。
  • 服务提供者(SP):依赖IdP进行身份验证的应用程序(例如,Redash)。SP使用IdP的公钥或证书验证签名以信任断言。

在典型的SAML流程中,SP将用户重定向到IdP进行身份验证。IdP返回包含关于用户(例如,电子邮件、姓名)的断言的已签名SAML响应。SP验证签名并配置或登录用户。

漏洞解释

CVE-2021-21239是pysaml2库(版本<6.5.0)中的一个签名验证绕过漏洞,该库被Redash <=10.1.0用于SAML SSO。从高层次看,它允许攻击者伪造一个带有任意嵌入公钥的SAML响应,从而通过即时(JIT)配置实现用户模拟和权限提升。

该漏洞源于pysaml2调用xmlsec1验证SAML签名的方式。Xmlsec1默认优先使用SAML响应中<ds:KeyInfo>内嵌入的公钥,而不是已配置的IdP证书。攻击者可以构造一个带有自生成RSA密钥对的SAML响应,将公钥嵌入<ds:RSAKeyValue>,并使用私钥对断言进行签名。由于pysaml2没有限制xmlsec1只使用受信任的IdP证书,伪造的签名被认为是有效的,从而允许攻击者以任何用户(例如admin)身份登录并获得最高权限。

在代码层面,漏洞存在于pysaml2的sigver.py(check_signature函数)中。xmlsec1命令列表缺少--enabled-key-data raw-x509-cert选项,允许xmlsec1使用不受信任的嵌入密钥:

root@kitploit:~
com_list = [
    self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
    '--pubkey-cert-pem', cert_file_name,
    '--id-attr:%s' % id_attr, node_name,
    '--node-id', nodeid, '--output', output_file_name, xml_file_name
]

这使得攻击者可以修改<saml:NameID>中的电子邮件来模拟任何用户,并利用JIT配置。

测试漏洞利用的设置

要测试该漏洞,使用Docker Compose搭建本地Redash实例(v10.1.0或更早版本)。该设置涉及使用Google的IdP配置SAML SSO:

  • 通过Docker Compose安装Redash:克隆Redash仓库,检出易受攻击的标签(例如v10.1.0),并运行docker-compose up。
  • 在Redash的环境变量中配置SAML(例如,REDASH_SAML_LOGIN_ENABLED=true,REDASH_SAML_METADATA_URL=...来自Google的IdP)。
  • 使用Google的SAML IdP进行测试:设置一个带有Redash回调URL的Google Workspace SAML应用。
  • 使用Ngrok将本地Redash实例暴露给Google的IdP。

此设置允许通过Python脚本或Burp Suite发送伪造的SAML响应进行测试,验证权限提升。

技术解释与修复

该漏洞的产生是因为pysaml2的xmlsec1调用允许使用嵌入密钥进行验证,绕过了受信任的IdP证书。攻击者生成一个RSA密钥对,构造一个带有公钥(位于<ds:RSAKeyValue>)的SAML响应,修改属性(例如将电子邮件改为admin的),并对断言进行签名。Xmlsec1使用嵌入密钥进行验证,认为其有效。 修复程序在pysaml2 v6.5.0中实现(初始提交于2021年1月17日),位于src/saml2/sigver.py。xmlsec1命令列表更新为包含--enabled-key-data raw-x509-cert,将验证限制为仅使用已配置的IdP证书:

root@kitploit:~
com_list = [
    self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
    '--pubkey-cert-pem', cert_file_name,
    '--enabled-key-data', 'raw-x509-cert',
    '--id-attr:%s' % id_attr, node_name,
    '--node-id', nodeid, '--output', output_file_name, xml_file_name
]

这强制执行信任链验证,防止使用嵌入密钥。Redash通过升级后续版本(例如v11+)中的pysaml2来修复此问题。易受攻击的版本没有使用--insecure;该错误是缺少限制选项。

利用代码

利用代码在cve-2021-21239.py中实现。此Python脚本自动化了伪造SAML响应的过程,以利用Redash <=10.1.0中的CVE-2021-21239漏洞,通过JIT配置实现用户模拟和权限提升。该利用针对Google Workspace SAML IdP,但该攻击已在其他IdP(keycloak)上测试过。脚本执行以下步骤:

  1. 解析命令行参数:接受SAML模板文件、Redash URL、IdP ID、断言ID、电子邮件、名字和姓氏的输入,并提供测试默认值(例如,email="[email protected]")。
  2. 解析IdP ID:如果未提供,则从Redash的SAML登录端点获取idpid,确保与目标配置兼容。
  3. 填充XML模板:使用一个模板(SAMLResponseTempalte.xml),其中包含用于电子邮件、姓名、时间戳和断言ID的占位符。生成动态的UTC时间戳,具有5分钟的有效期窗口,以通过Redash的验证。
  4. 生成RSA密钥对:创建一个2048位的RSA私钥,用于对SAML断言进行签名。
  5. 对XML进行签名:使用xmlsec Python库对<saml:Assertion>元素进行RSA-SHA256签名,并将公钥嵌入<ds:RSAKeyValue>以利用该漏洞。
  6. 验证签名:验证签名,确保伪造的SAML响应在结构上有效。
  7. 发送SAMLResponse:对签名后的XML进行Base64编码和URL编码,发送到Redash的SAML回调端点(/saml/callback?org_slug=default)。
  8. 提取会话Cookie:从响应中获取会话cookie,允许攻击者模拟目标用户。
  9. 列出用户:获取Redash用户列表及其组成员身份。这允许识别和定位管理员用户。

利用的困难及绕过方法

利用CVE-2021-21239需要构造一个Redash通过JIT配置接受的伪造SAML响应。关键困难及绕过方法:

  • 签名验证绕过:Pysaml2允许嵌入密钥,通过生成RSA密钥对并将公钥嵌入<ds:RSAKeyValue>,使用私钥签名来绕过。
  • XML签名挑战:最初使用xmlsec1二进制文件可行,但Python xmlsec库由于空白/规范化问题导致摘要不匹配。通过在签名前将XML序列化为单行(etree.tostring(..., pretty_print=False))来绕过。
  • 时间戳验证:过远的NotOnOrAfter导致拒绝;通过使用具有5分钟有效期的动态UTC时间戳来绕过。
  • HTTP头不匹配:Requests库对SAMLResponse进行了双重编码,导致解析失败;通过发送原始表单数据来绕过。
  • Redash设置:本地Redash需要Ngrok与Google的IdP通信;通过使用Ngrok进行隧道并相应配置SAML来绕过。

这些挑战凸显了精确的XML操作和环境设置对于有效利用该漏洞的必要性。提供的利用代码成功演示了这一点,伪造SAML响应以模拟用户并获得访问权限。

下载工具