[목차]

 

 

1. 이 문서는 어떻게 작성되었는가?

2. SQL Injection 이 무엇인가?

3. 왜 SQL Injection 인가?

4. SQL Injection 이 아직도 먹히는 사이트가 있나?

5. 왜 SQL Injection 은 어려운가?

6. 어떻게 공부해야 하는가?

 

 

출처 : rubiya 님의 해커스쿨 강좌

https://www.hackerschool.org/Sub_Html/HS_Posting/?uid=42

 

 

 

 


 

 

 

 

1. 이 문서는 어떻게 작성되었는가?

LeaveRet 소속의 rubiya 가 SQL injection 기법을 익히기를 희망하는 해커, 개발자들을 위해서 작성했다. 이 문서는 SQL Injection에 대한 기술적인 지식보다는 입문자를 위한 유익한 내용에 대해서 다룰 것이다. rubiya805@gmail.com으로 그에게 연락할 수 있다.

 

 

 

2. SQL Injection 이 무엇인가?

SQL Injection은 1998 년에 phrack에 기법이 소개된 이후로 언제나 owasp 상위권을 차지하고 있으며 수많은 웹사이트에서 수많은 개인 정보를 유출하는데 사용된, 사용되고 있는 기법이다.

 

 

 

3. 왜 SQL Injection 인가?

SQL Injection의 가장 큰 특징은 데이터베이스를 공격한다는 것이다. 여타의 해킹 기법은 서버사이드 언어가 작동하는 서버 혹은 서버에서 데이터를 받는 클라이언트를 공격하는 기법이다. 이는 개발자가 보안의식이 있는 사람일 경우 서버사이드에서 간단한 필터링을 통해서 쉽게 방어할 수 있다. 그러나 데이터베이스는 서버사이드 언어와는 구분된 한 개의 프로그램이다. 데이터베이스 자체에서 SQL Injection 을 방어하는 것은 어렵고 비효율적인 작업이기에 개발자는 데이터베이스에 가해지는 공격을 서버사이드에서 방어해야 한다. 이것이 SQL Injection이 십수 년간 유용한 공격 기법으로 거론되고, 사용된 이유이다.

 

 

 

4. SQL Injection 이 아직도 먹히는 사이트가 있나?

SQL Injection 이 공개된 지 워낙 오래되었고 잘 알려진 기법이기에 사장된 공격 기법으로 착각하는 사람들이 많다. 많은 개발자들이 싱글 쿼터 (') 앞에 백슬래시를 붙이는 것, 혹은 magic_quotes_gpc = on으로 설정해두는 것으로 SQL Injection에 대한 모든 방어를 끝내는데, php, mysql 환경에서 이를 우회하는 방법에 대해서 다루겠다. 아래의 예제를 보고 공격 문구를 이해하려 노력하기보다는 완전한 보안이란 존재하지 않는다는 사실을 체감해보길 바란다.

 

사용자가 입력한 varchar형의 변수를 데이터베이스에 날릴 경우에는

[select * from table where id='asdf'] 와 같이 싱글 쿼터로 변수가 묶이기에 위의 방법으로 방어가 되지만,

(사실 우회하는 방법이 있다. 아래에서 서술하겠다.)

 

int형의 변수는

[select * from table where no=123] 와 같이 싱글 쿼터로 묶지 않는다.

여기서 [123]이라는 값이 아니라 [123 union select 1,2,3]처럼 악의적인 값을 입력할 경우에 싱글 쿼터를 필터링한다는 방어 방법은 아무런 장애도 되지 않고 쿼리는 성공적으로 변조된다.

 

varchar형의 변수를 사용한다고 안전한 것도 아니다.

[1' or 1=1#] => [1\' or 1=1#] 위의 예제처럼 싱글 쿼터 앞에 백슬래시가 붙여진다고 가정해보자.

SQL Injection 공격을 성공적으로 방어한 것처럼 보인다. 그런데 멀티 바이트를 사용하는 언어셋 환경에서는 백슬래시 앞에 %a1 ~ %fe의 값이 들어오면 %a1\ 가 한 개의 문자처럼 취급되면서 백슬래시를 먹어버린다. [1%a1' or 1=1#] => [1%a1\' or 1=1#] => [1?'or 1=1#] 안전하다고 생각했던 방어 방법이 우회된 것이다.

 

멀티바이트를 사용하지 않는 언어셋도 안전하지 않다.

[insert into member where values('guest','123','qwe')]라는 쿼리가 있다고 해보자.

 

[guest']를 입력하면 php 단에서는 이 값을 [guest\']로 변경한 후에 mysql에 날려줌으로써 쿼리에 영향을 끼치지 못하도록 할 것이다. 그런데 mysql에서 직접 값을 조회하면 (외의이지만 조금만 생각해 보면 당연하게도) [guest']라는 값이 들어가 있다. 이제 [guest']라는 계정으로 로그인을 한다면 내 아이디는 [guest'] 가 된다. 여기서 로그를 본다든지 하는 행동을 위해 쿼리에 아이디를 직접 넣는 코드가 있다면? 이번에는 [guest']라는 값이 쿼리에 영향을 끼치게 될 것이다. 자, 아직도 SQL Injection 을 방어하는 게 쉽다고 느껴지는가? :)

 

 

 

5. 왜 SQL Injection 은 어려운가?

많은 뉴비들은 xss, 쿠키 변조와 같은 간단한 기법들을 익히며 웹 해킹을 시작하게 된다. 이런 기법들은 자바스크립트, 서버사이드 언어에 숙달되지 않아도 공격하는 데에 큰 지장이 없으며 이는 명확하지 않은 공부를 하게 되는 원인이 된다. 명확하지 않은 공부란 해당 공격 기법, 배경지식을 완전하지 않게 이해하고 넘어가는 것을 칭한다. 이런 식으로 공부할 경우에 머릿속에서는 단지 대략적이고 희뿌연 지식만이 쌓일 뿐이다. 다른 기법에 어느 정도 숙달되었다는 생각이 들면 SQL Injection 공부를 시작하는데 여기서 문제가 생긴다. 위에서 서술했듯이 SQL Injection은 클라이언트에서 서버사이드를 거쳐서 데이터베이스를 공격하는, 쉽게 말해 한 단계를 건너서 공격하는 기법이다. 데이터베이스에 대한 완전하고 숙달된 지식이 없이 SQL Injection 공격을 익히려고 해봤자 우리가 볼 수 없는 서버사이드 언어와 데이터베이스 사이의 통신을 예측하고 변조할 수가 없는 것이다. 여기서 많은 뉴비들이 자괴감에 휩싸이며 해킹 공부를 포기하게 된다.

 

 

 

6. 어떻게 공부해야 하는가?

당신에게는 서버사이드 언어와 데이터베이스에 대한 숙달된 지식이 필요하다. 이를 익히는 가장 좋은 방법은 게시판을 하나 만들어보는 것이다. 글을 작성하고, 수정하고, 삭제하는 기능이 있는 게시판을 만들면서 다양한 쿼리를 공부하고, 이에 숙련될 수 있게 해준다. 그 후에는 grayhash의 oldzombie 님이 운영하는 http://webhacking.kr/ 을 풀어보는 것을 추천한다. 이 사이트는 다양한 SQL Injection 기법을 다루고 있다. http://webhacking.kr/에서 제공되는 모든 문제를 풀었다고 공부를 끝내도 되는 것은 아니다. SQL Injection 이 공개된 지 16년이 지났지만 아직도 SQL Injection의 새로운 공격 방법이 꾸준히 발표되고 있다. 빠르게 발전하는 추세를 따라잡기 위해서는 국내에서 안주하지 않고 해외의 문서들을 찾아보고, 콘퍼런스에 참가하는 등의 지속적인 노력이 필요하다.

 

 

 

 

[마침]

이 문서가 방향을 잡지 못하던 당신에게 작게나마 도움이 되었기를 바라며 글을 마친다.

 

728x90

+ Recent posts