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

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

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

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

working??

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

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

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

Javascript Entity Syntax

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

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

Regular HTML value:

<body background="image1.gif">

JavaScript entity value:

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

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

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

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