Paragraph Separator(U+2029) XSS

Gareth Heyes가 재미있는 XSS 트릭을 하나 공유했는데요. Browser가 이를 처리하는 방식을 잘 생각해보면, 여러 형태로 우회하는데 사용할 수 있을 것 같단 느낌이 들었습니다.

간단한 내용이니 한번 같이 살펴보시죠 😎

U+2029 XSS

#!@*%
alert(1)

일반적으로 위와 같은 생긴 코드를 눈으로 본다면 절대 실행되지 않을거라 생각하실겁니다. 그럼 한번 복사해서 브라우저에 붙여넣어볼까요?

??!?!?

네 alert이 발생합니다. 이는 $alert 사이에 있는 특수문자 <U+2029> 즉 Paragraph Separator로 인해 브라우저가 이를 잘라서 인식했기 떄문에 동작합니다.

 #!@*%<U+2029>alert(1)

그래서 실제론 #!@*%alert을 별개의 라인으로 처리된다고 생각하시면 좋습니다.

#!@*%
alert(1)

위 코드를 복사해서 hex 뷰어나 raw 단위까지 출력하는 에디터로 보면 <U+2029> 또는 e2 80 a9 값이 있는 것을 보실 수 있습니다.

Paragraph Separator

Paragraph Separator, 즉 U+2029는 문자 분리를 위한 Unicode 값으로 실제 웹에선 잘 사용되지 않는 문자이긴 합니다. 다만 우리는 이러한 값들을 이용해서 우회할 떄 사용해야하기 떄문에 하나 알아두시면 나중에 한번쯤은 도움이 되지 않을까 싶네요.

Type Code
Unicode U+2029
HTML &#8233;
CSS \2029

More case? Go IDN Chars

여러 케이스를 찾고 싶다면 IDN Char list를 보시는 것을 추천드립니다. 아마 구글링 해보시면 많이 나오겠지만, 일단 제가 정리헀던 글들 몇개를 뽑아보면 이정도 있을 것 같네요. (제 글 찾기도 힘드네요… 나머진 못찾겠습니다 😅)

https://www.hahwul.com/phoenix/idn/

References

  • https://twitter.com/garethheyes/status/1489614655043649536
  • https://unicode-table.com/en/2029/
  • https://www.hahwul.com/phoenix/idn/