정의
1) 인증 우회
쉽게 이해하기 위해 가벼운 예를 들어보자.
아이디 : abc, 비밀번호 : 1234 일 때 쿼리는 아래와 같은 방식으로 전송될 것이다.
SELECT *
FROM USER
WHERE ID = "abc" AND PASSWORD = "1234";
SELECT *
FROM USER
WHERE ID = "abc" AND PASSWORD = "1234"; DELETE FROM USER WHERE ID = "abc";
보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 되고 뒤에 작성한 DELETE 문도 데이터베이스에 영향을 줄 수도 있게 되는 치명적인 상황이다.
이 밖에도 기본 쿼리문의 WHERE 절에 OR문을 추가하여 '1' = '1' 과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마은대로 조작할 수도 있다.
2) 데이터 노출
시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법이다.
보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있는 존재이다.
해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 유발시킨다.
즉 예를 들면, 해커는 GET 방식으로 동작하는 URL쿼리 스트링을 추가하여 에러를 발생시킨다.
이에 해당하는 오류가 발생하면, 이를 통해 웹앱의 데이터베이스 구조를 유추할 수 있고 해킹에 활용한다.
1) input 값을 받을 때, 특수문자 여부 검사하기
2) SQL 서버 오류 발생 시, 해당하는 에러 메시지 감추기
3) prepareStatement 사용하기
prepareStatemente를 사용하면, 특수문자를 자동으로 escaping 해준다.
prepareStatemente : statemente와는 다르게 쿼리문에서 전달인자 값을 ? 로 받는 것
이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어한다.