[PortSwigger] SQL injection vulnerability allowing login bypass
목표
로그인 기능에 포함된 SQL Injection을 이용하여
관리자 계정(administrator)으로 로그인
분석
메인화면 우측 상단에
메인 화면으로 가는 기능과
로그인 기능이 존재
ID로는 Username을 사용하고
Password를 입력하여 로그인
잘못된 Username 또는 Password 입력 시
로그인 불가 메시지 출력
과정
관리자 계정(administrator)와
로그인을 위한 SQL Injection 쿼리(' or 1=1--) 입력
[ 'or 1=1-- ]
Username 뒤에 항상 참인 값(1=1)을 지정하고
주석처리(--)을 통해 Password의 SQL 처리를 제외
SQL Injection으로 인해
관리자 계정으로 로그인 성공
취약점
해당 웹 페이지에는 SQL Injection 취약점이 존재하며
로그인 시 입력갑에 대한 필터링 검증이 부재하여
로그인 기능 이용/사용 시 SQL 쿼리 삽입 및 실행이 가능하며
이로 인해 공격자는 관리자의 인증정보 획득 및 계정 탈취 가능
대응 방법
SQL Injetcion 취약점은
외부 입력이나 외부 변수로부터 받은 값이 직접 SQL 함수의 인자로 전달되거나,
문자열 복사를 통하여 전달되는 것은 위험하므로 인자화된 질의문을 사용해야 함
소스코드에 SQL 쿼리를 입력 값으로 받는 함수나 코드를 사용할 경우,
임의의 SQL 쿼리 입력에 대한 검증 로직을 구현하여
서버에 검증되지 않는 SQL 쿼리 요청 시
에러 페이지가 아닌 정상 페이지가 반환되도록 필터링 처리하고
웹 방화벽에 SQL 인젝션 관련 룰셋을 적용하여 SQL 인젝션 공격을 차단
아래와 같은 특수문자를 사용자 입력 값으로 지정 금지
(사용 DB에 따라 변동 가능)
문자 | 설명 |
' | 문자 데이터 구분기호 |
; | 쿼리 구분 기호 |
--, # | 해당 라인 주석 구분 기호 |
/* */ | *와 */ 사이 구문 주석 |
※ 검증 로직 구현 시 웹 서비스에서 사용하고 있는 명령어 및 특수문자가
필터링 되어 장애가 발생할 수 있음