[Write-Up] PortSwigger - SQL Injection Vulnerability Allowing Login Bypass
목차
문제 분석
난이도:
APPRENTICE
Lab: SQL injection vulnerability allowing login bypass
로그인 기능에 SQL Injection 취약점이 존재하며, administrator 계정으로 로그인하면 문제가 해결된다.
SQL Injection 진단
문제 페이지에 접속해 로그인 기능을 확인한다.
로그인 요청은 POST 형식으로 전송되며, 요청은 다음과 같다.
POST /login HTTP/2
Host: <lab-id>.web-security-academy.net
Cookie: session=...
csrf=...&username=user&password=user
username 파라미터에 ' 문자를 입력하면 500 에러가 발생하며, 입력값이 SQL 구문으로 처리되고 있음을 확인할 수 있다.
익스플로잇
로그인 쿼리는 일반적으로 username 과 password 를 함께 검증하는 다음과 같은 형태로 구성된다.
SELECT * FROM users WHERE username = 'administrator' AND password = 'password'
administrator 계정으로 로그인해야 하므로, username 에 다음과 같이 페이로드를 구성한다.
administrator' --
username 을 administrator 로 지정한 뒤 주석(--)으로 뒤에 남는 password 조건을 제거한다.
주입 후 완성되는 쿼리는 다음과 같으며, 비밀번호 검증 없이 administrator 계정으로 인증이 통과된다.
SELECT * FROM users WHERE username = 'administrator' -- ' AND password = 'password'

administrator로 로그인되며 문제가 해결된다.
정리
로그인 우회는 인증 쿼리의 비밀번호 검증 조건을 주석으로 제거해, 아이디만 알면 해당 계정으로 인증을 통과시키는 기법이다.
이러한 취약점은 사용자 입력을 쿼리 문자열에 직접 결합하기 때문에 발생하며, Prepared Statement(파라미터 바인딩)를 사용하면 입력값이 구문이 아닌 데이터로만 처리되어 근본적으로 방어할 수 있다.

