ITWorld 용어풀이 | XSS(Cross-Site Scripting)

InfoWorld
SNS나 블로그의 흔한 메뉴가 '자기소개'입니다. 입력창에 이름과 메일 혹은 좋아하는 것을 적죠. 그런데 이 간단한 입력창을 이용한 해킹법이 있습니다. 이름 대신 실행 코드를 넣어 개인정보를 빼내거나 시스템을 마비시키는 것이죠. 이런 게 가능할까 싶지만 '실제상황'이랍니다. 2005년의 일명 '새미 웜(Samy worm)' 사건입니다. 새미는 친구를 늘리겠다는 단순한 호기심에 '마이스페이스' 프로필에 자동으로 친구를 맺는 자바스크립트를 넣었습니다. 불과 하루 만에 100만 명을 얻었지만, 역사엔 웜 제작자로 이름을 남겼습니다.



이러한 해킹 방법을 XSS(Cross-site scripting)라고 합니다. 마이크로소프트의 보안 엔지니어가 2000년에 처음 사용한 것으로 알려져 있습니다. 새미 웜은 귀여운(?) 업무 방해였지만 XSS는 매우 위험한 해킹입니다. 다른 사용자에게 보이는 웹페이지에 클라이언트 스크립트를 삽입할 수 있으니까요. 만약 새미가 친구 대신 친구의 개인정보를 원했고 이를 수집하는 스크립트를 자신의 프로필에 넣었다면 수백만 명 개인정보가 유출된 사건이 됐을 것입니다. XSS는 2000년대 이후 가장 심각한 웹 위협 중 하나로 꼽힙니다.

XSS는 크게 3가지 구분됩니다. 반사된 XSS(reflected XSS), 지속적 XSS(persistent XSS), 문서 객체 모델 기반 XSS(document object model based XSS)입니다. 먼저 반사된 XSS는 새미 웜이 대표적입니다. 해커가 HTTP 요청에 악의적인 콘텐츠를 넣으면 그 결과가 다른 사용자에게 '반사', 즉 다른 사용자의 웹 페이지에 나타납니다. HTML 문서는 평면적이고 연속된 구조로 돼 있습니다. 제어 선언과 형식, 실제 콘텐츠는 물론 승인되지 않은 데이터까지 혼합돼 웹 페이지에 표시되죠. XSS가 창궐한 근본 이유이기도 합니다.

지속적 XSS는 더 파괴적이고 위험한 유형입니다. 해커가 삽입한 악의적인 콘텐츠가 서버에 저장돼 영구적으로 정상적인 페이지에 나타납니다. 예를 들어 데이트 웹사이트는 일반적으로 실명과 연락처를 감추고 특정 조건이 될 경우만 볼 수 있는데, 악의적인 콘텐츠가 서버에 저장된 경우 해커가 실명 정보를 수집해 외부로 빼낼 수 있습니다. 피해자를 서드파티 웹사이트로 유인할 필요가 없고, SNS의 경우에는 악성코드를 여러 계정에 걸쳐 자동 증식하게 할 수 있어 해커가 선호합니다.

문서 객체 모델 기반 XSS는 클라이언트만 노린다는 것이 특징입니다. 사용자 경험(UX)이 중요해지면서 클라이언트 애플리케이션이 많이 늘어났고 이와 함께 등장했습니다. XSS는 다양한 변종이 있지만 막는 원칙은 단순합니다. 입력값을 검증하는 것이죠. 코드를 입력해도 실행되지 않도록 하는 것입니다. 이를 '이스케이핑(escaping)'이라고 합니다. XSS는 최근에도 여전히 맹위를 떨치고 있습니다. 이쯤 되면 웹 개발의 금과옥조를 다시 떠올릴 필요가 있겠네요. "사용자 입력을 절대 신뢰하지 마라"

<참고자료>
위키피디아
- MITRE
editor@itworld.co.kr