프로그래밍[Univ]/웹 프로그래밍

[기타] SQL Injection, Cross-site scripting

Cloud Travel 2011. 12. 10. 12:07

서 론

최근 우리나라는 다른 나라로부터 웹 서버 공격을 받은 적이 많다. 이는 예전의 서버의 약점이 절실히 들어난 것도 있지만, 우리가 해킹과 그에 대한 대안에 대해서 무감각했던 면을 보여주었다고 생각한다. 이번 조사를 통해서 여러 가지 해킹법에 대해서 알아보고, 그에 대한 대안을 조금이나마 알기를 원한다. 그렇다면 SQL Injection부터 알아보도록 하자.
 

SQL Injection 공격법

SQL Injection을 알아보기 전에 SQL에 대해서 알아보도록 하자. SQL이란, 관계형 데이터베이스에서 정보를 얻거나 갱신하기 위한(자료의 검색이나 관리) 데이터베이스 관리언어이다.

SQL Injection이란, 데이터베이스로 전달되는 SQLQuery값을 변경시키기 위해서 Web Application에서 입력 받은 파라메터를 변조 후 삽입하여 비정상적인 데이터베이스로 접근을 시도하거나 Query를 재구성하여 원하는 정보를 열람하는 해킹하는 방법을 말한다. SQL Injection의 공격 기법으로는 인증 우회법, 권한 상승법, 에러 메시지 제공법, 데이터베이스에 저장된 데이터의 열람 및 조작법이 있다. 각각의 방법에 대해서 하나씩 알아보도록 하자.

에러 메시지 제공법과 데이터베이스에 저장된 데이터의 열람 및 조작법은 인증 우회법이나, 권한 상승법을 통해서 SQL접속 하였을 시 SQL의 자체 방화벽을 뚫거나, 데이터를 조작하는 방법이다. 그렇다면 SQL에 직접적으로 접속하기 위해서 공격자들이 하는 방법에 대해서 살펴보자.

일단 공격자가 공격방법을 선택하기 위해서는 SQL Injection이 가능한 상태인지 판단이 가능해야한다. 다양한 방법으로 공격가능성이 판단되면 우회하는 공격방법을 실시한다. 우회하는 방법은 방화벽으로 막혀있는 SQL을 우회하여서 접속하는 방법이다. 이 방법의 한 예로 80/top 포트를 사용하여 데이터를 가져오도록 주소 값을 설정하는 방법이 있다. 80번 포트는 다른 포트와 기능적으론 같으나, 웹을 쓰는 서버들과 브라우저간에 강제성이 없는 포트를 말한다. 공격자는 지속적으로 공격을 하여 방화벽이 없는 포트를 찾아낼 것이다.

우회하는 방법은 데이터베이스 관리자가 최고의 방화 실행과 비-권한 로그인을 사용하도록 응용프로그램을 설정하여 방어할 것이다. 이러한 경우에는 공격자는 두 번째 방법인 권한 상승법을 사용할 것이다. 권한 상승법은 비권한 로그인의 취약점을 찾아 관리자권한까지 권한을 향상시켜서 접근하는 방법이다. 공격의 실행으로 SQL서버상의 적당한 권한을 획득했다면, 데이터베이스에 저장된 데이터의 열람 및 조작이 가능할 것이다. 하지만 SQL서버 내에서도 몇몇 포트에 의해서 방화벽으로 차단되어, 접근이 힘들 경우가 발생한다. 이 경우에는 데이터를 변경 및 접근하기 위해서 공격자는 새로운 테이블을 만들어 공격을 실시 할 것이다.

그렇다면 이번엔 가장 간단하고 널리 알려진 한 가지 방법에 대해서 소개해 보겠다. 소개할 방법은 로그인시 ID창을 이용하여 ID없이 로그인하는 방법이다. 간단히 ID창에 ‘(싱글 쿼터)값을 넣고 로그인을 실시하는 방법이 있다. ’ 값을 아이디에 넣고 접속할시 SQL error가 발생한다면 SQL Injection으로 공격이 가능하다는 것을 알 수 있다. 여러 가지 사이트에서 싱글쿼터를 사용해봤으나 입력자체가 안되거나 차단 되있는 경우가 대부분이었다. 그림을 토대로 설명을 이어가겠다. ID창에 다음의 값을 작성해보자. “ ‘or'1'='1' -- "를 넣어주면, 실제 코드부분에서 싱글 쿼터에 의해서 프로그래머가 작성한 Query이 생략이 되고, --에 의해서 주석처리가 되어서 실제로 작성한 부분은 가려질 것이다. 그렇다면 이젠 공격자가 작성한 or문이 실행된다. 공격자가 준 ’1‘ = ’1‘은 항상 참이므로 다음으로 넘어갈 것이다. , 로그인이 될 것이다.


 SQL Injection 방어법

SQL Injection공격에 대한 일반적인 대책은 다음과 같이 제시가 된다. 데이터베이스와 연동을 실행하는 스크립트의 파라미터를 모두 점검하여 사용자의 입력 값이 SQL Injection을 발생시키지 않도록 수정을 하는 방법이 첫 번째이다. naver와 같이 SQL Injection을 일으키는 문자에 대해서 작성이 불가능하게 막거나(해당 입력창에 필요 내용과 관련 없는 내용을 차단하는 방법) 일단 사용자로부터 데이터를 받은 후 각 문자를 비교하여 검사하는 방법이 있다. 또한 모든 사용자 입력에 싱글쿼터를 붙여주는 것으로 이를 방지 할 수도 있다.

또 다른 방법으로는 SQL 서버의 에러 메세지를 사용자에게 보여주지 않도록 설정하는 것이다. 이는 사용자가 SQL Injection으로 어떠한 공격이 가능한지 판단을 못하게 만드는 방법이다.

다른 법으로 웹 에플리케이션이 사용하는 데이터베이스에 대한 사용자 권한을 제한하는 방법이다. 그리고 저장 만약 Injection에 의해 피해를 보더라도 이를 최소화하기 위해서 저장 프로시저를 사용하는 것도 권장 사항으로 이야기 되고 있는 내용이다.


Cross-site scripting 공격법

Cross-site scripting의 통칭은 XSS라고 불린다. 이 공격의 개요는 다음과 같다. 특정 사람에게 악성 스크립트코드를 숨겨서 메일을 보내는 것으로 공격이 시작된다. 이 메일을 상대방이 읽으면 그 사람의 쿠키 정보 등이 보낸 사람에게 제공되는 것이다. 한때, 뉴스에서 메일을 읽자 사건이 발생했다는 뉘앙스의 뉴스가 많이 나왔던 것이 기억이 났다.

이 공격은 쿠키를 기반으로 하는 공격으로 쿠키에 대한 기초적인 지식을 알아야한다. 쿠키는 사용자가 인터넷 웹 사이트에 방문할 때 생기는 4KB 이하의 파일로 웹 사이트의 방문 기록을 사용자 컴퓨터에 남겨 사용자와 웹 사이트를 연결해 주는 정보를 담고 있는 파일이다. 서버가 클라이언트에 쿠키를 제공할 때 보통 2가지 단계를 거친다. 첫 번째 단계는 사용자가 웹 사이트에 방문하면 웹 사이트가 사용자의 컴퓨터의 쿠키를 저장하는 것이다. 두 번째 단계는 사용자가 웹 서버에 접속할 때 사용자 컴퓨터에 있는 쿠키를 웹 서버로 전송하는 단계이다. 첫 번째 단계에서 제공해준 쿠키 값을 이용하여 서버가 정보를 판단하는 것이다. 쿠키에는 단순히 사용자의 아이디와 비밀번호 외에도 사용자의 성향까지 입력이 된다. 성향까지 입력되는 이유는 사이트에서 개개인에 맞춰서 서비스를 제공해주어서 다른 사이트와 차별화된 서비스를 제공하기 위해서 이다. 이제 XSS, Cross-site scripting에 대해서 알아보자.

Cross-site scripting의 약자는 CSS인데 XSS를 쓰는 이유는 htmlCSS와 구분을 해주기 위해서이다. 일단 XSS의 배경은 인터넷의 발달로, 사용자에 맞는 동적인 서비스를 제공해주기 위한 방법에 생긴 것이다. 사용자의 입력을 받아 처리하여 사용자에게 다시 보여주는 동적 페이지에서 사용자의 입력을 받아들여 처리할 때 사용자가 어떤 값을 입력하는지 확인하지 않아서 악의적인 사용자가 정상적인 입력이 아닌 악성 스크립트 코드를 입력하여 서버로 전송하는 방법이다. 그리고 그 코드를 실행하여 사용자의 브라우저로 보여주게 되는 것이다.

XSS의 공격 순서는 다음의 과정을 따른다. 악성 스크립트를 포함한 글을 게시판에 작성하거나 메일을 보내서 다른 사람이 읽도록 유도를 한다. 다른 사용자가 악성코드가 포함된 글을 링크하여 열게 되면, 악성 스크립트는 사용자의 쿠키 값을 가로채 공격자에게 전송을 해준다. 공격자는 이를 이용하여 다른 사용자의 정보로 로그인하여 사용자의 정보를 유출 시킨다. 이젠 XSS의 공격 유형에 대해서 알아보도록 하자.

Client-to-Client 방식은 한 클라이언트에서 다른 클라이언트로 악의적인 코드가 전달되는 방식이다. 게시판에 <script>태그를 이용하여 글을 쓰는 방법으로 악의적인 코드를 전달하는 방법이다. 이 공격을 다른 말로는 저장방법이라고도 부른다. 위에서 예를 든 것 중 게시판에 작성하여 공격하는 방법이 이 방법에 해당한다. 또 다른 방법으로는 Client-to-itself방식이 있다. 이 방법은 악의적인 코드를 공격 대상이 되는 클라이언트에게 보내서 되돌려 받는 방식이다. 다른 말로 반사방법이라고도 부른다. 주로 e-mail이나 웹 페이지를 통해 링크를 제시하고, 링크를 클릭하게 유도하는 방식으로 맨 처음 예를 든 것이 이 방법에 해당된다.

공격할 때 공격이 가능한지를 판단하는 가장 쉬운 방법은 <form>태그 안에 간단한 <script>문을 작성해주는 것이다. 예를 들어, <script>alert("XSS")</script>와 같은 문서를 작성해 주는 것이다. 공격 가능성이 판단되면, 적당한 script문을 작성하여 자신의 에플리케이션으로 쿠키값을 가져오면 된다.
 

Cross-site scripting 방어법

XSS 취약점은 대부분 웹 응용 프로그램 개발자가 사용자 입력을 받아들이는 부분에서 사용자 입력에 대해서 어떠한 검증도 하지 않았기 때문에 발생한다. 사이트 관리자의 입장에서 어떠한 방식으로 대처를 해야 할까? 프로그램 개발시 쿠키에 중요한 정보를 제공하지 않게 하는 것이 첫 번째 방법이다. 다음 방법은 sql injection에서 했던 것처럼 사용자로부터 받는 값을 모두 필터링하여 스크립트 코드가 들어가 있는지 확인하는 방법이다. XSS공격에 주로 사용되는 특수문자인 <, >, &, ‘, “, white spaces, %, ... 등의 것을 확인하는 방식으로 스크립트 함수의 InStr을 이용하여 처리해주면 편리하게 사용이 가능하다. XSS공격이 스크립트 말고 html 태그 기능을 이용하여서 시작되는 경우도 있기 때문에 html 포맷의 입력을 사용할 수 없도록 설정하는 방법도 좋은 방법중 하나이다. 또한 입력 받은 값에서 javascript라고 들어오는 문자열을 다른 문자열로 대체하여 스크립트의 실행을 무효화할 수도 있다.

개발자가 아닌 사용자의 경우에는 어떤 방법을 취해야 할까? 우선 이메일이나 링크를 클릭하여 직접적으로 연결을 하지말고 URL주소를 입력하여 사이트를 방문하는 방법이 있다. 불편한 방법이지만 자신도 모르게 다른 곳에 쿠키를 제공해주고 사이트로 이동하는 것보단 좋은 것 같다. 또한 컴퓨터의 업데이트를 꾸준히 하듯이 익스플로러의 최신 페치를 적용하여 최적의 상태를 만들고, 인터넷 브라우져의 개인 정보 보안등급을 상향 조절하여 쿠키값을 전송하지 않는 방법도 있다. 하지만 등급을 샹향 조절하게 되면 필요한 사이트에 마져 쿠키값이 제공되지가 않아서 웹 사이트를 이용하는데 어려움 점을 제공할 수도 있다.

요즘은 인터넷의 발달로 XSS를 미리 감지하는 기능도 가지고 있다. 이 사진은 실제 운영되는 사이트가 XSS공격을 받고 있음을 알려주기 위해서 자동으로 팝업이 뜬 상태를 캡처한 사진이다.

자신이 사용하는 페이지가 XSS로부터 안전한지 알아보는 방법도 있는데, form 태그에 자신이 직접 스크립트문을 작성해보는 것이다. 스크립트의 내용이 심각하게 보안상 위배되면 안되는 것을 인식해야한다. 만약 보안상 위배가 되는 스크립트 문을 작성하여 실험을 한다면 법정에 갈 수도 있기 때문이다. 


결 론
 
SQL문을 이용해서 서버의 데이터베이스를 공격을 하는 SQL-injection, 스크립트 문을 이용하여 사용자의 쿠키 정보를 다른 곳으로 전송하여 사용하는 XSS공격에 대해서 살펴보았다. 이 외에도 웨 애플리케이션이 사용자의 파라미터 값을 검증하지 않는 경우를 악용해서 하는 파라미터 변조 공격법, GetPost 방식을 응용하여 특정 페이지에 하나의 id에 대하여 패스워드를 무한히 넣어서(로그인 될 때까지) ID의 패스워드를 획득할 수 있는 사전식 공격, 웹 서버의 실행파일에 비정상적인 버퍼 값을 입력 시켜 시스템을 다운 시키거나 관리자 권한을 획득하는 공격법 등 다양한 방법의 해킹적 방법이 존재한다. 웹에서의 해킹은 서버나 클라이언트를 불문하고 데이터의 위치에 상관없이 이뤄진다. 특히 이번에 조사한 SQL-injectionXSS는 사용방법이 어렵지 않고, 누구나 호기심에 의해서 한번쯤 할 수 있는 행위로 중점적으로 대체해야하는 해킹 방법 중 하나라고 한다. 최근 우리나라가 중국에게 당한 여러 가지 웹 서버 공격도 이 방법을 사용한 경우도 있다고 한다.

이번에 조사한 두 방법의 해킹법은 모두 사이트 구축 후 사용자 입력에 의해서 발생될 수 있는 방법이다. 사이트를 구축할 때 사전에 사이트가 위 방법에 노출 되지 않게 방법을 여러 가지 생각하는 것이 필요한 것이다.

이번 조사를 하면서 느낀 점은 보안적인 측면을 익히기 위해서 해킹하는 법을 배우고, 이에 대한 대응 방법을 강구해 놓지 않으면, 만약 해킹을 당한다면 그때 막 공부해서 대처하기에는 시간적여유가 무지 없다는 것이다. 그래서 프로그램을 개발을 한다면 보안적인 측면에 대해서도 생각하면서 개발을 해야 한다는 생각이 들었다.