SQL Injection

김하영·2023년 6월 23일

데이터베이스

목록 보기
2/3

SQL Injection이란?

해커에 의해 조작된 SQL 쿼리 문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법

공격 방법

1. 인증 우회

보통 로그인을 할 때, 아이디와 비밀번호를 input창에 입력하게 된다.

SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";

sql injection으로 공격할때, input 창에 비밀번호를 입력함과 동시에 다른 쿼리문으르 입력하는 것이다!

1234; DELETE * USER FROM ID = "1";

보안이 완벽하지 않은 경우, 비밀번호와 아이디가 일치해서 true로 쿼리가 실행되고 뒤에 작성한 DELETE문도 데이터베이스에 영향을 줄 수 있게 되는 치명적인 상황이다!!

이 밖에도 기본 쿼리문의 WHERE절에 OR문으로 '1'='1'과 같은 true문을 작성해서 무조건 쿼리가 적용되도록 수정한 뒤 DB를 마음대로 조작할 수도 있다.

2. 데이터 노출

시스템에서 발생하는 에러 메세지를 이용해서 공격하는 방법이다.

보통 에러는 개발자가 버그를 수정하는 면에서 도움을 주는데, 해커들은 이를 역이용해 악의적인 구문을 삽입해서 에러를 유발시킨다.

예를 들어, 해커는 GET방식으로 동작하는 URL쿼리 스트링을 추가해서 에러를 발생시킨다. 이에 해당하는 오류가 발생하면, 이를 통해 해당 웹앱의 데이터베이스구조를 유추하고 해킹에 활용할 수 있다.

방어 방법

1. input값을 받을 때 특수문자 여부 검사하기

로그인 전, 검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을때, 요청을 막아낸다.

2. SQL 서버 오류 발생시, 해당하는 에러 메세지 감추기

view를 활용하여 원본 데이터베이스 테이블에는 접근 권한을 높인다. 일반 사용자는 view로만 접근하여 에러를 볼 수 없도록 만든다.

3. preparestatement 사용하기

preparestatement를 사용하면, 특수문자를 자동으로 escaping 해준다. (statement와는 다르게 쿼리문에서 전달인자 값을 ?로 받는 것) 이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어한다.

참고자료

https://gyoogle.dev/blog/computer-science/data-base/SQL%20Injection.html

profile
백엔드 개발자로 일하고 싶어요 제발

0개의 댓글