SQL 문장의 경계 무너뜨리기
유효한 관리자 비밀번호를 제공받지 않은 외부 사용자 관점에서 Comet StockFlow 로그인 화면을 블랙박스 점검하세요. 브라우저나 로컬 프록시로 자신의 로그인 요청을 관찰하고, 수동 입력만으로 manager 세션이 발급되는지 확인하세요. 성공하면 입력값의 민감한 부분은 가리고 세션 역할과 최종 화면을 증거로 남기세요.
의뢰 배경
코멧 물류는 야간 상하차 현황을 StockFlow 포털에서 관리합니다. 퇴사한 용역 인력의 접속 시각과 겹치는 시간대에 manager 세션이 생성됐지만, 관리자 비밀번호 변경·재설정·정상 로그인 기록은 없었습니다. 오늘 22시 야간 출고를 앞두고 있어, 인증 우회가 재현되면 포털을 즉시 폐쇄하고 수기 승인 절차로 전환해야 합니다.
이번 목표
유효한 관리자 비밀번호 없이 manager 세션을 발급받을 수 있음을 재현하고 인증 우회 증거를 확보하세요.
- 문자열 연결이 입력값과 SQL 문법의 경계를 없애는 과정을 설명한다.
- boolean 조건과 SQL 주석이 인증 쿼리에 미치는 영향을 예측한다.
- prepared statement가 코드와 데이터를 분리하는 이유를 이해한다.
학습 노트 · SQL Injection은 특수문자 자체가 아니라 입력값이 SQL 코드로 재해석되는 경계 실패입니다.
애플리케이션이 username과 password를 SQL 문자열 안에 직접 넣으면 사용자가 입력한 따옴표가 원래 문자열을 끝낼 수 있습니다. 그 뒤에 새로운 조건과 주석을 붙이면 쿼리의 의미가 바뀝니다.
로그인 우회에서는 비밀번호 비교보다 우선하거나 전체 WHERE 절을 참으로 만드는 boolean 표현식을 구성합니다. 주석은 애플리케이션이 뒤에 붙인 따옴표와 조건을 무시하게 할 수 있습니다.
방어는 입력 문자열을 블랙리스트로 지우는 것이 아니라 prepared statement에 값을 별도로 바인딩하는 것입니다. 그러면 따옴표와 연산자는 SQL 문법이 아니라 평범한 데이터로 처리됩니다.
| 입력 실험 | 관찰할 변화 | 학습 의미 |
|---|---|---|
| 정상 사용자 / 틀린 암호 | 로그인 실패 | 기본 쿼리 확인 |
| 따옴표 하나 | SQLite 문법 오류 | 문자열 경계 확인 |
| 항상 참인 OR 조건 | 조건식 의미 변화 | 데이터가 코드가 됨 |
| 주석 추가 | 뒤의 암호 조건 제거 | 남은 쿼리 정리 |
-- 취약한 문자열 연결 결과
SELECT id, username, role
FROM accounts
WHERE username = '$username' AND password = '$password';
-- 방어
SELECT id, username, role
FROM accounts
WHERE username = :username AND password_hash = :password_hash;더 깊이 읽기
실습 전후에 공식 문서와 보안 아카데미 자료로 개념을 교차 확인하세요.
막혔을 때만 열기
다음 단서가 필요할 때만 한 단계씩 확인하세요.
힌트 1 · 쿼리 경계 찾기
username에 따옴표 하나를 넣고 오류 메시지가 SQL 문자열의 어느 위치를 가리키는지 보세요.
힌트 2 · 조건을 참으로 만들기
manager 문자열 뒤에서 OR 연산으로 항상 참인 비교식을 추가하는 형태를 생각하세요.
힌트 3 · 뒤쪽 조건 제거
SQLite의 줄 주석을 사용해 애플리케이션이 덧붙이는 password 비교와 마지막 따옴표를 무시하세요.
선행 의뢰가 잠겨 있습니다
이전 단계를 완료하면 자동으로 의뢰 메일과 실습 환경이 열립니다.