[게시판 실습] - SQL Injection (1) 로그인 시 로그인 검증 우회
[설 명]
SQL Injection은 사용자의 입력 값으로 웹 사이트 SQL 쿼리가 완성되는 약점을 이용하며, 입력값을 변조하여 비정상적인 SQL 쿼리를 조합하거나 실행하는 공격으로 개발자가 생각지 못한 SQL문을 실행하게 함으로써 데이터베이스를 비정상적으로 조작 가능한 공격으로 소스코드에 SQL 쿼리를 입력값으로 받는 함수나 코드를 사용할 경우, 비정상적인 SQL 쿼리로 DBMS 및 데이터를 열람하거나 조작 가능하므로 사용자의 입력 값에 대한 필터링을 구현하여야 한다.
[점검 내용]
웹 페이지 내 SQL Injection 취약점 존재 여부 점검
[점검 기준]
임의의 SQL Query 입력에 대한 검증이 이루어지지 않는 경우 취약
[대응 방법]
* SQL 쿼리에 사용되는 문자열의 유효성을 검증하는 로직 구현
* 특수문자를 사용자 입력 값으로 지정 금지
* Dynamic SQL 구문 사용을 지양하며 파라미터에 문자열 검사 필수 적용
* 시스템에서 제공하는 에러 메시지 및 DBMS에서 제공하는 에러 코드가 노출되지 않도록 예외처리
* Stored Procedure 사용
* 필터링 등 입력값 검증 프로세스는 Client side script가 아닌 Server 페이지로 구현
[진단 과정]
1) 로그인 페이지로 이동 후 로그인창에 각각 ' or '1'='1'# / 1 입력 후 로그인을 시도하였습니다.
2) 로그인에 성공함을 확인하였습니다.
3) 게시판 메뉴로 이동 후 게시글 작성 시 게시글 작성이 가능함을 확인하였습니다.
4) 이번에는 아이디 입력창이 아닌 패스워드 입력창에 SQL Query 구문을 입력하여 인증을 우회하도록 하겠습니다. 아이디에 admin 입력 후 패스워드 입력창에 ' or '1'='1'#이라는 값을 입력하여 로그인을 시도했습니다.
5) 'admin' 계정으로 로그인이 성공했습니다. 'admin' 계정으로 로그인 시 관리자 게시판 메뉴가 활성화되며 접속 시 회원 정보가 노출됨을 확인하였습니다.
6) 또한 관리자(admin)가 작성한 게시글의 수정 및 삭제가 가능함을 확인하였습니다.
7) 소스코드 확인 시 로그인 시 userID와 userPW 값을 입력받는데 이 때 해당 입력 값을 SQL 쿼리에 포함시키고 있습니다. 이를 통하여 악의적인 사용자가 입력 필드에 SQL 코드를 삽입하여 로그인 인증을 할 수 있습니다.
8) PreparesStatement를 사용하여 userID와 userPW 값을 직접 SQL 쿼리에 포함시키는 것을 방지하였습니다. 소스코드 수정 후 다시 한번 로그인을 시도해 보겠습니다.
9) SQL Injection 공격을 통해 로그인 인증 우회 시도 시 '데이터베이스 오류가 발생하였습니다'는 메시지가 출력되며 더 이상 로그인 인증이 우회되지 않음을 확인하였습니다.(해당 메시지는 실습을 위하여 기존 로그인 실패 시 메시지와 다르게 출력하였습니다.)
10) 또한 기존 쿼리문과 비교 시 더이상 입력 값을 쿼리에 포함시키지 않는 것도 확인하였습니다.