
GLPI हिस्ट्री लॉग फ़िल्टर में ब्लाइंड SQL इंजेक्शन के लिए CVE-2026-53629 का PoC
GLPI इतिहास लॉग फ़िल्टर में ब्लाइंड SQL इंजेक्शन। CVE-2026-53629, 11.0.8 और 10.0.26 में ठीक किया गया, 9.4.0 से टूटा हुआ।
इसे किसी भी खाते की आवश्यकता है जिसके पास logs READ अधिकार हो। स्टॉक Read-Only प्रोफ़ाइल के पास यह अधिकार है।
एडवाइज़री: GHSA-cpcj-x335-5cmh लेख: मैंने इसे कैसे खोजा
Log::convertFiltersValuesToSqlCriteria() affected_fields फ़िल्टर को key:operator:values में विभाजित करता है। CVE-2026-29047 के पैच ने ऑपरेटर को मान्य किया और ऐरे इंडेक्स को कास्ट किया, और $key को अकेला छोड़ दिया।
DBmysqlIterator::analyseCrit() OR, AND और NOT को कॉलम नामों के रूप में कोट नहीं करता। यह उनके मानों में पुनरावर्तन करता है, और वह पुनरावर्तन एक अप्रचलित शाखा पर समाप्त होता है जो सादे स्ट्रिंग्स को कच्चे SQL के रूप में लौटा देती है।
इसलिए key के रूप में OR जो चाहें WHERE क्लॉज़ में डाल देता है:
/front/log/export.php?itemtype=Entity&id=0&filter[affected_fields][0]=OR::1 AND sleep(5)
SELECT * FROM `glpi_logs`
WHERE `items_id` = '0' AND `itemtype` = 'Entity'
AND (((((1 AND sleep(5))))))
इतिहास टैब भी filters[affected_fields][0] के माध्यम से ऐसा ही करता है।
explode(',', $values) अल्पविराम वाली किसी भी चीज़ को तोड़ देता है, इसलिए SUBSTRING(s,1,1) और IF(a,b,c) काम नहीं करते। CASE WHEN ... THEN ... ELSE ... END और MID(s FROM n FOR 1) काम करते हैं। कोट्स के बजाय हेक्स लिटरल, 0x676c7069 का अर्थ glpi है।
पेलोड glpi_logs में प्रति पंक्ति एक बार चलता है, इसलिए sleep कई गुना बढ़ जाती है। sleep(5) के साथ छह पंक्तियाँ 30 सेकंड की होती हैं। किसी वास्तविक इंस्टेंस पर इसे 0.1 कर दें, नहीं तो अनुरोध कभी वापस नहीं आएगा।
pip install requests
python3 glpi_sqli_extract.py http://glpi.lab.local -u readonly -p readonly
बाइनरी सर्च द्वारा glpi_users.password को एक-एक कैरेक्टर पढ़ता है। किसी अन्य उपयोगकर्ता के लिए --id, धीमे लक्ष्यों के लिए --sleep और --threshold।
यही तरकीब glpi_configs में api_token, personal_token और SMTP तथा LDAP क्रेडेंशियल्स को पढ़ती है।
अपग्रेड करें। यदि आप नहीं कर सकते, तो उन प्रोफ़ाइलों से logs READ अधिकार हटा दें जिन्हें इसकी आवश्यकता नहीं है। अपस्ट्रीम ने key को allowlist में डाल दिया:
$allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link'];
if (!in_array($key, $allowed_keys, true)) {
continue;
}
यह फिक्स जारी होने के बाद प्रकाशित किया गया है। इसे उन चीज़ों पर न चलाएँ जो आपकी नहीं हैं।