2024. 9. 22. 19:41ㆍWeb 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 |