📘 Day 24 (2025.07.19.SAT) - CSRF(1)

🔐 CSRF 기본 개념
- 공격을 막아줌
- form 밑에 자동으로 토큰 삽입
- 토큰을 생성해야 정상 처리
- Django는 CSRF 토큰 없으면 에러 발생
ci4/app/Views/login.php(csrf)

▲ ci4/app/Views/login.php(csrf)

🌐 로그인 페이지에서 토큰 확인

http://ci4.geumsol.kr/auth/login 접속 후, 우클릭 → 페이지 소스 보기

login.php 페이지 소스

▲ login.php 소스 - CSRF 토큰 자동 생성됨

▲ 나를 알리는 토큰값 생성(저 값이 들어와야 패스워드를 바꿀 수 있음)

👤 마이페이지(mypage.php) - 비밀번호 변경 페이지

(low.php → auth/mypage.php)

mypage.php 화면 auth.php 수정

▲ auth.php 수정 내용

🐍 AutoAttack.py 비밀번호 생성 코드 추가 (CSRF 공격 테스트)
AutoAttack.py 수정 코드 AutoAttack.py 일부 코드

▲ AutoAttack.py 수정

※ 외부에서 비밀번호 변경 가능 (비밀번호만 변경 가능 기능)

🛡 Step 1 - 방어 코드 적용
auth.php 수정 AutoAttack.py 수정

▲ auth.php와 AutoAttack.py 수정 (비밀번호 변경 시 새 비밀번호 확인 추가)

🔍 Step 1 결과 확인
AutoAttack.py 실행 결과

▲ AutoAttack.py 실행 화면

🌐 외부에서 테스트 (test.php)
test.php 화면

▲ test.php

AutoAttack.py 실행 화면

▲ AutoAttack.py

AutoAttack.py 실행 화면

▲ AutoAttack.py

⚙ Step 2 - 서버 요청 HTTP_REFERER 체크 활성화

HTTP_REFERER: 이전 페이지 주소 (예: http://geumsol.kr/auth/mypage.php)

PHP stripos 함수로 대소문자 구분 없이 문자열 포함 여부 검사

- !== false : 있다면

auth.php referer 체크 코드

▲ auth.php referer 체크 코드

AutoAttack.py referer 전송

▲ referer를 보내면 다시 공격 성공 (AutoAttack.py)

→ 우리 페이지에 세션 토큰 검사 기능 적용하여 비밀번호 변경 시 토큰이 있어야만 처리하도록 방어 구현 완료