Anti-XSS Bypass & 대응방안

심야·2023년 7월 14일
0

Anti XSS Bypass

White List 기반 필터링

특수문자를 사용해야 한다면, 화이트리스트 필터링을 적용해 허용해도 안전한 일부 태그와 속성을 제외한 모든 값을 필터링한다.

Black List 기반 필터링

White List와 반대로 지정한 태그, 속성, 특수문자 등에 대해서만 필터링 처리를 한다.

White List 필터링 우회

허용해도 안전한 일부 태그, 속성 이외에 모든 내용을 필터링 해 안전해 보이지만 필터링을 통해 나타나는 데이터에서 우회 방법이 있을 수 있다. 필터링을 공백으로 바꾸거나 다른 문자열로 만드는 필터링은 위험하다.

Input : <script>alert('xss')</script>
Output : alert('xss')

위 예시처럼 script 태그가 들어갔을 때 공백으로 변경하는 필터링은 공백으로 변경하는 순간을 노리면 아래처럼 새로운 공격코드를 만들 수 있다.

Input : <scr<script>ipt>alert('xss')</scr</script>ipt>
Output : <script>alert('xss')</script>
Input : ";alert('xss');//
Output : filter="alert('xss')

따라서 화이트 리스트 필터링을 사용한다면 반드시 공백 또는 다른 문자열이 아니라 '' 빈 문자열로 필터링 해야한다.

Black List 필터링 우회

  1. Client Side 검증 우회

    클라이언트 측에서 자바스크립트를 이용해 XSS 공격을 검증한다면 버프 스위트에서 응답 값을 변조해 우회 가능하다. 예를 들어 <script>&lt;script&gt; 로 대응한다면 버프 스위트와 같은 프록시 도구를 이용해 응답 값 &lt;script&gt; 를 다시 <script> 로 변경해 우회한다.

  2. Script Load 우회

    웹 브라우저가 웹 페이지를 로드할 때 웹 페이지에 포함된 자바스크립트 파일을 다운로드한다.

    ", ', alert() , 특정 패턴 등 특수문자와 자바스크립트 함수를 애매한 방식으로 필터링 한다면 공격자 서버에서 직접 악성 스크립트가 포함되어 있는 자바스크립트 파일 (ex. )을 로드해 필터링을 우회할 수 있다.

  3. 대소문자 혼용 우회

    소문자 혹은 대문자만 필터링 한다면 <script> 대신 <ScRiPt> 등 소문자와 대문자를 섞어 우회한다.

  4. 특정 문자 필터링 우회

    <script> 문자열을 필터링 한다면 문자열 안에 다시 script 문자열을 넣어 <scrscriptipt> 문자열로 작성해 우회한다.

  5. Event handler 우회

    <img src=x> 같이 특정 이벤트 핸들러를 사용하지 못한다면 onactivate, onload 등 대체할 수 있는 이벤트 핸들러를 사용한다.

    Cross-Site Scripting (XSS) Cheat Sheet - 2023 Edition | Web Security Academy

  6. HTML 태그

    이미지 태그와 같이 특정 태그를 사용하지 못한다면 <svg>, <audio src="hacker.com" autoplay> 처럼 다양한 태그와 이벤트 핸들러를 혼합해 우회한다.

  7. Cheat Sheet

    Cross-Site Scripting (XSS) Cheat Sheet - 2023 Edition | Web Security Academy

XSS 대응 방안

  1. HTML Entity Encoding

    사용자 입력 값이 HTML 태그가 될 일이 없다면 꺽쇠 (<, >) 따옴표(”, ‘)와 같은 특수 문자를 HTML Entity Encoding 을 이용해 태그로 인식하지 않도록 Escape 한다.

  2. 화이트 리스트 필터링

    만약 사용자 입력 값에 HTML 형태를 지원해야 한다면 화이트 리스트 필터링을 해야한다. 허용해도 안전한 일부 태그, 속성을 제외한 모든 값을 필터링하는 방식이다. 만약 게시글에 img, video, a 태그만 필요하다면 3개 태그를 제외한 모든 태그는 필터링 한다. 사용자 입력 값을 필터링 할 때 유의할 점은 요청의 URI Query 값이나 POST Body 값만 필터링하는 것이 아니라 User-Agent, Referer와 같은 헤더, 글 수정 모두 포함하여 사용자로부터 입력된 값에 모두 적용해야 한다.

    • HTML sanitizing library Mozilla 에서 제작한 HTML 필터링 라이브러리로 bleach 외에도 다양한 라이브러리가 있다. https://github.com/mozilla/bleach

TIP. HTML Editor를 사용하는 게시판

html 에디터를 사용하는 게시판은 html entity encoding 을 사용할 수 없다. 이런 경우 <, " 같은 특수문자는 html entity encoding 을 이용해 치환한다. 이후 화이트 리스트 필터링으로 꼭 필요한 태그는 허용하고 블랙 리스트 필터링으로 이벤트 핸들러를 필터링한다.

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글