본문 바로가기

WEB

Relative Path Overwrite

브라우저와 서버의 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을 해도 파일을 정상적으로 로드합니다. 

 

참조

www.mbsd.jp/Whitepaper/rpo.pdf

'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