📘 Day 19 (2025.07.14.MON) - 무차별 공격으로 로그인 기능 막기(PDO), 간편 로그인 구현하기
📝 개요
word, gnu - 설치하면 바로 사용 가능(CMS, Contents Management System)
dvwa - 웹해킹을 연습할 수 있도록 만든 사이트
💾 무차별 공격으로 로그인 기능 막기
workbench - 아무 Query에서 내용 복붙하고 번개 누르기
CREATE TABLE users (
id int(6) not null auto_increment,
fisrt_name varchar(15),
last_name varchar(15),
username varchar(15), //스프링에서는 ID는 무조건 username으로 해야함
password varchar(32),
avatar varchar(70),
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
failed_login INT(3),
PRIMARY KEY (id)
);
🛠️ 데이터베이스에서 데이터 찾기 (로그인 되나 안전하지 않음)
- 데이터베이스에서 데이터 찾기(로그인 되나 안전하지 않음) -
▲ users 우클릭 - Select Rows - 데이터 넣어주기 - Apply
▲ auth/auth.php
▲ includes/db.php
🔑 쿠키 생성
auth/auth.php
▲ 로그인
▲ 로그아웃
⏳ 로그인 실패 시 시간차 주기 (해커가 무차별 공격 못하게 하기)
로그인 실패 시 시간차 주기(해커가 무차별 공격 못하게 하기)
▲ sleep(rand(0,3)); -> 해커가 공격하지 못하게 랜덤으로 돌리기
⚠️ impossible 코드
▲ 횟수와 시간(3번까지 4번째부터는 3분간 락상태 유지)
▲ workbench에서 failed_login 3으로 수정해주면 lock 상태 출력됨
▲ strtotime:데이터베이스에서 가져온 날짜 문자열을 유닉스 타임스탬프로 변환
▲ time:현재 시간을 유닉스 타임스탬프 형식으로 가져옴
▲ lock 상태에서 계속 공격하면 시간은 계속 늘어남
▲ failed_login 자동으로 0으로 초기화
🔍 로그인 알고리즘
- 아이디만(비밀번호 필요x) 조회해서 lock여부 확인(데이터를 가져와서 failed_login이 total 로그인보다 크면 lock)
- last_login 최근에 언제 갱신됐는지 확인(실패 시 최근 로그인 시간 +3)
- 아이디와 비밀번호 조회(로그인 실패횟수 : 0 초기화, 로그인 실패 횟수 +1)
- 로그인 시간 현재시간으로 변경
- lockout_time * 60하면 분이 나옴
- timenow가 timeout보다 작으면 lock 상태로 유지되야함(기본 false -> true해야 lock이 유지됨)
- PDO가 왜 impossible 코드인가?
▲ 로그인 전 데이터베이스 상태
▲ 로그인 1번 실패
▲ 로그인 1번 실패 데이터베이스 상태
▲ 로그인 2번 실패 데이터베이스 상태
▲ 로그인 3번 실패 데이터베이스 상태
▲ 로그인 4번 실패
▲ 로그인 4번 실패 데이터베이스 상태
🛡️ PDO(impossible 코드)
- 공격이 거의 불가능해짐
- 요즘 추세는 binParam으로 바뀌고 있음(PDO)
- Win7 -
- $db(객체) 찾아야함
Editplus - dvwa/includes/dvwaPage.inc.php - 565~577행
PC db.php에 붙여넣기
dvwa/includes/DBMS/MySQL.php
▲ bindParam이 아니면 실행이 안됨
▲ 문자 데이터 형태와 입력한 데이터 형태가 일치해야 실행됨