- 다양한 주제에 대해 자유롭게 글을 작성하는 게시판입니다.
Date 17/07/25 00:18:13
Name   Patrick
Subject   재미로 써보는 웹 보안이야기 - 1
부제 : SQL Injection

안녕하세요. 이제 슬슬 학부를 1한기만 남기고 있는 patrick이라고 합니다. 아무래도 글쓰기는 아주 많이 미숙해서 읽으시려면 여러분의 많은 인내심이 필요할 수도 있습니다!

저는 현재 컴퓨터공학부 4학년에 재학중이고, 데프콘이나 다른 해킹대회 본선에 진출할 실력이 있는 것도 아니고, 그냥 단순히 재미로?.. 여러가지 찾아보면서 개인적으로 공부하고 있습니다. 그러다 보니 자세하게는 잘 알지 못하고 그냥 다들 한번쯤 멋있다고 생각 해보셨을 해킹에 대해서 아주 간단하게 소개하고자 합니다. 반응이 괜찮으면 SQL Injection 말고도 XSS라던지, 파일 업로드/다운로드 취약점 이라던지 (제가 현재 배우고있는 부분이 웹해킹 쪽이라 해당 분야만 소개가 가능합니다. 헿….) 차차 글을 쓰도록 하겠습니다.

본론으로 들어가서 SQL Injection이란?

우선 SQL이란 Structured Query Language의 약어로 네이버에 검색해보면 ‘데이터베이스를 사용할 때, 데이터에 접근할 수 있는 데이터베이스 하부 언어를 말한다’ 로 정리되어 있습니다. 쉽게 말해서 우리가 현재 웹에서 작성하는 글이나, 회원정보들이 데이터베이스에 저장되어 있고, 해당 정보를 사용자의 요구에 맞춰서 꺼내기 위해 사용하는 데이터베이스용 언어라고 생각하시면 될 것 같습니다.

Injection은 영어 뜻 그대로 주입이라고 생각하시면 됩니다.

그래서 SQL Injection이란, 쉽게 말해 사용자의 요청에 의해 개발자가 의도한대로 실행되어야 할 SQL 코드가 악의적인 입력으로 인해 해당 SQL 코드가 변질되어 다른 값을 가져오거나 오류를 일으키도록 만드는 공격입니다.



해당 공격을 간단한 예제와 함께 보도록 하겠습니다.

웹 페이지의 로그인기능은 크게 3단계로 프로세스가 진행됩니다.
사용자가 아이디/패스워드 입력 -> 사용자의 입력을 받은 서버가 자신이 가지고있는 정보(데이터 베이스)와 대조 -> 대조한 결과값을 사용자에게 리턴

세가지 단계에서 우리가 조작할 부분은 아이디/패스워드 입력 부분 입니다.


우선 로그인을 위한 페이지가 있습니다. (입력값은 아이디 / 패스워드)
WdkCeq5.png

정상적으로 아이디와 패스워드를 입력했을 경우, 다음과 같이 서버와 연결된 데이터 베이스에 다음과 같은 쿼리문을 날리게 됩니다.
(맴버라는 테이블에서 id컬럼은 re_id 이고 passwd컬럼은 re_passwd인 정보를 가져와라 라고 생각하시면 됩니다.)
dTgRtI5.png


그리고 데이터 베이스의 결과를 받은 결과를 통해 서버는 다음과 같이 사용자가 보낸 쿼리값에 대한 응답을 해주게 됩니다.
그럼 다음과 같이 로그인해봅시다!
ckdLp8t.png
데이터 베이스에 존재하는 값을 알맞게 입력할 경우 다음과 같은 페이지로 넘어가게 됩니다.
LtpJuon.png


그럼 여기서 우리가 생각할 수 있는 부분은 정해진 쿼리문 + 사용자가보내는 매개변수 값 = 서버가 데이터베이스로 보내는 SQL문 이구나! 라고 생각을 할 수 있습니다. 그렇다면, 내가 아이디 or 패스워드 부분을 적절하게 보낸다면 저 SQL문을 어느정도는 내가 원하는 대로 조작할 수 있겠군.. 그리고 로그인은 저 SELECT 문을 만족시키는 값이 존재하면 로그인이 처리되는 로직이겠지? 하고 생각할 수 있습니다.

그래서 우리는 이러한 쿼리문을 날려봅니다.

2Yx3LGr.png
이런식으로 공격자가 조작할 문자를 서버로 보냅니다! 그렇게 되면, 서버는 다음과 같은 화면을 보여줍니다

Id = ‘admin’or 1=1# / pw=공백
58AiGeZ.png

id = ‘admin’or ‘1’=’1 / pw=공백
OVYsPSm.png

id = ‘ >-1 # / pw=공백
e1Rjp1B.png

id = admin / pw=’or ‘1’=’1
B5nEyiY.png

이런식으로 아이디와 패스워드값을 넣으면, 정상적으로 로그인이 이루어짐을 알 수 있습니다.

당연히 알맞지 않은 아이디 / 패스워드 값을 대입하면 다음과 같은 화면이 나오게 됩니다.
lyh9eSq.png


그렇다면, 왜! 로그인이 성공하는지 이유를 봅시다!
xwZIIUD.png

해당 빨간 박스 안을 중심적으로 해당 SQL문을 해석하면
admin이라는 단어를 써주고 공격자가'를 넣음으로써 id값에 들어가는 값을 admin으로 완성시킵니다. 그리고 이후에 자신이 원하는 or 1=1# 을 집어넣게 되죠.
member라는 테이블에서 [id라는 컬럼이 ‘admin’ 이거나 참값(true)]에 해당하는 데이터를 가져와라 라는 내용입니다. 뒤에는 ‘#’을 집어 넣음으로써 그 뒤에 패스워드에 해당하는 내용을 주석 처리 해버립니다. (주석처리되면 해당 내용은 실행되지 않습니다!) 그래서 해당 테이블에 패스워드는 상관없이 id 값이 참값인, 즉 모든 값을 가져오게 됩니다. 그래서 해당 결과값을 데이터베이스로부터 받은 서버는 아! 해당 데이터가 있구나 해서 사용자에게 정상적으로 로그인 페이지로 넘겨주게 됩니다.
(admin 이라는 아이디를 몰라도 ‘or 1=1# 만 넣어도 공격에 성공합니다.)

음... 뭔가 설명이 부족해서 부족하지만 비유해서 설명을 하자면, 선생님이 무궁화반에(테이블) 이름이 철수고 학번은 123456인 학생이 있나?! 하면 반(테이블)에서 해당 학생이 있다면 학생(DB에서 SQL문을 돌린 결과)이 나오겠지요!
그런데 여기서 우리가 선생님 말을 조작해서 무궁화반에(테이블)이름이 철수 [또는 누구든 존재하는사람(참이라면)이 있나?]하고 뒤에 학번은 묵음처리를 해버리는 겁니다. 그래서 모든 학생들이 해당 조건에 부합하기 때문에 로그인이 가능하게 됩니다.

[]이부분을 공격자가 조작을 통해 추가한 내용으로 생각하시면 됩니다. 
*존재한다면 이라는 비유가 좀 그렇기는 하지만.... 봐주세여;;


이런 방식으로 나머지 요청들도 공격자의 입맛에 맞게 내가 모르거나 알고있는 내용을 통해 데이터베이스로 넘어가는 SQL문을 조작해서 내가 원하는 결과를 얻는 공격입니다.

이게 로그인 페이지에서만 가능한 공격이냐? 하시면 사용자가 특정 요청을 해서 DB에 쿼리를 날리고 해당 결과값을 받아오는 작업은 취약점만 존재한다면 공격이 가능합니다.
ex) 게시판접속할 때, 게시판 글 검색, 아이디 검색, 등등

제가 소개한 내용은 SQL Injection의 가장 기초적이고, 기본원리만 설명했을 뿐 실제 공격은 저렇게 간단하지 않습니다!
이게 가능한 페이지는 이제 막 홈페이지 제작을 배운 신입생이 만든 페이지에서나 가능할 수도 있는 공격 입니다. 물론 이걸 기초로 다른 복잡한 SQL을 섞어서 사용하면, 현재 활발하게 사용되는 웹 페이지에서도 가능한 공격이니 만큼! 재미로만 보셨으면 좋겠습니다^^.

이보다 더 나아가서 error base 공격, Blind SQL Injection 공격도 있고 이러한 공격을 막는 방법도 설명해야 하지만, 한번에 설명하기에는 너무 길어질 것 같아서 다음에 설명하도록 하겠습니다!

역시 글쓰기는 너무나 어렵네요 헠헠... 이런 짧은 내용을 작성하는데도 엄청난 수정을 했네요...

* 위의 모든 테스트는 제가 직접 작성한 페이지와 서버에서 실험했음을 알립니다! 실제 사용하는 페이지와 서버면 저렇게 허접하지도 않... 쿨럭...겠죠..






6
  • 정성에 춫천!
  • 줄글로 풀어쓰기 힘든 내용을 잘 써 주신 것 같아요!
  • 블라인드도 해주세여
이 게시판에 등록된 Patrick님의 최근 게시물


90년대에... 대충 만든 텔넷 사이트에서 세미콜론만 넣어도 쉘이 뜨던 시절이 생각나는군요.
Patrick
그시절을 경험하지는 못했으나... 그 때 지금의 지식만큼 가지고있었으면 왠지 저는 모든 사이트를 테스트해보면서 지금보다 재미있을것 같아요 ㅠㅠ 지금은 저같은 초보가 비비기에는 다들 시큐어 코딩을 잘해놔서...
유리소년
전 raw query는 가급적 안만질려고 합니다. 세부문법 가물가물해서 복잡한거 구현하려면 머리가 아찔..
보증된 query들만 갖다 씁니다.
이걸 이해하는 내가 싫다......
T.Robin
그런데 경우에 따라서는 저게 안 먹히는 경우도 있습니다. ;)
April_fool
SQL 어려워오 SQL
T.Robin
우리에겐 뭐든지 알려주는 프로그래머의 지식인, Stack Overflow가 있습니다.
에러 발생시 스택오버플로우에서 대응책을 끌어다 디스플레이 하게 만들었던 개발자가 있었던것도 같은데 ㅋㅋㅋ
doubleb
ㅋㅋ 아이거 너무웃기네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 저장해놔야겠다
Patrick
맞아요 넘나 어려워요 ㅠㅠ 학부때 db수업도 안들어서 그런지 위에 설명한것보다 복잡한 구조로 조작하는건 많은 생각을 요하게 합니다 ㅠㅠ
그리부예
저는 이쪽으로 완전히 문외한인데 뭔가 알아들을 수 있다는 느낌을 받으며 읽었어요.ㅎㅎ 설명을 잘하시는 듯!
Patrick
감사합니다!!! 저도 문외한에서 한 발자국 뗀지 얼마 안되서 그런지 제가 이해한것처럼 설명하는게 먹히는군요!
doubleb
이 짤이 빠질 수 없죠
앜 ㅋㅋㅋㅋㅋㅋㅋㅋ
목록
번호 제목 이름 날짜 조회 추천
공지 티타임 게시판 이용 규정 2 Toby 15/06/19 32826 7
15385 게임퍼스트 버서커 카잔에는 기연이 없다 - 던파의 시선에서 본 소울라이크(1) kaestro 25/04/16 7 0
15384 일상/생각코로나세대의 심리특성>>을 개인연구햇읍니다 14 + 흑마법사 25/04/15 369 8
15383 일상/생각평범하지 않은 평범한 사람들 1 큐리스 25/04/15 399 8
15382 음악[팝송] 테이트 맥레이 새 앨범 "So Close To What" 김치찌개 25/04/14 77 0
15381 IT/컴퓨터링크드인 스캠과 놀기 T.Robin 25/04/13 448 1
15380 역사한국사 구조론 9 meson 25/04/12 736 4
15379 오프모임날이 좋아서... 날이 좋지 않아서... 5/4 난지도벙 13 치킨마요 25/04/11 834 3
15378 스포츠90년대 연세대 농구 선수들이 회고한 그 시절 이야기. 16 joel 25/04/11 999 8
15377 일상/생각와이프가 독감에걸린것 같은데 ㅎㅎ 2 큐리스 25/04/10 531 11
15376 일상/생각지난 일들에 대한 복기(직장내 괴롭힘에 대한 판단) 3 셀레네 25/04/10 799 5
15375 일상/생각우리 강아지 와이프^^;; 6 큐리스 25/04/09 748 5
15374 기타[설문요청] 소모임 활성화를 위한 교육과정에 대해 도움을 요청드립니다. 21 오른쪽의지배자 25/04/09 583 4
15373 과학/기술챗가놈 이녀석 좀 변한거 같지 않나요? 2 알료사 25/04/09 625 1
15372 과학/기술전자오락과 전자제품, 그리고 미중관계? 6 열한시육분 25/04/09 458 3
15371 꿀팁/강좌3. 다양한 사람과 다양한 감정 36 흑마법사 25/04/08 787 18
15370 기타만우절 이벤트 회고 - #3. AI와 함께 개발하다 7 토비 25/04/08 422 12
15369 정치깨끗시티 깜찍이 이야기 3 명동의밤 25/04/08 408 0
15368 일상/생각우연히 폭싹 속았수다를 보다가.. 8 큐리스 25/04/08 682 0
15367 영화지쿠악스 내용 다 있는 감상평. 2 활활태워라 25/04/08 394 1
15366 경제[의료법인 법무실] 병원관리회사(MSO) 설립, 운영 유의사항 - 사무장 병원 판단기준 1 김비버 25/04/08 461 1
15365 정치역적을 파면했다 - 순한 맛 버전 5 The xian 25/04/07 821 13
15364 정치날림으로 만들어 본 탄핵 아리랑.mp4 joel 25/04/06 452 7
15363 경제[일상을 지키는 법] 전세사기 피해자를 위한 '보증금 반환' 방법 2 김비버 25/04/06 570 5
15362 일상/생각조조와 광해군: 명분조차 실리의 하나인 세상에서 4 meson 25/04/05 442 2
목록

+ : 최근 2시간내에 달린 댓글
+ : 최근 4시간내에 달린 댓글

댓글
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기
회원정보 보기
닫기