브라우저와 서버의 path 해석을 다르게 하여 임의의 파일을 브라우저에 로드하게 하는 공격 방식입니다. 예를들어 다음과 같은 URL이 있다고 생각해봅시다.
http://www.test.com/path/to/script.js
이제 이 URL을 다음과 같이 바꾸어 브라우저에 입력했다고 생각합시다. 일반적인 상식에 따르면 해당 페이지는 404에러가 뜰 것입니다. /을 %2f으로 url encoding했기 때문입니다.
http://www.test.com/path%2fto%2fscript.js
하지만 몇몇 사이트에서는 위와 같이 /을 %2f로 바꾸어도 script.js 파일에 정상적으로 접근이 가능합니다. 서버가 path를 해석하는 과정에서 %2f를 /으로 변환하여 해석하기 때문입니다. 이는 여러가지 원인이 있을 것 같습니다. 커스텀 http server를 사용하는 경우는 http server 자체에서 path를 저렇게 해석하는 경우도 있고, URL rewrite 과정에서 %2f가 /으로 바뀌는 경우도 있습니다.
일반적인 경우라면 이런 버그는 큰 의미가 없습니다. 하지만 index.html에서 script.js 파일을 relative하게 로드하면 이는 취약점으로 바뀝니다.
//index.html
<html>
<script src = "path/to/script.js"></script>
</html>
해커가 victim에게 다음과 링크를 보냈고, victim이 링크를 클릭했다고 생각해봅시다.
http://www.test.com/path/anywere/you/want/..%2f..%2f..%2f..%2findex.html
서버는 ..%2f를 ../으로 해석합니다. 따라서 서버에서 해석한 Path는 다음과 같습니다.
--> http://www.test.com/path/anywere/you/want/..%2f..%2f..%2f..%2findex.html
--> http://www.test.com/index.html
즉 서버에서는 index.html을 보냅니다. 이제 브라우저는 index.html 내에 있는 script 태그를 통해 js 파일을 로드할 것입니다. 이제 브라우저가 js 파일을 로드하는 방식을 봅시다. 브라우저는 ..%2f을 상위 경로로 해석하지 않기 때문에 다음과 같은 js 파일이 로드됩니다.
http://www.test.com/path/anywere/you/want/script.js
이제 서버 상에 있는 임의의 js 파일을 로드할 수 있습니다. 만약 서버에 js 파일을 올릴 수 있다면 XSS를 트리거할 수 있습니다. 만약 respose를 컨트롤할 수 있는 페이지가 있다면 callback을 활용할 수도 있습니다.
만약 js 파일이 아니라 CSS 파일을 로드한다면 더 쉽게 공격이 가능합니다. 문법에 어긋나는 구문이 오면 에러를 발생시키는 javascript와 달리 CSS는 문법에 어긋나는 구문이 오면 무시하고 다음 구문을 실행하기 때문입니다. 따라서 CSS Injection이 가능합니다.
; , %2f, %2e 등 서버와 브라우저의 경로 해석을 다르게 하는 문자는 여러가지가 있지만, 가장 잘 통하는 방법은 URL encoding을 통하는 방법인 것 같습니다. 실제 서비스 중인 웹서버에서 실험하면 생각보다 많은 사이트에서 URL encoding을 해도 파일을 정상적으로 로드합니다.
참조
'WEB' 카테고리의 다른 글
Redpwn CTF 2020 / post-it-notes (0) | 2020.06.23 |
---|---|
Web cache deception attack (0) | 2020.05.27 |
SOP, CORS, CSP (0) | 2020.04.21 |
javascript proto pollution (3) | 2020.03.05 |