본문 바로가기

웹해킹/개념

[Dreamhack-web] Exploit Tech: Relative Path Overwrite

서론

일부 웹 어플리케이션은 이용자의 편의성을 위해 url rewrite 기능을 사용한다. 이 기능을 사용하면 http://host/search_user_by_name.php?name=alice와 같은 형태의 url을 http://host/search/alice/와 같은 형태로 훨씬 기억하기 쉽고, 간결하게 만드는 것이 가능하다

 

하지만 이 때 브라우저 입장에서는 URL의 경로 중 어디부터가 파라미터인지 구별할 수 없다. 만약 이용자가 입력한 파라미터를 브라우저가 경로로 인식하여 해당 경로로부터 자원을 불러오게 되면 의도치 않은 동작이 발생할 수 있다.

 

Relative Path Overwrite

Relative Path Overwrite는 일반적으로 서버와 브라우저가 상대 경로를 해석하는 과정에서 발생하는 차이점을 이용한 공격이다.

 

url rewrite 기능을 사용하면 웹 어플리케이션 스크립트명 이하의 경로를 별도로 지정해도 같은 페이지가 조회되는 경우가 존재한다. 예를 들어 /index.php/somepath와 같이 스크립트명 하위로 새로운 경로를 지정해도 서버는 이를 /index.php를 참조하도록 구현되어 있는 경우이다.

 

그런데 이 때 만약 웹 페이지 내부에서 다른 자원을 참조하는 경우, 새로운 문제가 발생할 수 있다.

아래 코드를 살펴보면, 

<script src="/app/main.js"></script>
<script src="app/main.js"></script>

첫 번째 줄과 두 번째 줄 차이는 src 속성 맨 앞에 존재하는 /의 차이가 있다.

첫 번째 줄은 절대경로, 두 번째 줄은 상대경로로 탐색을 한다.

 

이 둘을 rpo.php 위에 작성하고, 접근 방식을 한 번 다르게 해 본다.

 

a. http://host/rpo.php로 접근할 때

둘 다 동일하게 /app/main.js를 호출한다.

 

b. http://host/rpo.php/로 접근할 때

첫 번째 줄은 절대 경로로 탐색해서 /app/main.js를 로드하지만, 두 번째 줄의 스크립트 태그는 현재 경로가 /rpo.php/ 이므로 해당 경로로 시작하여 /rpo.php/app/main.js에 존재하는 파일에 대해 요청하게 된다.

 

즉, index.php의 페이지 내용을 자바스크립트의 내용으로써 사용할 수 있게 된다.

 

Relative Path Overwrite 공격 예시

RPI는 일반적으로 자바스크립트나 스타일시트 코드를 로드하는 과정에서 경로 해석의 문제로 인해 발생한다. 따라서 임포트하는 페이지의 내용을 조작시킬 수 있다면 공격자가 의도한 자바스크립트, 스타일시트 코드를 로드시킬 수 있다.

 

자바스크립트와 연계

만약 RPO 취약점으로 로드하는 자바스크립트 코드의 앞 부분을 공격자가 조작할 수 있다면, XSS 공격으로의 연계가 가능하다. 예를 들어 공격자가 RPO 취약점을 통해 원래 /static/script.js의 형태로 로드할 수 있을 때 서버에서 /USER_INPUT/static/script.js가 포함된 채 반환한다면 XSS 공격이 가능하다.

 

이 경우 공격자는 USER_INPUT 부분을 조작하여 index.php/;alert(1);//static/script.js와 같은 형태로 경로를 구성한다면 해당 내용이 script 태그의 src로 들어가 alert(1); 이라는 코드를 실행하는 것이 가능하다.

여기서 ;를 사용하여 statement가 끝이라는 것을 알려주고 //를 이용하여 자바스크립트엥서 해석할 수 없는 단순 문자열을 주석처리 한다. 

 

CSS와 연계

스타일시트의 특징 중 하나로 올바르지 않은 문법을 만나면 무시하고 올바른 문법이 나올 때까지 다음 문법으로 넘어간다는 특징이 존재한다. 즉, RPO 취약점을 이용해 올바르지 않은 스타일시트 페이지를 임포트하도록 하고, 해당 페이지 내 일부분에 유효한 CSS 문법을 삽입할 수 있다면 이를 CSS Injection으로 연계할 수 있다.

 

base-uri 미지정

만약 임의의 태그를 삽입할 수 있고, 페이지 내에 RPO 취약점이 존재한다면, 공격자가 원하는 스크립트를 로드할 수 있다. 공격자는 자신의 서버를 base 주소로 설정하고 로드되는 스크립트 파일과 같은 이름의 악성 스크립트를 생성하여 실행할 수 있다.