Relative Path Overwrite
relate path overwrite란?
relate path overwrite(RPO)는 경로를 브라우저가 잘못 인식하거나, 잘못된 경로 설정으로 발생되어 원래의 의도한 경로를 해커가 의도한 경로로 덮어쓰위는 취약점입니다.
브라우저가 경로를 잘못인식하는 경우는 이유는 아래와 같다.
https://naver.com/name?tag=min이라는 경로를 https://naver.com/name.html/min 처럼 표현이 가능하다. 이렇게 쿼리 방식이 아니라 경로를 기반으로 데이터를 받아오는 것이 가능하기 때문이다.
from flask import Flask, request
app = Flask(__name__)
@app.route('/name.html/<path:additional_path>', methods=['GET'])
def vuln(additional_path):
return f'<h1>name.html 호출됨</h1><p>전달된 값: {additional_path}</p>'
if __name__ == '__main__':
app.run(port=8000)
위 환경에서 취약점은 아래와 같은 경우 발생됩니다.
- 상대 경로를 사용한 경우
- js와 연계 xss 가능
- URL에 js나 css의 버전을 받는 경우
- css와 연계 가능한 경우 css injection 가능
- js와 연계 가능한 경우 xss 가능
- base 태그 사용 가능
상대 경로를 사용했을 때, js 코드와 연계하여 xss 를 발생시킬 수 있다.
절대경로와 상대경로를 알아야 한다.
절대경로는 src =/hello/a.js 와 같은 형태이고 상대경로는 src=hello/a.js 와 같은 형태이다. 만약 www.naver.com/user이라는 곳에서 상대 경로로 js 코드를 참고한다면 아래와 같다.
www.naver.com/user/hello/a.js 반면 절대 경로의 경우 www.naver.com/a.js에서 js 코드를 참조한다. 아래 그림은 상대 경로와 절대 경로의 차이를 한눈에 볼 수 있는 사진이다.
http://host3.dreamhack.games:22822/vuln.php/abcde/를 접속하면
서버는 http://host3.dreamhack.games:22822/vuln.php/에 접속했다고 판단하고, abcde를 추가 경로로 판단하고, vuln.php를 처리하는 함수에 전달한다.
반면 브라우저에서는 http://host3.dreamhack.games:22822/vuln.php/abcde/에 접속했다고 판단한다.
그렇기에 vuln.php에 <script src="filter.js"></script> 코드가 존재하면아래 사진처럼 js 코드를 요구한다.
요구한 디렉토리의 js 코드는 없음으로 없은 파일을 요구했을 때 처리하는 코드가 실행되고 이를 리턴한다. 아래 사진을 보면 이해가 쉽다.
일반적으로 아래와 같음
jsonp를 설명했다 싶이, script src는 소스코드를 가져와서 실행하라는 뜻이다. 그렇기에 만약
http://host3.dreamhack.games:22822/vuln.php/;alert(1)//이라고 입력하면 /vuln.php/;alert(1);//filter.js not found. 이라는 코드를 가져와서 실행이라는 뜻이 되고 alert(1)이 실행된다.
위 취약점을 막는 방법은 절대 경로를 사용하면 됩니다.
이렇게 절대 경로를 사용하여 막는경우 아래와 같은 취약점을 찾고 추가적인 공격이 가능합니다.
URL에 js나 css의 버전을 받는 경우 RPO가 발생 가능하다.
GET /page?ver=my_script.js_v1.0.0다음과 같이 페이지의 버전을 받아서 페이지에 맞는 css나 js를 로드하는 경우가 존재합니다.
<script src="/asset/js/vendor/my_script.js_v1.0.0"></script> 다음과 같은 script가 주어졌다고 생각해 봅시다.
위와 같은 상황속에서 업로드할 수 있는 페이지가 존재한다면, 페이지에 alert(1)과 같은 js 코드를 입력합니다. 이후 GET /page?sink=../../../upload/my_script 입력하게 된다면,
src="asset/js/vendor/../../../upload/my_script" 이 되고 자연스럽게, 도메인/uplaod/my_script 의로 우리가 업로드한 파일을 js 코드로 가져와서 실행하게 됩니다.
css를 로드하는 경우 xss가 아닌 css injection 공격으로 유도가 가능하고, 이는 다시 csrf나 데이터 탈취 등으로 이어질 수 있습니다.
출처:
https://support.detectify.com/support/solutions/articles/48001048955-relative-path-overwrite
Relative Path Overwrite
Relative Path Overwrite (RPO) is a technique where an attacker can overwrite the target file of a relative URL. If there is any data on the page that the attacker can control, they can inject malicious CSS. What can happen? As with many other v...
support.detectify.com
https://www.hahwul.com/cullinan/rpo/
Relative Path Overwrite
Introduction RPO(Relative Path Overwrite)는 relative URL, 즉 상대 경로 기반의 URL을 덮어써서 의도하지 않은 동작을 수행하는 공격 방법입니다. Relative Path Confusion이라고도 불리며 본 문서에서는 RPO로 통일하
www.hahwul.com
https://dreamhack.io/wargame/challenges/440
Relative Path Overwrite Advanced
Description Exercise: Relative Path Overwrite의 패치된 문제입니다. 문제 수정 내역 2023.08.10 bot.py 수정, Dockerfile 제공
dreamhack.io