본문 바로가기
개발, IT

SQL 인젝션과 예방

by Nabi™ 2008. 6. 3.

SQL 인젝션은 sql 쿼리문에 개발자가 의도 하지 않은 쿼리 문을 추가하도록 하여 비정상적인 결과를 얻기 위한 해킹 기법이다. 웹페이지 상에서 사용자 로그인 등 폼 입력 부분에서 특수 문자 등을 포함한 SQL 문의 일부 내용을 작성하여 해킹을 시도 한다. 이것은 특히 DB 에서 관리자 권한 등 불필요하게 많은 권한을 가진 계정으로 만들어 진 사이트에서 치명적일 수가 있다. 예를 들어 아래와 같은 코드를 살펴 보자.

Select name from user where id=’id’ and password=’pwd’

웹페이지 사용자 로그인 부분에서 유저아이디와 패스워드를 입력 받아서 위와 같은 sql 쿼리문을 완성 한 다음 쿼리를 실행 하여 리턴 되는 레코드가 있으면 로그인을 성공 시키고, 없으면 로그인 실패로 판단 하도록 하는 로그인 페이지를 구현 하였다고 하자. 개발자가 판단 하기에는 별다른 이상이 없어 보이고, 아무런 결함이 없어 보일 수 있다.
그러나, 악의의 사용자가 웹페이지의 로그인 창에서 다음과 같이 입력 했다고 가정 해 보자.

ID = jayuins’ or ‘1’=’1’--
PASSWORD = abc

그럼 실제로 동작하는 쿼리는 다음과 같이 만들어 질 것이다.

Select name from user where id=’jayuins ’ or ‘1’=’1’ -- and password=’abc’

이제 이 쿼리를 실행 하면 어떻게 될까? 개발자들은 많은 쿼리를 보아 왔으므로 이 결과가 어떻게 나올 것인지 쉽게 예측이 가능 할 것이다. 쿼리문 그대로 보면 ID 만 맞으면 패스워드에 상관 없이 로그인이 된다. -- 는 sql 문에서 주석으로 처리가 되어 뒷부분은 있으나 마나 한 쿼리 문장이 되고 말았다.

아래 경우를 한번 더 살펴 보자.

ID = abc’; DROP Table tbUser; --
위와 같이 쿼리를 작성하면 다음과 같이 되고 말 것이다.

Select name from user where id = ‘abc’; DROP Table tbUser --‘and password=’’

만약 이 쿼리가 sa 와 같은 관리자 계정으로 실행이 된다면 웹 페이지의 로그인을 통해서 중요한 테이블이 삭제 될 수도 있지 않을까?

이와 같은 방법은 현재 많이 알려 져 있기 때문에 이렇게 코딩 된 사이트는 없을 것이다.
그럼 조금 더 강력한 방법으로 SQL 인젝션을 방지하는 방법에 대해서 살펴 보도록 하자.

1.사용자는 어떠한 내용도 입력 할 수 있는 자유가 있다. 예외 적인 방법에 허점을 없는지 항상 주의 깊게 생각 해야 한다. 앞서 얘기 했듯이 사용자의 입력을 믿지 말고 잘못된 사용자 입력 값으로 야기 될 수 있는 문제가 무엇일지 항상 생각 해야 한다.
2.DB 연결 계정은 해당 기능을 사용 할 수 있는 최소한의 권한으로 제한하라. 이렇게 하는 것만이 최선의 보안을 만들 수 있다.
3.입력 데이터의 유효성을 체크 하라. 알파벳이 들어와야 할 자리에 특수문자가 들어온다든가, 숫자 입력이 되어야 할 자리에 숫자 외의 문자가 입력 될 수 있도록 허용하지 말아야 한다. 이것은 사용자에게 실수를 바로 알려 줄 수 있는 친절함을 주는 동시에 보안상 또는 어플리케이션의 비정상 작동에 대비하는 최선의 방법이다. 유효성을 체크하는 방법은 각 개발 언어나 툴 별로 제공 되고 있으니, 이를 참고 하기 바란다.
4.저장 프로시저를 사용 하라. 저장 프로시저를 사용 할 경우, 실수로 사용자 입력에 대한 체크를 놓쳤더라도 SQL 문 자체가 변형 되어 시스템에 심각한 피해를 주는 치명적인 오류는 어느 정도 피할 수 있다.
5.오류에 대한 너무 자세한 결과를 웹에서 나타내지 말라. 개발 과정에서는 오류가 있을 경우 데이터베이스 또는 시스템에서 리턴하는 오류 넘버 및 오류에 대한 자세한 설명을 화면에 뿌리는 경우가 많다. 그렇게 하는 것이 오류를 발견 하기 쉽고 디버깅 하기 편하기 때문이기도 하다. 그러나 서비스를 오픈 했을 경우에는 그러한 오류가 그대로 사용자 화면에 뿌려 지게 하여서는 안된다. 악의적인 공격자로 하여금 보안상 약점과, 침투 할 수 있는 단서를 제공 할 수 있기 때문이다.

이상 다섯 가지만 주의를 한다고 해도, SQL 인젝션에 대한 보호는 충분 하리라고 생각이 된다.

다음 칼럼에서도 계속해서 개발자가 알아야 할 보안 강화를 위한 개발 방법에 대해서 몇 가지 더 살펴 보기로 하고 오늘 칼럼을 마무리 하기로 한다.
모쪼록, 단순한 정보이지만, 실무에서 많은 도움이 되기를 바란다.

좋은정보가 되셨다면 아래 한번 클릭해주세요^^


댓글