Offcanvas

검색|인터넷 / 보안 / 애플리케이션 / 통신|네트워크

"공격은 쉽고 방어는 더 쉽다"··· 크로스 사이트 스크립팅의 이해

2018.04.23 J.M. Porup  |  CSO
2005년 10월 4일의 아침은 춥고 청명하게 밝았다. 세계 어딘가에서는 그랬다. 당시 세계를 지배하던 SNS 플랫폼인 마이스페이스(MySpace)의 사용자는 일어나자마자 잠에서 덜 깬 눈으로 로그인 했다. 새로운 사람과 친구를 맺기 위해서다. 그 중 한 명이 새미 캄카였다. 더 많은 친구를 원한 그는 자신의 마이스페이스 프로필에 크로스 사이트 스크립팅(XSS) 악성코드를 심었다.



지금은 '새미 웜(Samy worm)'이라고 불리는 이 자바스크립트는 자동으로 방문자와 친구를 맺고 “새미는 내 영웅이야!”라는 메시지를 띄웠다. 마이스페이스에서 나서서 이 스크립트를 중단시키기 전까지 단 24시간동안 새미는 100만 명의 새 친구가 생겼다. 지금도 널리 회자되는 이 사례는 웹 애플리케이션의 취약함과 사용자 입력 검증 실패가 만났을 때의 결과가 어떤지를 잘 보여준다.

XSS 취약점이란
XSS 공격이란 웹 형태나 웹 애플리케이션 URL에 입력된 악성 코드로 해당 애플리케이션이 엉뚱한 행동을 하게 만드는 공격 행위이다. 예를 들면, 사용자 이름 입력을 요청하는 웹 애플리케이션 양식에 다음 내용을 입력해보라.

<script>alert;("I'm a reflected XSS attack!")</script>

엔터를 클릭했을 때 “I'm a reflected XSS attack!(반사 XSS 공격이다!)”라는 팝업 메시지가 떴다면, 요새의 문이 활짝 열렸고 경비는 그늘에서 졸고 있다고 보면 된다. 물론 오늘날 이 정도로 취약한 웹 애플리케이션은 거의 없다(그럴 것이다). 그러나, 사이버 공격자와 방어자 간의 경쟁이 심화하면서 해커는 웹 애플리케이션 '갑옷'에서 악용할 만한 새로운 빈틈을 찾아냈다. XSS 공격이 성공하면 사용자 개인과 소속 회사에 심각하고 불쾌한 결과를 일으킬 수 있다.

XSS 공격에 대한 정식 정의를 확인해 보자. OWASP(오픈소스 웹 애플리케이션 보안 프로젝트) 10대 취약점에서 볼 수 있다. 이에 따르면, "XSS 결함은 애플리케이션이 신뢰할 수 없는 데이터를 적절한 확인이나 회피 없이 새로운 웹 페이지에 포함할 때마다 발생한다. 또는 HTML이나 자바스크립트를 생성할 수 있는 브라우저 API를 사용해 사용자가 제공한 데이터로 기존 웹 페이지를 업데이트하는 경우에도 항상 발생한다. XSS 공격자는 희생자의 브라우저에서 스크립트를 실행할 수 있다. 그 결과 사용자 세션을 탈취해 웹사이트 외관을 바꾸거나 사용자를 악성 사이트로 보낼 수 있다". 사용자 입력을 검증해야 하는 이유다.

캄카는 스크립트로 장난을 좀 쳤을 뿐이고 나쁜 의도는 분명 없었다. 그러나 OWASP에 따르면, 같은 종류의 XSS 취약성이 전체 웹 애플리케이션 중 3분의 2 이상을 계속해서 괴롭히고 있으며 SQL 인젝션(SQL Injection) 다음으로 가장 흔한 공격이다.

“XSS”이라는 용어는 지난 15년 내지 20년 동안 의미가 크게 변화했다. 이 때문에 XSS라는 용어 대신 '웹 페이지 생성 중 부적절한 입력 무력화(Improper Neutralization of Input During Web Page Generation)'라는 표현을 쓰기도 한다. 다시한번 강조하면 사용자 입력은 반드시 확인해 악성코드라면 무력화해야 한다. 사실 XSS는 널리 알려진 공격 벡터로, 인터넷 시대를 기준으로 하면 거의 고대 유물에 해당한다. 이런 공격조차 막지 못한다는 것은 주의 의무를 게을리하고 있다는 뜻이기도 하다.

XSS의 종류
XSS 공격은 (다소 겹치는 부분이 있는) 3가지 영역으로 구성된다. 반사 XSS(reflected XSS, 지속성 없음), 저장 XSS(stored XSS, 지속성 있음), 문서 객체 모델(DOM) 기반 XSS(DOM-based XSS) 등이다. 반사 XSS는 피싱(phishing) 사기의 일부로 자주 사용된다. 악용하기 가장 쉽지만 방어하기도 가장 쉽다. 반사 XSS의 가장 기본적인 사례는 캄카의 예로 살펴봤다. 공격자가 악성 콘텐츠를 HTTP 요청에 주입하면 결과가 사용자에게 다시 “반사”되는 것이다.

공격자는 당연히 스스로를 악용하고 싶어할 가능성이 낮다(자신을 악용하고 싶다면 프로이트를 공부한 정신과 의사에게 진찰을 받아야 할 것이다). 대신 공격자는 희생자가 그러한 링크를 클릭하도록 유도할 수 있다면 그들의 세션을 탈취할 수 있다. 그래서 반사 XSS는 피싱 공격에서 흔하게 발견된다. 예를 들면, 공격자는 취약한 웹 애플리케이션을 악용하는 악성 URL을 만든 후 피싱 등의 사회 공학 기법을 이용해 웹 애플리케이션의 정상적인 사용자가 악성 링크를 클릭하게 유도한다. 그러면 악성 코드가 웹 애플리케이션을 통해 희생자에게 반사돼 희생자의 웹 브라우저에서 실행된다.

저장 XSS(또는 지속) 공격은 공격자가 웹 애플리케이션으로 하여금 악성 코드를 해당 웹 애플리케이션의 데이터베이스에 저장하도록 유도할 때 발생한다. 서버에 저장된 악성 코드는 시스템 자체를 공격하기도 하고 악성코드를 웹 애플리케이션의 사용자 전체나 다수에게 전달하기도 한다. 흔한 사례는 (블로그가 한참 유행하던 때에) 블로그의 댓글에 악성 코드를 올리는 것이다. 블로그에 방문하는 사람이라면 누구나 그 악성 코드의 희생자가 된다. 지속 XSS가 가장 위험한 종류인 이유다. 모든 사용자를 공격할 수 있는데 굳이 한 사람만 공격할 이유가 없는 것이다.

세 번째이자 가장 최신(2005년이 “새롭다”고 본다면) 종류의 XSS 공격은 DOM 기반이다. 반사 XSS나 저장 XSS와 달리 웹 애플리케이션 서버 측이 아닌 클라이언트 측 코드(자바스크립트인 경우가 많다)를 공격해 희생자의 브라우저에 악성 코드를 실행시킨다.


신뢰 문제: 사이트 간 스크립팅 방어
XSS에 대응하는 최고의 격언은 “사용자 입력을 신뢰하지 마라”는 말이다. 웹 애플리케이션에는 사용자 입력에 신뢰 문제가 있을 수 밖에 없고 이 점은 앞으로도 절대 변하지 않을 것이다. 다행스러운 점은 XSS가 매우 오래된 공격 벡터이기 때문에 필요한 방어 도구가 잘 개발됐고 사용하기 쉽다는 것이다.

또한, 신뢰할 수 있는 입력은 화이트리스트에 올리는 것이 좋다. 블랙리스트는 약점이 있어서 결국에는 실패하고 만다. 자신의 웹 애플리케이션에 안전한 입력은 어떤 것인지 판단해서 나머지는 거부하거나 회피하는 것이 바람직하다. OWASP 문서에 따르면 “첫 번째 규칙은 전체를 거부하는 것이다. 영순위 규칙의 이유는 HTML 내에 이상한 문맥이 너무 많아서 회피 규칙 목록이 매우 복잡해진다".

자바스크립트는 특히 더 그렇다. OWASP는 다음과 같이 강조했다. “가장 중요한 것은 신뢰할 수 없는 출처로부터 실제 자바스크립트 코드를 받아들여서 실행하면 절대로 안된다는 점이다. 예를 들면 자바스크립트 코드 스니펫(snippet)이 포함된 ‘콜백(callback)’이라는 매개변수가 있다. 아무리 많은 회피라도 그것을 해결할 수 없다.”.

XSS와 CSRF의 차이
XSS와 크로스 사이트 요청위조(CSRF)는 희생자의 브라우저를 표적으로 한다는 공통점이 있다. 단, 차이점은 CSRF는 은행 계정에 로그인 되어 있는 경우처럼 사용자의 인증된 세션을 악용하는 반면 XSS는 인증된 세션이 없어도 작용한다는 점이다. 트위터와 온라인 뱅킹에 동시에 로그인 되어 있는 상태에서 다음과 같은 트위터 링크를 클릭했다고 하자.

http://www.yourbank.com/sendmoney,do?from=you&to=attacker&amount=5000

해당 은행의 세션 토큰 관리 방식과 사용 브라우저의 종류에 따라 사용자의 계좌에서 5,000달러가 빠져나갈 수 있다. XSS가 더 위험한 공격 벡터이지만 XSS와 CSRF를 둘 다 방어하는 것이 중요하다. CSRF 방어 보안 대책에 대한 자세한 내용은 'OWASP CSRF 방어 안내서'를 참고하면 된다.

XSS가 공격할 경우
XSS는 웹 애플리케이션을 악용하려는 공격자가 손쉽게 사용할 수 있지만 주의를 기울이면 쉽게 막을 수 있다. 새미 웜은 아무에게도 피해를 주지 않은 선한 해킹 프로그램이었다. 그러나 똑같은 종류의 취약성이 나중에 악의를 품은 스파이와 갱스터에 의해 매일 사용되고 있다. 새미 웜이 생긴지 10년이 지난 지금 XSS 공격의 위험을 완화하지 못한다는 것은 그것은 중대한 과실이다. ciokr@idg.co.kr 
CIO Korea 뉴스레터 및 IT 트랜드 보고서 무료 구독하기
추천 테크라이브러리

회사명:한국IDG 제호: CIO Korea 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아01641 등록발행일자 : 2011년 05월 27일

발행인 : 박형미 편집인 : 천신응 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.