07
28

안녕하세요, 한후입니다.

오늘은 앞서 low angle님께서 포스팅해 주신 글을 이어받아 SQL injection에 대해
간단히 알아보는 입문편을 준비해 봤습니다.

입문편답게 그리 딥한 내용을 다루진 않을 것이기 때문에 오늘 글은 가볍게! 읽어주시면 좋을 거 같아요.
그럼 바로 본론으로 들어가 보죠.

 

 

SQL injection이란?

SQL injection을 처음 접하시는 분들은 이게 뭐지? 싶을 겁니다. 그런 분들을 위해 정의 들어갑니다!

 

SQL injection은 SQL + INJECTION으로 쪼개서 보면 개념을 이해하기 쉬워집니다.

 

우선 SQL은 웹 서버가 사용자의 요청을 처리하는 과정에서 데이터를 추가하고, 수정하고, 삭제하는 등의 행위를 

필요로 할 때 DB에게 데이터를 줘! 데이터를 수정해 줘!라고 명령하는 언어입니다.

 

미국 사람에게는 영어로 얘기하고, 한국 사람에게는 한국어로 얘기하듯이 DB와 얘기하기 위해서는 
DB가 알아듣는 언어를 사용해야겠죠? 그게 바로 SQL인 겁니다.

 

그럼 INJECTION은 무엇일까요?? 
말 그대로 무언가를 삽입한다는 뜻인데요, 여기서의 삽입은 정해진 위치에 어떤 데이터를 쏙 넣는 느낌이라 보시면 됩니다.

그럼 SQL을 사용하는 데에 있어 왜 injection이라는 단어가 사용될 수 있는 걸까요?

 

이 부분을 이해하기 위해서는 웹 서버의 동작 방식을 알 필요가 있습니다. 

 

 

동적 페이지

우리는 인터넷을 통해 굉장히 많은 웹 사이트를 사용하고 있습니다. 

그런데 동일한 사이트에 접속한다고 해서 모든 사용자가 같은 페이지를 볼 수 있는 건 아닙니다.

 

예를 들어 학교 포털 사이트에 들어가 로그인하는 경우,

사용자에게 제공되는 페이지는 로그인된 특정 학생에 관한 페이지일 겁니다.

이처럼 페이지를 요청한 사람이 누구냐에 따라 다르게 완성되는 페이지를 동적 페이지라고 합니다.

 

즉 동적 페이지를 만들기 위해선 DB에서 조회하고자 하는 데이터가 한정적입니다.

이를 구현하기 위해 SQL에서는 WHERE문을 사용할 수 있습니다.

 

 

SELECT * FROM student WHERE name='_____';

cookie : name='mario'
SELECT * FROM student WHERE name='mario';

mario가 포털 사이트에 로그인을 하고 나서, 자신의 이름이 들어있는 쿠키와 함께 페이지를 만들어달라고 한다면 

서버에서는 쿠키에 들어있는 mario라는 값을 가져와 빈칸에 넣어 이름이 mario인 데이터만 조회하게 됩니다.

 

그럼 만약에 mario가 아닌 cupa가 요청을 보내면 sql은 어떻게 완성될까요??

 

 

SELECT * FROM student WHERE name='_____';

cookie : name='cupa'
SELECT * FROM student WHERE name='cupa';

아마 이름이 cupa인 데이터를 조회하라는 SQL이 만들어질 겁니다.

이 말은 즉슨 서버가 DB에게 요청하는 SQL은 동일하되, 사용자에 따라 조건에 들어가는 데이터만 달라진다는 의미죠

 

 

그럼 해커의 시점에서 고민해 봅시다.

위에서 본 SQL에서 빈칸에 내 이름이 아닌 다른 사용자의 이름이 들어가도록 만들 수 있다면 
다른 학생의 정보를 얻을 수 있지 않을까요..!?

 

이를 가능케 한다면 우리는 학생 이름을 조작하여 내 정보가 아닌 다른 사람의 정보를 확인할 수 있게 됩니다.

 

이처럼 서버에서 실행하는 SQL을 파악하고 우리가 원하는 값을 넣어 얻고자 하는 결과를 도출해 내는 것이 바로

SQL injection입니다.

 

 

 

그렇다면 여기서 문제! 

SELECT * FROM student WHERE name='__?__';

앞에서 본 SQL을 동일하게 사용하되, student 테이블에 들어있는 모든 학생 데이터를 출력하도록 하려면 

어떤 값을 삽입하면 될까요??

 

 

정답은! 다음 포스트에서 하도록 하겠습니다. ㅋㅋ

 


 

굉장히 간단하고 가볍게 다루려고 하다 보니 정리가 잘 안 된 느낌도 있지만

그런 부분은 차차 보충해 나가도록 하겠습니다.

 

오늘의 포스트가 입문하시는 분들께 조금이나마 도움이 되셨길 바라며

다음 포스트에서 만날 땐 마지막에 드린 문제를 풀어오시기를 바랍니다!! 

 

지금까지 hanhxx였습니다. 감사합니다.

COMMENT