Javascript Entity XSS에 대한 이야기(old…style…not working)

이런 형태의 xss 코드를 보신적이 있나요? 최근에 이 XSS 페이로드로 트윗에서 의견을 좀 나눴었는데, 그 내용 정리해서 포스팅해봅니다.

1
2
<br size="&{alert(45);}">

(아 물론 여러 페이로드 정리된 사이트에 존재하는 공격코드입니다.

working??

결론부터 이야기드리면, 실행되지 않는 페이로드입니다.

가장 애매했던게, 유효하단 사람들이 있는 상태에서 저만 이게 안되는건가 싶어 여러가지 환경에서 테스트해봤는데요, 구형 브라우저(Netscpe ≤4 , 여러가지 아주 구형 브라우저에서만 동작합니다.

물론 이 페이로드가 현재도 유효했다면, 어마어마하게 파생된 XSS 코드가 만들어졌을테고, 정말 총체적 난국이였을 것 같습니다. (비슷한 사례로 style 관련 페이로드들이 있죠)

Javascript Entity Syntax

동작하진 않지만, 원리가 무엇인지 알아보기나 합시다. 여기서 HTML 속성에 &{} 형태로 구문을 넣는것을 Javascript Entity라고 부릅니다. (되게 범용적인 이름이네요…ㅋㅋ)

아무튼간에, 이를 이용해서 구형 브라우저에선 아래와 같이 어떤 속성이던 스크립트 구문을 넣을 수 있었습니다.

Regular HTML value:

1
2
<body background="image1.gif">

JavaScript entity value:

1
2
<body background="&{JavaScript-statements };">

물론 이 방식이 개발상 이점을 많이 가져왔을겁니다. 지금은 저런걸 처리하기 위해 해당 Object의 id, class 등을 찾아서 처리해줘야하기 떄문에 코드가 좀 늫어났겠죠. 다만 지금은 코드의 간결성이 중요한 시대는 아니기 때문에(옛날에는 적은수의 코드가 멋이였다면, 지금은 예쁘게 잘 짠 코드가 중요한 코드라고 보이네요) 뭐 크게 상관 없겠지만요.

JavaScript, the Definitive Guide에는 Javascript in Nonstandard Context 부분에 명시되어 있습니다.

1
2
3
4
5
6
7
12.2.5. JavaScript in Nonstandard Contexts
Both Netscape and Microsoft have implemented proprietary extensions in their browsers, and you may occasionally see JavaScript code in a context other than those described here. For example, Internet Explorer allows you to define event handlers in a <script> tag that uses special forand event attributes. Netscape 4 allows you to use JavaScript as an alternative syntax for defining CSS style sheets within a <style> tag. Netscape 4 also extends the HTML entity syntax and allows JavaScript to appear within entities (but only within the values of HTML attributes). This can result in HTML that looks like this:

<table border="&{getBorderWidth( )};">

Finally, Netscape 4 also supports a form of conditional comment based on this JavaScript entity syntax. Note that Netscape 6 and the Mozilla browser on which it is based no longer support these nonstandard uses of JavaScript.

어찌되었던 현재의 웹 환경에선 우회 기법으로 사용할 수 없는 XSS 코드입니다.

Conclusion

우선은 동작하지 않는 XSS 페이로드이기 떄문에 없다고 생각하시는게 좋을 것 같습니다만, 간혹 예외적인 케이스가 나타날수도 있습니다.

구형 브라우저의 엔진을 사용하는 잘 알려지지 않은 브라우저나 특정 환경에서 트리거될수도 있어서 알고는 있어야할 것 같습니다.

Reference

http://www.javascriptkit.com/javatutors/entity2.shtml https://docstore.mik.ua/orelly/webprog/jscript/ch12_02.htm

Licensed under CC BY-NC-SA 4.0
Last updated on Jul 10, 2021 01:05 +0900