• 목록
  • 아래로
  • 위로
  • 0
  • title: 황금 서버 (30일)humit
  • 조회 수 1214

※ 주의 : 이 내용에 있는 방법을 이용해 다른 사이트를 해킹하려고 시도를 할 경우 법적인 처벌을 받을 수 있습니다. 단순히 참고용 혹은 대비 방법에 대해 익히는 정도로만 이해를 하시면 됩니다.

 

아마 여기에 있는 분들은 모두 자신만의 홈페이지를 꾸미는 것을 목표로 할 것입니다. 물론 홈페이지를 꾸미는 것도 좋지만 보안의 경우에도 신경을 쓰는 것이 좋습니다. 보안에 신경을 쓰지 않는다면 그 서버는 해커에 의해서 털리게 되고, 또한 그렇게 되면 해커가 그 서버를 경유지로 해서 다른 서버도 터는 것이 가능해지기 때문에 위험합니다. 저의 경우에도 이와 비슷한 일을 겪을 뻔 했습니다....

그렇기 때문에 보안을 신경쓰는 것이 중요합니다. 이번 내용에서는 SQL Injection이 무엇인지에 대해 살펴보고, 이를 어떻게 막을 수 있는지에 대해 알아보도록 하겠습니다.

 

1. SQL Injection란 무엇인가?

SQL Injection이란 SQL 삽입 공격이라고도 번역합니다. 여기서 SQL이란 DB 상에서 사용하는 언어로 대표적으로 할 수 있는 일은 '데이터 삽입하기', '데이터 값 변경하기', '데이터 조회하기' 등의 기능을 할 수 있습니다. SQL Injection은 SQL 쿼리를 개발자가 원하는 방식이 아닌 방법으로 실행을 하게 해서 개인 정보와 같은 값을 빼내는 것과 같은 공격을 의미합니다. 인터넷에서 한 번 쯤은 보셨던 웹 사이트 개인 정보 유출이 대부분의 경우 SQL Injection에 의해 발생합니다.

 

2. 대표적인 공격 예시. (실제로 동작하는 서버에 절대로 시도하지 마세요!!)

2.1. 로그인 인증 우회하기

보통 로그인을 사용할 때 데이터베이스에 회원 정보에 대한 값을 넣어놓고 이 값을 조회하는 방식으로 되어 있습니다. 예전 PHP 책을 보면 로그인을 하기 위해서 사용하는 쿼리를 다음과 같이 생성을 합니다.

 

$sql = 'SELECT * FROM user_table WHERE id="'.$_POST['id'].'" and pw="'.$_POST['pw'].'"';

 

그래서 id와 pw값으로 각각 guest를 준다면 아래와 같은 쿼리가 생성되게 됩니다.

$sql = 'SELECT * FROM user_table WHERE id="guest" and pw="guest";

 

만약 해커가 id값으로는 admin"# 을 사용하고 pw 값으로는 1234로 주어서 실행을 한다면 아래와 같은 쿼리가 생성됩니다.

$sql = 'SELECT * FROM user_table WHERE id="admin"#" and pw="1234";

여기서 실제로 실행이 되는 쿼리 부분은 SELECT * FROM user_table WHERE id="admin"#로 #의 경우에는 그 뒤의 내용을 무시하는 주석과 같은 역할을 하기 때문에 결국 id가 admin인 값으로 로그인을 한 결과로 됩니다.

 

2.2. 다른 사람의 회원 정보 가져오기

만약 만들어진 홈페이지에서 자신의 정보를 볼 수 있는 페이지가 있고, 이 페이지의 경우에는 member_no라는 값을 hidden 값으로 받는다고 가정해봅시다.

그렇다면 이를 구현할 수 있는 쿼리는 다음과 같습니다.

$sql = 'SELECT * FROM user_table WHERE no='.$member_no;

만약 member_no 값이 10인 사람이 그 페이지에 들어가면 아래와 같은 쿼리가 생성됩니다.

$sql = 'SELECT * FROM user_table WHERE no=10';

그런데 해커가 member_no값으로 1000 or 1이라는 값을 주면 아래와 같은 쿼리가 생성됩니다.

$sql = 'SELECT * FROM user_table WHERE no='.$member_no;

즉, 이런 쿼리 하나로 모든 사람의 데이터를 가져올 수 있습니다. 만약 저 결과에서 하나의 데이터만 화면에 뿌려준다면 member_no값으로 limit 절을 추가해서 모든 사람의 정보를 가져올 수 있습니다.

 

3. 어떻게 공격을 막을 것인가?

먼저 Wordpress나 XE와 같은 CMS를 이용하고 있는 경우에는 새로운 보안 업데이트가 나오면 바로바로 적용을 해주도록 합니다. 우리가 신경쓸 필요 없이 알아서 개발자 분들이 보안 업데이트를 해주시니 편리하게 바로바로 적용을 할 수 있습니다.

문제는 직접 PHP 코드를 작성해 홈페이지를 제작하는 경우입니다. 이 경우에는 3가지 정도의 방안이 있습니다.

 

첫 번째 방법은 CodeIgniter와 같은 PHP 프레임워크에서 제공하는 Active Record를 이용해서(Laravel나 CakePHP에서는 Query Builder라는 기능입니다.) 쿼리를 실행할 수 있게 하는 것입니다. 이미 다른 PHP 고수분들이 직접 SQL Injection 공격을 할 수 없도록 쿼리를 생성할 수 있게 구현을 해놓았습니다. 우리는 단순히 그것을 이용하기만 하면 됩니다.

 

두 번째 방법은 PHP에서 제공하는 함수인 addslashes 함수를 이용하는 것입니다. addslashes 함수의 경우에는 SQL Injection을 하는데 사용하는 대표적인 값인 ", ', \, NULL과 같은 값들을 escape해서 쿼리를 생성할 때 SQL Injection이 되지 않도록 합니다. 그리고 stripslashes 함수를 이용하면 escape된 값을 원래 값으로 변형을 하게 됩니다.

즉 데이터를 넣을 때는 addslashes함수를 사용하고 데이터를 보여줄 때는 stripslashes를 사용하시면 됩니다.

참고로 PHP 5.3 버전까지는 magic_quotes_gpc가 기본적으로 켜져 있는데, 이 부분은 끄는 것을 추천합니다. 이미 이에 대한 취약점이 많아서 PHP 5.4부터는 사라진 기능입니다.

 

세 번째 방법은 PDO(PHP Data Object) 기능을 이용하는 것입니다. 실행할 쿼리문을 일정한 형태로 생성을 해놓고, 이후에 실행할 때는 값을 binding 시켜서 실행하는 방법입니다. 추가로 이 기능을 이용하면 같은 형태의 쿼리 문을 여러 번 반복해서 사용해야 할 경우에 편리합니다.

 

4. 에필로그

이렇게 SQL Injection이 무엇이고 이를 막기 위해서 어떤 방법을 취할 수 있는지에 대해서 살펴보았습니다. 물론 SQL Injection에 해당하는 공격이 위에서 소개한 방법 말고도 매우 많습니다. 구글에 영문으로 검색을 해보시면 이와 관련한 내용이 엄청 많다는 것을 알 수 있습니다. 예전에 많이 사용되었던 Zeroboard의 경우에도 상당히 많은 SQL Injection 취약점을 가지고 있습니다.

그렇기 때문에 CMS를 사용하시는 분들은 업데이트를 빼먹지 말고 지속적으로 해주셔야 합니다.

 

지금까지 웹페이지를 제작하는데 있어서 신경써야 할 보안 부분으로 XSS와 SQL Injection에 대해서 살펴보았습니다. 물론 다른 방식의 공격도 존재하긴 하지만 이 두 가지만 확실하게 막아놓았다면 충분히 괜찮은 홈페이지라고 할 수 있습니다. 실제로도 krcert에서도 웹 취약점을 점검할 때 확인하는 항목이 이 두 항목입니다.

 

이렇게 해서 웹 보안에 대한 강좌는 여기까지 하도록 하겠습니다.

 

5. 참고 자료

http://php.net/manual/kr/function.addslashes.php

http://php.net/manual/kr/function.stripslashes.php

http://php.net/manual/kr/info.configuration.php#ini.magic-quotes-gpc

http://php.net/manual/kr/book.pdo.php

 

 

윤삼님 윤삼 포함 1명이 추천

추천인 1

작성자
title: 황금 서버 (30일)humit 119 Lv. (0%) 1140010/115200000EXP

Study For Us Hosting 1기 모니터링 관리자 (16.12.01 ~ 17.01.08.)

C++, Python, PHP를 주로 사용하며 알고리즘, DL, 해킹 쪽에 관심이 있습니다.

휴학생입니다.

티스토리 블로그 : http://humit.tistory.com/

카카오톡 봇 : http://pf.kakao.com/_Efrbu/chat

지식인 프로필 : https://kin.naver.com/profile/jhjang1005

댓글 0

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 마스터 24.02.11.17:21 724
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 마스터 23.01.14.02:23 4395
117 워드프레스 사이트 이전 대행 하지 않고 사이트 옮기기 8 Seia Seia 17.02.06.23:44 689
116 안드로이드 앱을 한번 만들어보자! 10 Dobob title: 도밥위키!Dobob 17.01.18.12:05 1205
115 MVC 패턴에 대해 알아보자. (개념에 대해) image JEEK_CODUCT JEEK_CODUCT 17.01.17.19:08 568
114 윈도우10 듀얼모니터 없이도 듀얼모니터의 느낌을 느끼게 해주는 '확장 데스크톱' 6 JongMinMoon JongMinMoon 16.12.26.23:44 1129
113 스터디포러스에 유튜브 동영상 업로드 하는방법 !! [PC] 1 image 에듀 title: 맛스타의 자물쇠에듀 16.12.26.20:50 576
112 윈도우 7 포맷/설치 한 후 마우스나 키보드가 먹통일때 3 하루살이 title: 황금 서버 (30일)하루살이 16.11.01.22:17 3571
111 인텔 스카이레이크 윈도우7설치 팁 2 하루살이 title: 황금 서버 (30일)하루살이 16.11.01.22:15 630
110 윈도우10에서 최근에 사용한 목록 표시안하기/시작 메뉴 항목늘리기 팁 1 image 하루살이 title: 황금 서버 (30일)하루살이 16.11.01.22:15 751
109 exeplorer.exe 빠르게 종료하기 하루살이 title: 황금 서버 (30일)하루살이 16.11.01.22:14 587
108 [연구글]freenom한글도메인 7 image djdisodo 16.10.28.08:33 1382
107 도메인 연결하는법 1 djdisodo 16.10.27.17:18 986
106 아마존 쿠폰 적립금 모으기 4 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:22 636
105 구글 뮤직을 한국에서 사용하는 방법 6 image 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:21 12553
104 동영상파일을 바탕화면에 적용하기 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:19 719
103 윈도우 10의 음질 향상기능 끄는 방법 1 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:19 6933
102 프로그램없이 막힌사이트 우회 하는 초간단 꿀팁 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:18 52459
101 윈도우 10 기본 앱 삭제 방법 5 image 하루살이 title: 황금 서버 (30일)하루살이 16.10.24.18:17 924
100 CCleaner를 이용해 시스템 정리하기 5 image CharCoal 16.10.15.13:07 442
99 호스팅에 CloudFlare 사용시에는 3 file title: 금메달 (30일)동방개념지국 16.10.14.21:59 573
98 SSD 최적화를 해보자 8 image 하루살이 title: 황금 서버 (30일)하루살이 16.09.28.11:40 719