
Python 3로 작성된 CVE-2019-9053 교육용 PoC로, CMS Made Simple <= 2.2.9에서 발생하는 time-based blind SQL Injection입니다. 이 버전은 CTF/실습 환경에서 사용하도록 조정되었으며, 추출 시간을 줄이기 위한 사전 구성된 접두사와 포르투갈어 설명 메시지가 포함되어 있습니다.
Python 3 기반의 교육용 PoC로, CMS Made Simple <= 2.2.9에서 발견된 time-based blind SQL Injection 취약점(CVE-2019-9053)을 위한 익스플로잇입니다.
이 버전은 CTF/실습 환경에서 사용할 수 있도록 수정되었습니다. 추출 시간을 단축하기 위해 미리 구성된 접두사(prefix)와 학생들이 익스플로잇 작동 방식을 이해하는 데 도움이 되는 포르투갈어 설명 메시지가 포함되어 있습니다.
이 프로젝트는 교육 목적, 통제된 실습 환경 및 CTF 환경에서만 사용하도록 설계되었습니다.
명시적인 허가 없이 타사 시스템에 이 코드를 사용하지 마십시오.
이 저장소의 작성자는 이 자료의 부적절한 사용에 대해 책임을 지지 않습니다.
CVE-2019-9053은 CMS Made Simple의 구버전에 영향을 미치며, 다음 엔드포인트에서 m1_idlist 매개변수를 통해 인증되지 않은 SQL Injection을 허용합니다.
/moduleinterface.php?mact=News,m1_,default,0
SQL 쿼리 결과가 페이지에 직접 표시되지 않기 때문에, 익스플로잇은 time-based blind SQL Injection이라는 기술을 사용합니다.
익스플로잇은 조건이 참일 때 데이터베이스가 sleep(1)을 실행하도록 하는 페이로드를 전송합니다.
개념적 예:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
서버의 응답이 지연되면 스크립트는 테스트 중인 접두사가 올바르다고 판단합니다.
이런 방식으로 비밀번호 솔트, 사용자 이름, 이메일, 비밀번호 해시와 같은 중요한 정보를 한 문자씩 복원합니다.
이 CTF 버전에서는 활동 중 필요한 시간을 줄이기 위해 일부 접두사가 코드에 이미 포함되어 있습니다.
SQL Injection은 애플리케이션이 사용자 제어 데이터를 적절한 처리 없이 SQL 쿼리에 삽입할 때 발생합니다.
이 경우, 쿼리 결과가 HTTP 응답에 직접 나타나지 않기 때문에 blind 인젝션입니다.
time-based인 이유는 공격자가 서버 응답 시간을 응답 채널로 사용하기 때문입니다. 테스트 조건이 참이면 데이터베이스가 sleep()을 사용하여 지연을 실행합니다. 거짓이면 응답이 정상적으로 돌아옵니다.
단순화된 예:
익스플로잇이 묻는 질문:
"비밀번호 해시가 0c01로 시작합니까?"
만약 그렇다면:
데이터베이스가 sleep(1)을 실행하여 응답이 지연됩니다.
그렇지 않다면:
응답이 눈에 띄는 지연 없이 돌아옵니다.
이 과정을 문자별로 반복함으로써 익스플로잇은 페이지에서 직접 볼 수 없더라도 데이터베이스 값을 재구성할 수 있습니다.
솔트는 해시를 생성하기 전에 비밀번호와 함께 사용되는 추가 값입니다.
이 챌린지에서 CMS Made Simple은 다음과 유사한 로직을 사용합니다.
md5(salt + password)
예:
salt = 1dac0d92e9fa6bb2
password = exemplo123
해시는 다음으로부터 계산됩니다.
1dac0d92e9fa6bb2exemplo123
솔트는 사전 계산된 테이블을 사용한 공격을 어렵게 하고, 동일한 비밀번호가 다른 컨텍스트에서 다른 해시를 생성하도록 하는 역할을 합니다.
그럼에도 불구하고 md5(salt + password)는 오래되고 취약한 비밀번호 저장 방식입니다. 현대 시스템은 다음과 같은 비밀번호 전용 알고리즘을 사용해야 합니다.
이 버전은 실습 활동에서 사용하기 쉽도록 조정되었습니다.
주요 변경 사항:
챌린지에 사용된 값:
전체 솔트: 1dac0d92e9fa6bb2
사용자 이름: mitch
이메일: [email protected]
전체 해시: 0c01f4468bd75d7a84c7eb73846e8d96
익스플로잇에 구성된 접두사:
솔트 접두사: 1dac0d92
사용자 이름 접두사: mit
이메일 접두사: admin@
해시 접두사: 0c01f446
이 접두사는 공격 로직을 제거하지 않습니다. 단지 실습 활동에 필요한 시간을 줄여줍니다.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
저장소를 클론합니다:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
가상 환경을 만듭니다:
python3 -m venv .venv
가상 환경을 활성화합니다:
source .venv/bin/activate
의존성을 설치합니다:
pip install -r requirements.txt
requirements.txt 파일에는 다음이 포함되어야 합니다:
requests
termcolor
간단한 실행:
python3 exploit_ctf.py -u http://target/cms
단어 목록을 사용한 비밀번호 크래킹 시도 포함 실행:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
스크립트 도움말 보기:
python3 exploit_ctf.py -h
wordlist-example.txt 파일에는 다음이 포함될 수 있습니다:
wrongpassword
admin123
dieema123
password
123456
[+] 비밀번호 솔트 발견: 1dac0d92e9fa6bb2
[+] 사용자 이름 발견: mitch
[+] 이메일 발견: [email protected]
[+] 비밀번호 해시 발견: 0c01f4468bd75d7a84c7eb73846e8d96
[+] 비밀번호 발견: dieema123
익스플로잇이 솔트와 비밀번호 해시를 추출한 후, 단어 목록을 사용하여 평문 비밀번호를 찾으려 시도할 수 있습니다.
테스트 로직은 다음과 같습니다:
md5(salt + 후보_비밀번호)
단어 목록의 각 비밀번호에 대해 스크립트는 해시를 계산하고 데이터베이스에서 추출한 해시와 비교합니다.
개념적 예:
후보_해시 = md5("1dac0d92e9fa6bb2" + "dieema123")
결과가 추출된 해시와 같으면 비밀번호가 발견된 것입니다.
Time-based SQL Injection은 일반적으로 느립니다. 각 문자를 여러 요청으로 테스트해야 하기 때문입니다.
이 버전은 다음을 사용하여 시간을 단축합니다:
그럼에도 불구하고 시간은 다음에 따라 달라질 수 있습니다:
TIME_DELAY에 설정된 값.위양성 또는 위음성이 많이 발생하면 코드에서 TIME_DELAY 값을 늘리십시오.
Derick G. Andrighetti가 CTF용으로 수정한 Python 3 버전.
원래 Certimeter Group의 Daniele Scanu가 공개한 Python 2 기반의 오래된 공개 PoC를 기반으로 합니다.
교육용.
이 자료는 학습, 실습 데모 및 CTF 활동을 위해 제작되었습니다.