본문으로 바로가기


언제부턴가 웹 보안에 대한 이슈가 부각되고, 보안 전문가들의 몸값이 높아지고 있다.

사실 인터넷이 연결된 순간부터 바로 보안 위험에 노출되는 것이기 때문에 앞으로도 보안에 대한 중요성은 점점 더 커질 것이다.

사실 나도 보안에 대해서는 잘 모른다. 하지만 웹 개발자가 조금만 신경 써도 충분히 해결할 수 있는 간단한 웹 보안 대응책들이 있다. 하지만, 간단한 것들일 수록 대응하지 않고 공격에 노출 되었을 때 더 강력한 공격을 받을 수 있다.

그 중 첫번째로 XSS(크로스 사이트 스크립팅)에 대한 글이다.


XSS 즉, 'Cross Site Scripting(크로스 사이트 스크립팅)' 은 웹 보안에 있어서 초기부터 전통적으로 나오는 가장 기본적인 이슈이다.


때문에 보안에 관한 지식이 전혀 없는 웹 개발자가 개발한 웹어플리케이션에서 발견되는 http 보안 취약점이라고 할 수 있다. "XSS가 뚫리는 사이트면 나머지는 안해봐도 다 뚫린다." 라는 말이 있을 정도로 웹 보안에 신경 썼는지를 테스트하는 가장 기본적인 해킹 기법이라고도 할 수 있다.


간단하게 개인이 사용할 웹 어플리케이션이라도 가장 기본이 되는 XSS는 신경써서 대응해 줘야 한다고 생각한다.

XSS취약점을 잘 공격하면 뚫린 웹사이트 자체의 보안 문제도 있지만, 그 사이트를 사용하는 사용자에게까지 큰 피해를 줄 수 있기 때문이다.


그렇다면 XSS가 무엇이며 어떤식으로 공격하는 것일까?



1. Cross Site Scripting(XSS) 란?


검색해 보면 아래와 같은 설명을 볼 수 있다.

"게시판, 웹 메일 등에 삽입된 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 및 기타 개인 정보를 특정 사이트로 전송시키는 공격."

(출처 네이버 지식백과)


즉, 사용자의 입력을 받는 웹 상의 공간에 임의의 스크립트를 삽입해서 개발자가 의도하지 않은 형태로 화면을 변형시키거나 조작하는 방법이라고 할 수 있다.

정적으로 만들어진 HTML의 웹 페이지에서는 문제가 발생하지 않지만, 사용자의 입력을 받아 동적으로 HTML을 조작하는 웹 어플리케이션이 주요 공격 대상이 된다.




2. 공격 예제



 위와 같은 간단한 입력 폼에 사용자 입력값을 담아 서버로 보내고, 이 값으로 결과 페이지를 구성할 것이다.

개발자가 의도한 대로 사용자가 이름을 입력하고 확인을 누른다면, 결과 역시 개발자의 의도대로 입력받은 값이 그대로 출력될 것이다.


위 예제는 크로스 사이트 스크립팅(XSS)에 대비가 되어 있지 않은 간단한 웹 어플리케이션이다.

이번에는 저 입력칸에 '이름'이 아닌 아래와 같은 스크립트를 넣어보자.


<SCRIPT>alert("테스트!!!");</SCRIPT>


XSS공격에 대한 대응이 되어 있는 사이트라면  위 스크립트를 넣더라도 그냥 문자열일 뿐이기 때문에 '이름' 을 입력받을 때와 마찬가지로 화면에 "<SCRIPT>alert("테스트!!!");</SCRIPT>" 그대로가 출력 될 것이다.

하지만 아무런 대응이 되어있지 않다면 이런 결과를 볼 수 있다.



팝업 메시지를 띄우는 것은 개발자가 전혀 의도한 기능이 아니다.

즉, 사용자가 임의로 웹 페이지를 조작할 수 있다는 것이다.

저 스크립트가 alert 메시지를 띄우는 스크립트여서 다행이지 얼마든지 서버에 접근해 정보를 가로챈다던가, 쿠키를 훔치거나 하는 악의적인 스크립트를 간단하게 동작 시킬 수 있다.



3. 위험


위 예시는 단순히 공격자가 만든 스크립트를 실행시키는데 그쳤지만, 응용하면 더 위험한 상황에 다른 사용자들을 노출시킬 수 있다.


XSS대응이 되어있지 않은 사이트의 게시판에 해커가 미리 만들어둔 악성 해킹 사이트로 이동하게끔 하는 스크립트를 삽입하고 자극적인 제목을 달아 게시물을 등록한다.


-> 일반 사용자는 그 게시물을 클릭하게 되고, 해커가 삽입한 스크립트가 동작해 악의적인 페이지로 이동하게 된다.


웹 서핑을 하다가 "X초 후 자동으로 변경된 주소로 이동합니다" 등의 메세지와 함께 광고 사이트로 이동하거나, 원하지도 않는 파일들이 다운로드 되는 경험이 있을 것이다.


XSS의 가장 큰 문제는 이처럼 보안에 취약한 사이트를 이용하는 선량한 일반 대중 사용자들이 피해를 본다는 것이다.

때문에 웹 보안을 잘 모른다고 신경 쓰지 않을 것이 아니라, 매우 간단한 몇 가지 조치로도 대응할 수 있기 때문에 조금만 신경써서 막아야 할 것이다.



※ 이번 글에 대한 예시를 작성하며 깜짝 놀란 것이, 개발자가 아무런 조치를 하지 않은 화면임에도 불구하고 XSS공격이 통하지 않았다. 개발자 도구를 열어 보니 콘솔에 아래와 같은 경고가 떠 있었다.

"The XSS Auditor refused to execute a script in 'http://localhost:7070/xssTest.do' because its source code was found within the request. The auditor was enabled as the server sent neither an 'X-XSS-Protection' nor 'Content-Security-Policy' header."

'이제 브라우저에서 공격을 막아 주는것인가?' 싶어서 IE11에서 해 보니 안타깝게도 XSS공격이 성공했다. 세삼 구글의 위대함을 느낀다.

사용자가 사용하는 웹브라우저는 개발자가 어찌할 수 있는 것이 아니니, 알아서 막아주겠지 생각하지 말고 개발자도 막아야 한다.


 Other Contents 

댓글을 달아 주세요

티스토리 툴바