웹 보안

크로스 사이트 스크립트(XSS; Cross-Site Script)

SojuMan 2009. 9. 25. 14:11
http://immyu.egloos.com/1472088(펌)

쿠키가 널리 쓰이고 유용해지는 반면, 브라우저에서 쿠키를 꺼놓는 사람도 늘어나고 있다.
쿠키는 사용자 이름, 암호, 신용카드 번호 등의 중요한 정보를
텍스트 형태로 저장하기 때문에 접근이 쉽다.
따라서 쿠키를 꺼놓는 것도 어찌 보면 당연한 일인 것이다.
웹사이트와 관련된 가장 큰 취약점은 크로스 사이트 스크립트(XSS) 공격이다.

* XSS 공격 과정(이메일/게시물 링크)

 이러한 링크가 쿠키를 사용하는 공식 사이트로 정상적으로 연결된다.
 그런데 이 링크에 문자열이 덧붙여져 전송된다.
 대부분의 경우 이런 URL을 종종 본 적이 있기 때문에 별 의심을 하지 않는다.
 하지만 추가된 문자열로 인해 그 후에 방문하는 모든 쿠키를 가로챌 수 있다.
 그리고 이렇게 가로챈 문자열을 document.location 리다이렉트에 덧붙여 전송할 수 있다.
 즉, 자신도 모르는 사이에 제3의 사이트로 쿠키 값이 전송될 수 있다.

 이러한 사이트들은 공식 사이트와 유사한 모습을 하고 있다.
 따라서 중요한 정보를 별다른 의심없이 입력할 것이고,
 이로 인해 암호, 계좌 정보, 신용카드 번호와 같은 정보가 유출될 수 있다.

 이러한 것을 이메일-피싱(E-mail Fishing) 수법이라고 하며 최근들어 심심찮게 일어나고 있다.
 정보를 빼내가지 않는 경우라 하더라도 악의적인 코드를 심어
 로그인이 제대로 동작하지 않게끔 하는 경우도 있다.

* 악의적 코드의 삽입

1. 크로스 사이트 스크립트 ; 자바스크립트/스크립트 인젝션

   사용자 정보를 URL에 덧붙이고 이에 접근하거나 이를 변경할 자바스크립트 코드를 삽입한다.
   흔히 사용하는 수법은 다음과 같다.
   얻은 정보를 사용해 트랜잭션이 일어나는 공식 페이지(예) 인터넷 뱅킹)와 유사한
   페이지를 만들고 여기에 정보를 가로채는 기능을 추가하는 것이다.

2. SQL 인젝션

   잠재적으로 가장 큰 위험을 안고 있는 인젝션 공격이다.
   사용자로부터 입력받은 폼의 데이터를 DB 질의에 그대로 덧붙이는 경우가 많다.
   한 질의의 끝과 그 다음 질의의 시작을 흉내내는 SQL을 추가하는 것은 아주 간단하다.
   이를 사용해 DB에 저장된 신용카드 번호나 일반 텍스트로 저장된 암호 정보를 얻어낸다.
   이러한 방법이 발견되고 나서 다수의 PHP 기반 프로그램들에서 취약점이 발견되었다.
   그리고 불행히도 매주 새로운 SQL 인젝션 취약점이 발견되고 있다.

3. HTML 임베딩, 악의적인 태그 인젝션

   데이터에 위험하거나 악의적인 태그를 집어놓어 동적 페이지를 생성 시 로드되도록 한다.
   블로그 댓글에 하이퍼텍스트 링크를 집어넣을 수 있게 허용한 경우,
   여기에 악의적인 사이트로 연결되는 링크를 심어놓을 수 있다.
   단순히 HTML 링크만 삽입할 줄 알면 이를 악용할 수 있다.

* 대비책

 사용자 입력에서 가급적 HTML 태그(특히 스크립트,이미지,링크)를 제거하는 것도 좋다.
 사용이 허락되지 않은 HTML 태그는 모두 인코딩 되도록 해야 한다.
 < > 는 &lt; &gt;로 변환함으로써 HTML 태그를 열고 닫는 기호로 사용되지 못하게 해야 한다.
 
 서버측 보안을 강화하는 방법은 수없이 많다.
 PHP 및 여러 언어를 사용한 방법과
 html specialchars(HTML 소스를 단순 문자열로 변경)와 같은 API 함수를 사용하는 방법 등이 있다.
 하지만 서버로 들어오는 공격을 방어하기에 앞서, 자바스크립트를 사용해
 사전에 데이터를 1차적으로 점검해서 차단하는 것이 좋다.

* 참고 사이트

1. 악용될 수 있는 컨텐츠 개선 방법(CERT 제공)

   http://www.cert.org/tech_tips/malicious_code_mitigation.html

2. 크로스 사이트 스크립트 관련 정보(위키피디아 제공)

   http://en.wikipedia.org/wiki/XSS

3. XSS 컨닝 페이퍼(ha.ckers.org 제공)

   http://ha.ckers.org/xss.html