33.jpg
55.jpg

KAIST부설 한국과학영재학교 온라인 과학매거진 코스모스

  • 블랙 페이스 북 아이콘
  • 블랙 인스 타 그램 아이콘

SQL Injection

매년 OWASP(Open Web Application Security Project)에서는 OWASP Top 10이라는 웹 보안을 위협하는 10개의 주요한 보안 취약점 목록을 발표합니다. 아래 목록만 보더라도 SQL Injection이 얼마나 강력한 것인지를 알 수 있습니다.

OWASP TOP 10 2007-2017. Injection 취약점은 꾸준히 상위권을 유지하고 있다.
SQL?

SQL Injection에 대해 알아보기 전에, SQL이 무엇인지 알아봅시다. SQL은 웹 서버에서 데이터를 저장하는 장소인 데이터베이스를 다루는 언어입니다.

어느 사이트에서 사용자 정보를 저장하는 데이터베이스를 구축하려 합니다. 그렇다면 사이트에서는 사용자 번호(NUM), 이름(NAME), ID, 비밀번호(PASSWORD), 전화번호(TEL) 등의 정보를 저장하는 표를 만들게 됩니다.

데이터베이스 테이블

이 중 NUM=1인 사용자 이름을 얻으려면 ‘Select NAME from user where NUM=1’이라는 SQL 쿼리를 입력해야 합니다.


이렇게 우리가 웹 브라우저를 통해 서버에 어떤 정보를 요구하면, 이 명령은 웹 서버를 거쳐 데이터베이스에 전달되고, 그 결과는 다시 우리에게 전달되는 구조로 작동합니다.

클라이언트-서버-데이터베이스


SQL Injection?
로그인 창

위와 같은 로그인 창을 생각해봅시다. 우리가 로그인 창에 위와 같이 아이디와 비밀번호를 입력했다고 하면,

id=’test’ password=’1234’

입력값은 다음과 같은 SQL 쿼리에 삽입되어 처리됩니다.

이 SQL 쿼리를 받은 데이터베이스는 테이블에 ‘test’라는 아이디가 있는지 검색한 다음, 존재한다면 비밀번호가 일치하는지 확인한 후 로그인을 허락합니다.


해커들은 여기서 재미난 생각을 떠올렸습니다. “우리가 입력한 아이디와 비밀번호가 그대로 SQL 쿼리에 삽입된다면, 이걸로 쿼리를 변형시킬 수도 있지 않을까?”



이렇게 입력하면 어떻게 될까요?

id=’admin’ password=’1’or’1=1’

이렇게 되면 비밀번호를 인증하는 과정을 ‘1=1’이라는 버그를 발생시킴으로써 건너뛰어서 관리자 계정으로 로그인이 됩니다. 관리자 권한을 탈취하면 데이터베이스에 저장되어 있는 여러 정보를 보고, 편집할 수 있기 때문에 사실 웹사이트를 탈취했다고 할 수 있습니다.


여기서 궁금해지는 것이 하나 있습니다. 관리자 아이디 ’admin’ 은 어떻게 알아낸 건가요?


네, 그냥 찍는 겁니다. 많은 사이트에서는 ‘administrator’를 줄인 ‘admin’을 관리자 계정의 아이디로 사용하고 있기 때문에 ‘admin’을 관리자 계정의 아이디라고 생각하면 됩니다. 그렇다면 관리자 아이디가 ‘admin’이 아닌 경우에는 어떻게 해야 할까요? 제가 참고한 책에서는 웹사이트에 회원가입을 하면서 중복 ID 체크를 해서 알아내거나(…), 주로 웹사이트 하단에 있는 운영자 메일의 아이디를 넣어보라고 했습니다. 모든 방법을 다 써봤는데 모두 실패한다면요? 별 거 없습니다. 안 되면 될 때까지 하는 겁니다!


직접 해보자

SQL Injection은 로그인 과정 뿐만 아니라 데이터 조회에서도 일반적으로 접근 불가능한 정보를 조회할 수 있게 해줍니다. OWASP WebGoat라는 것을 이용해서 실습해봅시다.

내 이름을 써보았다.

위의 사진은 last name(이름)을 입력하면 고객 정보를 조회할 수 있게 해주는 데이터베이스를 나타내고 있습니다. 제 이름은 목록에 없나 봅니다.

J. Smith 씨의 카드정보

위에 쓰여져 있는 대로 ‘Smith’라고 입력하니 존 스미스 씨의 카드 정보를 알 수 있었습니다. 이름만 입력하면 카드번호를 알 수 있다니, 이것만으로도 충분히 문제가 있지만 우리의 목표는 더 큽니다. 우리는 이용자 전원의 카드번호를 알아낼 겁니다!

Smith라고 입력하면 위와 같이 데이터베이스는 입력값을 작은따옴표로 둘러싸서 SQL 쿼리에 삽입합니다.

앞에서 배운대로 ‘1’ or ‘1=1’을 만들려면, 양 쪽의 따옴표를 빼고 1’ or ‘1=1이라고 입력하면 되겠군요.

성공!

이제 SQL Injection이 좀 무섭게 느껴지지 않나요? 여러분의 정보 또한 안전하지 않을지도 모릅니다.


Injection으로부터 보호하기

SQL Injection은 단순한 만큼 파훼하기도 쉽습니다. 특수문자를 입력하지 못하게 제한하면 됩니다. 그러면 외부에서 SQL 쿼리를 조작할 수 없게 되므로 Injection을 사용할 수 없게 됩니다.


악용하지 마라!
잡았다, 요놈!

지금까지 SQL Injection에 대해서 간단히 알아봤습니다. 이제 여러분들은 보안이 허술한 몇몇 사이트는 간단히 뚫을 수 있습니다. 할 줄 안다고 해서, 직접 하진 마세요! 정당한 접근권한 없이 또는 허용된 접근권한을 넘어 정보통신망에 침입한 사람은 5년 이하의 징역 또는 5천만원 이하의 벌금에 처해집니다(「정보통신망 이용촉진 및 정보보호 등에 관한 법률」 제71조제1항제9호). 또한, 해킹은 미수범까지 처벌합니다(「정보통신망 이용촉진 및 정보보호 등에 관한 법률」 제71조제11항). 그러니 재미로라도 시도도 하지 마세요! 한 방에 훅 갈 수 있답니다…


이 재밌는 걸 배웠는데, 써먹을 곳이 없다고요? 답답한 여러분들을 위해 여러 모의해킹 사이트들이 기다리고 있습니다. 손이 근질거린다면 Portswigger, https://webhacking.kr/ 같은 사이트에서 실력을 키워보세요!


 

박찬 | Mathematics & Computer Sci. | 지식더하기


참고자료

[1] 최경철, 웹, 해킹과 방어. 프리렉, 2008.


첨부 이미지 출처

[1] https://www.incibe-cert.es/sites/default/files/blog/OWASP/tablaowasp.png

[2] https://t1.daumcdn.net/news/202105/25/mk_cv/20210525064059440aqea.jpg

[3] https://portswigger.net/


ⓒ KAIST부설 한국과학영재학교 온라인 과학매거진 KOSMOS

조회수 4회댓글 0개

최근 게시물

전체 보기