XSS 보안 위협「당신의 사이트는 안전한가?」

일반입력 :2008/09/16 15:50

오정욱 (보안 컨설턴트)

웹 애플리케이션은 계속 복잡해지고 있다. 그것도 많은 주체들에 의해서 새로운 표준을 만들어가면서 말이다. 그리고 그 과정에서 보안은 무시되기 쉽다. 여기서 설명하려고 하는 XSS(Cross Site Scripting)가 전형적인 예다. 별 것도 아닌 버그가 너무나도 광범위하게 존재해서 쉽사리 제거하기도 힘든 지경에 이르렀다. 일종의 전신에 퍼진 암처럼 XSS가 없는 웹 페이지에는 ‘XSS Free’ 마크라도 만들어서 붙여줘야 하는 것이 아닌가 생각된다.

어떤 분야이든 전문화가 이뤄지면 전문화된 용어를 갖게 되는데 XSS는 웹 애플리케이션 해킹을 하는 사람들이 사용하는 전문 용어로서 그 단어 자체의 의미는 그렇게 중요하지 않다.

단지 XSS가 무엇인지만 이해하면 되는 것이다. 의사들이 쓰는 전문 용어를 보면서 왜 그렇게 어려운 용어를 사용할까 생각해 본 적이 있을 것이다. 필자의 경우 고민 후에 얻은 결론은 ‘그냥 어쩌다 보니까 그렇게 되었을 것이다’라는 것이다. XSS 또한 그냥 어쩌다 보니 붙여진 이름으로 엄밀히 말해서 그렇게 정확한 용어는 아니다.

세상은 보안의 측면에서 보았을 때에 의외로 허술한 구석이 많다. 사실 보안이라는 개념은 아주 일상적인 개념이다. 보안의 시작은 사적 소유에서부터 시작되는데 자신의 소유물을 타인으로부터 지키려는 행위를 의미하는 것 같다. 하지만 현실 세계에서 이러한 보안의 개념은 형편없이 구현되어 있다.

웬만한 자동차는 30초 내에 문이 열리고 사실 가정마다 설치된 자물쇠는 이론상으로 열릴 수밖에 없는 구조다. 그리고 벽으로 막기 힘든 전자파들에 의한 정보 유출도 있으며 무선랜에 의한 보안성의 상실이 있을 수도 있다. 이렇게 허술한 보안성의 상실을 일으키는 여러 요소들과 어깨를 나란히 할 만한 문제가 바로 ‘XSS’이다. 이만큼 파급 효과가 큰 문제이니 만큼 독자들 대부분은 XSS라는 문제를 이미 몇 번은 경험해 봤을 것이다.

XSS의 정의

먼저 공식적인 XSS의 정의부터 알아보기로 한다. 악의적인 사용자가 만든, 동적으로 생성되는 웹 페이지에서 악의적인 HTML 태그나 스크립트가 포함될 수 있다. XSS는 웹 애플리케이션에 클라이언트로부터 악의적인 데이터를 받아들일 때에 발생할 수 있다. 이렇게 받아들여진 데이터는 다른 클라이언트가 그 페이지에 접근할 경우에 전달 되게 되고, 이 클라이언트는 정상적인 데이터로 인식하고 그 내용을 인터프리트(interpret)하게 된다. 즉, 웹 애플리케이션을 매개로 하여 다른 사용자의 브라우저에서 스크립트 실행이 가능해지는 것이다.

결과적으로 DOM(Document Object Model) security restrictions을 건너뛰어 명령 실행이 가능해진다. DOM은 스크립트가 동적 웹 컨텐츠에 수정을 가하는 데에 대한 개념적인 프레임워크로서 웹 브라우저의 보안 셋팅에 의해 구현되어 있다(http://www.w3.org/DOM/). 이러한 태그나 스크립트는 웹 서버가 입력이나 출력을 제대로 필터링하지 못할 경우에 의도하지 않은 스크립트를 실행하도록 할 수 있다.

대부분의 웹 브라우저들은 웹 페이지에 삽입된 스크립트를 해석하고 실행할 수 있다. 이러한 스크립트는 자바스크립트나 VB스크립트로 짜여진 경우가 많다. 최근에 이러한 스크립트는 웹의 필수 구성요소가 되어 있어서 웹 브라우저는 디폴트로 이러한 스크립트를 실행하도록 해놓는다. XSS는 크로스-플랫폼한 문제이고 복잡하게 연결된 시스템들의 여러 구성요소 사이의 예상하기 어려운 상호작용에 의해서 발생한다.

XSS는 Cross Site Scripting의 준말이니 앞에서 언급했듯이 용어 자체는 이러한 현상에 대한 적절한 표현은 아니지만 초기에 이 용어로 굳어져서 사용하고 있다. 이 문제의 핵심은 동적 페이지에서 보여지는 페이지에 신뢰할 수 없는 내용이 들어갈 수 있다는 점이다. XSS가 발생하면 서버나 클라이언트 양자 모두 이 문제가 발생했는지에 대해 인지하기 어렵고 따라서 방어하기도 힘들다. 이러한 스크립트는 부적절한 시큐리티 컨텍스트(security context)에서 부적절한 권한으로 실행된다.

공격 대상

사용되는 태그

태그를 사용해 스크립트 실행이 이뤄지게 된다. <표 1>과 같은 태그들을 사용해 스크립트를 실행시킬 수 있다. 웹 공격자들이 가장 즐겨 사용하는 태그는 역시

This is the end of my message.

client-to-itself 방식

또 하나는 client-to-itself 방식이다. 악의적인 코드가 공격 대상이 되는 클라이언트 자신이 보내서 자신이 되돌려 받는 유형이다. 이러한 형태의 공격은 주로 이메일이나 웹 페이지를 통해 링크를 제시하고 사용자가 그러한 링크를 클릭하도록 유도하는 방식으로 이뤄진다.

[1] 매개체

- 이메일이나 뉴스그룹의 메시지를 신뢰할수 없는 링크들

- 다른 웹 사이트나 웹 보드, 인스턴트 메시지로부터의 링크

- 악의적인 코드가 포함된 하이퍼링크의 형태로 전달된다.

- 공격자는 악의적인 코드를 인코딩해서 보내므로 쉽게 식별하기가 힘들고, 사용자가 클릭할 확률이 높아진다.

[2] 자동화

사용자의 개입을 최소화하기 위해 다음과 같은 자동화 태그를 사용할 수 있다.

&

&{[code]};