Relative Path Overwrite

2024. 9. 22. 19:41Web Security/웹 해킹

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

 

'Web Security > 웹 해킹' 카테고리의 다른 글

CSTI injection  (0) 2024.09.23
CSS injection  (0) 2024.09.23
CSP : Content-Security-Policy  (1) 2024.09.19
CSRF - CSRF token, SameSite Cookie  (1) 2024.09.19
SOP와 CORS  (2) 2024.09.18