본문 바로가기

SEC/DH

[WEB] XSS 우회 #1

XSS 공격을 방어하기 위한 다양한 패치와 필터링이 존재한다.

그러나 XSS 방어가 올바르게 수행되지 않았을 때 이를 우회할 수 있는 방법도 다양하다.

 

이벤트 핸들러 속성

자바스크립트 코드를 실행할 수 있는 HTML 태그는 <script> 이외에도 많이 존재한다.

보통 태그의 속성 값으로 스크립트를 포함할 수 있는 경우가 존재하며, 이벤트 핸들러를 지정하는 on 으로 시작하는 속성들이 있다.

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

따라서 이벤트 핸들러 내에 XSS 유발 코드를 삽입하면 해당 이벤트가 발생했을 때 XSS가 수행된다.

자주 사용되는 이벤트 핸들러 속성은 onload, onerror, onfocus가 있다.

 

1. onload 이벤트 핸들러

유효한 이미지 로드 후 onload 핸들러 실행 O
<img src="https://example.com/a.jpg" onload="alert()">

이미지 로드 실패 시 onload 핸들러 실행 X
<img src=x onload="alert()">


2. onerror 이벤트 핸들러

유효한 이미지 로드 후 onerror 핸들러 실행 X
<img src="https://example.com/a.jpg" onerror="alert()">

이미지 로드 실패 시 onerror 핸들러 실행 O
<img src=x onload="alert()">


3. onfocus 이벤트 핸들러

input 태그에 포커스 되면 onfocus 핸들러 실행
autofocus로 자동으로 포커스 수행 또는 URL hash 부분에 id 속성 값 입력
(e.g http://example.com/#ID)
<input type="text" id="ID" onfocus="alert()" autofocus>

 

 

문자열 치환

XSS 필터링 시 문자열을 공백으로 치환하는 방식에 대한 우회 기법이다.

예를 들어 script를 공백으로 치환하는 필터링이 존재할 시 <scscriptript> 입력을 통한 필터링 우회가 가능하다.

문자열 치환 우회

치환 정규표현식 (/g : 전역 검색, /i : 대·소문자 구분 X)
(x => x.replace(/onerror/g, '')
<img ononerrorerror=alert()> = <img onerror=alert()>

대안방안 : 문자열에 변화가 없을 때까지 치환 반복

문제점 : 특정 키워드만 방어 가능

 

활성 하이퍼 링크

HTML 마크업에 사용할 수 있는 URL들은 활성 컨텐츠를 포함할 수 있다.

이 중 javascript: 스키마는 URL 로드 시 자바스크립트 코드를 실행할 수 있게 한다.

따라서 URL 을 속성 값으로 받는 img, a, iframe 태그에 사용될 수 있다.

 

1. a 태그 및 iframe 태그 예시

<a href="javascript:alert()">alert!</a>
<iframe src="javascript:alert()">


2. 특수문자를 포함한 우회 (\x01, \x04, \t)

<a href="\1\4jAVasC\triPT:alert()">alert!</a>
<iframe src="\1\4jAVasC\triPT:alert()">


3. HTML Entity Encoding을 통한 우회

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

 

XSS 키워드 필터링 시 javascript: 스키마를 필터링할 때 다음과 같은 우회 방법이 존재한다.

 

1. 브라우저들이 URL을 사용할 때 거치는 과정 중 하나인 정규화를 사용하는 방법

정규화는 동일한 리소스를 나타내는 서로 다를 URL을 통일된 형태로 변환하는 과정으로 \x01, \x04, \t와 같은 특수문자가 제거되고, 스키마의 대소문자가 통일된다.

 

2. HTML 태그 속성 내 HTML 인코딩 수행하는 방법

HTML 태그 속성 내에서는 HTML 인코딩을 사용할 수 있어 XSS 키워드를 인코딩하여 필터링 우회가 가능하다.

 

태그와 속성 기반 필터링

1. 대소문자 구분하지 않는 필터링

대소문자를 혼합하여 XSS 코드 작성

 

2. 잘못된 정규표현식

<script> 태그 내 데이터 존재하는지 검사 : <script src="alert()"></script> (script src 사용)

<img> 태그에 on 이벤트 검사 : <img src=""\nonerror="alert()"> (개행 문자 사용)

 

3. 특정 태그 및 속성 필터링

다른 태그 및 속성을 이용하여 필터 우회

 

 

URL 정규화 확인

function normURL(url) {
	return new URL(url, document.baseURI);
}

normURL('\4\4jAva\tScRIpT:alert(1)')

normURL('\4\4jAva\tScRIpT:alert(1)').protocol

normURL('\4\4jAva\tScRIpT:alert(1)').pathname

 

이벤트 핸들러 종류 및 이벤트 발생 원리 참고

https://developer.mozilla.org/ko/docs/Web/Events

 

이벤트 참조 | MDN

DOM 이벤트는 발생한 흥미로운 것을 코드에 알리기 위해 전달됩니다. 각 이벤트는 Event 인터페이스를 기반으로한 객체에 의해 표현되며 발생한 것에 대한 부가적인 정보를 얻는데 사용되는 추가

developer.mozilla.org

 

'SEC > DH' 카테고리의 다른 글

[WEB] XSS 우회 #2  (0) 2022.07.16
[REV] IDA 사용법  (0) 2022.07.13
[WEB] SQL Injection #1  (0) 2022.07.10
[WEB] XSS (Cross Site Scripting) 테스트  (0) 2022.03.21