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 | 
 |
CSS | \2029 |
More case? Go IDN Chars
여러 케이스를 찾고 싶다면 IDN Char list를 보시는 것을 추천드립니다. 아마 구글링 해보시면 많이 나오겠지만, 일단 제가 정리헀던 글들 몇개를 뽑아보면 이정도 있을 것 같네요. (제 글 찾기도 힘드네요… 나머진 못찾겠습니다 😅)
References
- https://twitter.com/garethheyes/status/1489614655043649536
- https://unicode-table.com/en/2029/
- https://www.hahwul.com/phoenix/idn/