
CVE-2023-43804 urllib3 쿠키 유출을 교차 출처 리다이렉트를 통해 재현하는 컨테이너화된 3계층 랩으로, 익스플로잇 스크립트와 패치 검증을 포함합니다.
이 저장소는 CVE-2023-43804(교차 출처 리다이렉트 중 발생하는 urllib3 쿠키 유출)를 시연하고, 악용하고, 수정 사항을 검증하기 위한 완전히 컨테이너화된 3계층 실습 환경을 포함합니다.
이 실습은 Docker Compose를 사용하여 오케스트레이션되며, 내부 브리지 네트워크를 통해 통신하는 세 개의 격리된 서비스로 구성됩니다:
victim_client: 재현 및 익스플로잇 스크립트(exploit.py)를 실행하는 Python 기반 컨테이너.target_app: 외부 출처로의 HTTP 302 교차 출처 리다이렉트를 트리거하는 취약한 대상 서버를 시뮬레이션하는 Flask 웹 애플리케이션.attacker_app: 수신되는 HTTP 요청을 캡처하고 유출된 헤더를 추출하도록 설계된 Flask 로깅 서버.git clone [https://github.com/deepanshu-khurana/cve-2023-43804-lab.git](https://github.com/deepanshu-khurana/cve-2023-43804-lab.git)
cd cve-2023-43804-lab
docker compose up -d --build
docker compose up -d
docker compose down --volumes
CVE-2023-43804)urllib3< 1.26.17 또는 < 2.0.5urllib3는 서로 다른 출처 간에 HTTP 302 리다이렉트를 따를 때 민감한 인증 헤더(예: Cookie)를 제거하지 못하여, 신뢰할 수 없는 리다이렉트 엔드포인트가 민감한 세션 토큰을 가로챌 수 있게 합니다.urllib3가 설치되어 있는지 확인합니다:docker exec -it victim_client pip install urllib3==1.26.16
docker exec -it victim_client python3 -u /lab/exploit.py
"status": "EXFILTRATED"가 표시됩니다.docker logs attacker_app에 캡처된 민감한 쿠키 헤더가 표시됩니다.익스플로잇을 확인한 후 패치를 검증하려면:
urllib3를 패치된 버전으로 업그레이드합니다:docker exec -it victim_client pip install urllib3==1.26.17
docker exec -it victim_client python3 -u /lab/exploit.py
"status": "SECURE", "stolen_cookie": "None / Stripped"가 표시됩니다.attacker_app 로그에서 수신 요청에 Leaked Cookie Header: None이 포함되어 있음을 확인할 수 있습니다.requirements.txt의 종속성을 업데이트하여 안전한 버전을 적용합니다:urllib3>=1.26.17
Retry 구성에서 remove_headers_on_redirect를 통해 헤더 관리 정책을 명시적으로 구성합니다.victim_client, target_app, attacker_app)을 정확히 대상으로 지정해야 합니다. docker ps를 사용하여 활성 컨테이너 이름을 확인하세요.5000과 5001이 다른 로컬 서비스에 의해 점유되지 않았는지 확인하세요.취약한 urllib3==1.26.16에서 실습을 실행하면, 민감한 인증 쿠키가 교차 출처 리다이렉트를 통해 가로채져 공격자 서버에 성공적으로 기록됩니다.
exploit.py가 유출된 세션 토큰과 함께 "status": "EXFILTRATED"를 표시하며, attacker_app 로그 출력으로 검증됨.urllib3를 패치된 버전(1.26.17)으로 업그레이드한 후, 라이브러리는 교차 출처 리다이렉트 중에 민감한 Cookie 헤더를 자동으로 제거합니다.
패치된 버전으로 패키지 업그레이드:

pip install urllib3==1.26.17을 통해 victim_client 내부의 urllib3 업그레이드.보안 클라이언트 출력 및 제거된 로그:

exploit.py가 "stolen_cookie": "None / Stripped"와 함께 "status": "SECURE"를 반환하며, 서버 로그에서 Leaked Cookie Header: None이 확인됨.