PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2017/07/25 00:11:54
Name Patrick Jane
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 공격도 있고 이러한 공격을 막는 방법도 설명해야 하지만, 한번에 설명하기에는 너무 길어질 것 같아서 다음에 설명하도록 하겠습니다!

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

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

* 실력이 미천하나 뭐든 물어보신다면 성심성의껏 답변 드리겠습니다!




통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
포도사과
17/07/25 01:11
수정 아이콘
실제로 서비스 되고 있는 서버들이 sql 인젝션에 생각보다 취약하지 않나 생각을 합니다...
자주자주 뉴스나오는 걸보면.....
Patrick Jane
17/07/25 09:06
수정 아이콘
아무래도 사람이 프로그래밍하다보니 생각하지 못한 부분에서 많이 공격당하는거 같네요; 여기어때 정보 털린것도 sql injection으로 공격인데... 무서운공격에는 틀림없습니다!!
SkyClouD
17/07/25 01:18
수정 아이콘
의외로 sql 인젝션에 털리는 케이스가 너무 많아서... 기본중의 기본이라지만 다들 그냥 넘어가더군요.
운동화12
17/07/25 03:16
수정 아이콘
재밌네요 감사히 읽었습니다
Patrick Jane
17/07/25 09:19
수정 아이콘
재미있게 읽어주셔서 감사합니다!!
17/07/25 03:21
수정 아이콘
어떤 영화에 신데렐라였나?? 그 여자를 레오나르도 다빈치가 돕는가? 그런 내용이었는데,
문이 잠겨 있다고 발을 동동 구르는 여주인공에게 발명가가, 가서는 문의 꺽쇠의 못을 숙 뽑더니 끼익 반대로 열고는 나가는 장면이 있었습니다.
정말, 발상의 전환이랄까요? 기본으로 돌아가는 공격과 대처법이라는 게 있는 것 같습니다.
Patrick Jane
17/07/25 09:17
수정 아이콘
이런거 생각해내고 더 나아가서 데이터베이스까지 털어버리는 굇수들보면;; 다른 세계사람인가? 하고 생각할때가 많아요 ㅠ
17/07/25 06:27
수정 아이콘
인젝션 방어하는 방법이 결국은 치환 하는거라 여러가지 개발편의성을 가져가버려서 않하시는분들은 귀찮아서 그렇죠.
보안이라는게 보안성을 가지면 가질수록 개발자나 사용자에게도 칼끝이 가기 때문에
17/07/25 07:53
수정 아이콘
너무나 기본적인 시큐어코딩인데 비전공 으로 학원에서 3개월 수료하고 바로 현장으로 뛰어드는분들이 많아서. 저렴하게 구축한 사이트들이 저런 취약성이 있긴하죠
Patrick Jane
17/07/25 09:19
수정 아이콘
저렴하게 구축한 사이트 이외에도 굉장히 많은 웹페이지들이 저런 취약점을 가지고 있습니다. 물론 위와같은 로그인에서 바로 뚫리는 취약점은 아니지만 헣헣...
17/07/25 10:35
수정 아이콘
대한민국에 굉장히 많은 사이트가 저렴하게 만들어지고 있습니다. 영세 si업체에서 초급 개발자가 한달 이내로 구축한 사이트가 대부분이라 보시면 됩니다
17/07/25 08:16
수정 아이콘
a4용지로 인쇄해서 붙인 그 길다란 자동차 번호판.....이 생각나네요
임나영
17/07/25 08:21
수정 아이콘
전혀 모르는 분야인데도 쉽게 풀어 주셔서 읽는데 문제가 없네요. 알고 있는 지식을 말로 쓴다는게 쉬운 일이 아닙니다. 뜩히 이런 전문적인 분야에서 초보들이 읽어도 싑게 느껴진다는건 그만큼 글 쓰신 분의 노력과 정성을 볼 수 있었습니다.
감사합니다. 앞으로도 계속 기대하겠습니다.
Patrick Jane
17/07/25 09:19
수정 아이콘
재미있게 읽어주셔서 감사합니다!!
ThreeAndOut
17/07/25 08:53
수정 아이콘
우와, 이거 이거.. 저같은 초보가 웹 페이지에서 SQL 로 사용자 정보 관리 했다가는 직빵으로 털리겠는데요?
Patrick Jane
17/07/25 09:21
수정 아이콘
보안쪽을 생각하지 않고 제작한다면, 거의 무조건 취약점이 발생한다고 생각합니다ㅠ 하지만 다들 이용하시는 사이트들도 잘 찾아보면 이런 취약점들이 있을수있습니다!
르웰린수습생
17/07/25 08:56
수정 아이콘
잘 읽었습니다. 다음 편도 기대하겠습니다.^^
Patrick Jane
17/07/25 10:47
수정 아이콘
재미있게 읽어주셔서 감사합니다!!
포도씨
17/07/25 09:32
수정 아이콘
이거 읽고서 공연히 여기저기 실제 운영되는 홈페이지 찔러보시다가는 경찰서에서 연락받으실 수도 있습니다. 크크
시노부
17/07/25 09:55
수정 아이콘
윈도우/임베디드 개발자 입니다. 크크크크

요즘 회사내 웹관련 솔루션 요구사항이 많아서 공부중인데 좋은글 잘보고 갑니다. ㅠㅠ
웹.넘나.어려운것.
Patrick Jane
17/07/25 10:49
수정 아이콘
맞아요 웹 하면할수록 넘나 어려운것 ㅠㅠㅠ..
YORDLE ONE
17/07/25 09:56
수정 아이콘
대고객 사이트 보안성검토에서 가장 중점적으로 보는 부분이기도 하죠
Patrick Jane
17/07/25 10:50
수정 아이콘
네 아무래도 해당 취약점이 발생하면 즉시 조치해야하는 수준의 높은 취약점이라 중점으로 보는게 맞습니다!
에드워드엘릭
17/07/25 10:36
수정 아이콘
좋은 글 잘 읽었습니다.

실제 현업에서는 prepared sql 혹은 stored procedure 를 이용하여 데이터베이스 질의를 하는 것을 권고하며, 보여준 예시처럼 문자열 조합으로 SQL을 실행하지는 않습니다. 의외로... SQL injection이 통하는 web이 아직 많이 있다니... 큰일이군요.
이상 현직 허접 DBA 였습니다. (--)(__)
Patrick Jane
17/07/25 10:52
수정 아이콘
실제로 모의해킹할 기회가 있어서 시도해보니 로그인페이지보다는 게시판 불러올때나 게시판에 검색할때 발생하는 경우가 많더군요..
17/07/25 12:48
수정 아이콘
stored procedure 를 많이 쓰나보네요.. 제가 잘 안써봐서 명확하진 않지만, 원리를 생각해보면 이게 좋은 해결책이었겠네요!

저도 현업 이야기를 하자면, ORM을 쓰면 해결됩니다. ORM 쓰세요! ORM 넘나 좋은것!
이상 현직 허접 개발자였습니다.
17/07/25 13:44
수정 아이콘
저도 허접하지만 ORM 이 최고라고 봅니다!
도롱롱롱롱롱이
17/07/25 11:52
수정 아이콘
자동차 번호판에 비슷한 문구 넣었던게 기억나네요
여행의기술
17/07/25 13:40
수정 아이콘
https://xkcd.com/327/

xkcd에 있는 sql exploit관한 코믹입니다.
Soul of Cinder
17/07/25 16:47
수정 아이콘
대충 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 여기 나와 있는 것만 지켜도...

생각해보면 워낙 학원 3개월 PHP 코딩만 배워서 만드는 사이트들이 많아서 그런가, 패스워드 암호화조차 안하는 곳들이 많은데 (가끔 가입을 축하드립니다! 비밀번호는 평문으로 땡땡땡 입니다. 라고 메일 날아오는데 진짜 뒷목 잡습니다. 크크... NaCl/libsodium 라이브러리 같이 신박한 물건들도 있는 세상에!)

SQL 인젝션 정도는 조금만 신경쓰면 되니 양반(?)같죠. 차라리 잘 모르겠으면 직접 DB 연결하지 말고 이미 만들어진 프레임워크나 ORM 등의 물건들을 써서 코딩하면 기본적인 문제점들은 피해가는데, 어째 딱 책에 나와 있는 예제처럼 직접 하려고 하니......
공실이
17/07/26 07:32
수정 아이콘
http://i.imgur.com/RmfbEsZ.jpg
바로 이겁니다.

과속카메라를 해킹!
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
73023 [일반] 박근혜 재판 생방송이 허용되었습니다. [18] 어리버리7777 17/07/25 7777 1
73022 [일반] 이언주 "알바 월급 떼여도 신고 않는 게 공동체 의식" [209] 자전거도둑15107 17/07/25 15107 27
73021 [일반] 무한도전 국민제안 임산부 주차장법 발의 [74] 홍승식11440 17/07/25 11440 0
73020 [일반] 2년차 백수의 백수 탈출기 [46] RnR8937 17/07/25 8937 27
73019 [일반] 커피왕 강훈씨가 사망했네요... [39] Neanderthal12665 17/07/25 12665 2
73018 [일반] 2000년대 이후 최고의 작품성을 갖췄다고 평가받는 미드 Best 7.jpg [69] Ensis15223 17/07/25 15223 9
73017 [일반] 와 너무화가 납니다. [150] TheGirl20288 17/07/25 20288 45
73016 [일반] [뉴스 모음] 원세훈 국정원장의 녹취록에 드러난 정치개입 외 [52] The xian10667 17/07/25 10667 36
73015 [일반] 재미로 써보는 웹 보안이야기 - 1 [31] Patrick Jane5031 17/07/25 5031 7
73014 [일반] 오늘은 우울하네요 [34] 승리의기쁨이��5644 17/07/25 5644 7
73013 [일반] 삼국통일전쟁 - 7. 여왕은 나라를 잘 다스릴 수 없다 [11] 눈시H5622 17/07/24 5622 8
73012 [일반] [역사] 나치독일의 저항과 종말: 1944-45 [11] aurelius6224 17/07/24 6224 17
73011 [일반] 개기일식이 한 달에 한 번씩 일어나지 않는 이유... [17] Neanderthal6609 17/07/24 6609 9
73010 [일반] 전설의 용자 다간을 다시 봤습니다. [68] style9772 17/07/24 9772 1
73009 [일반] 흡연은 때와 장소를 가려서 [91] 타네시마 포푸라12935 17/07/24 12935 96
73008 [일반] 양압기, 레시틴 후기입니다.(양압기 구입 관련 내용 추가. 부모님 식당 홍보...) [110] 이리세22580 17/07/24 22580 15
73007 [일반] 임원이 각목으로 직원을 폭행한 회사 [64] 블랙번 록16729 17/07/24 16729 8
73006 [일반] 정권이 바뀐걸 온 몸으로 실감하고 있는 원세훈 전 국정원장 [18] 어리버리15549 17/07/24 15549 12
73005 [일반] 20세기에 상상한 21세기 의학. [14] 황약사8842 17/07/23 8842 3
73004 [일반] [역사] 독일인은 왜 나치를 지지했고 전쟁을 일으켰나? [39] aurelius10505 17/07/23 10505 35
73003 [일반] 2017년 상반기 일본 관광객 국가별 순위 [44] 군디츠마라12708 17/07/23 12708 3
73002 [일반] [뉴스 모음] 대통령-기업인 대화에 오뚜기 초청 외 [55] The xian11897 17/07/23 11897 16
73001 [일반] 상대방이 녹음 버튼을 클릭했습니다' 자유당,통화 녹음 알림 의무화 추진 [98] 크아아아12856 17/07/23 12856 12
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로