문제 파일을 다운받고, 코드를 알아보자.
플래그는 문제에서 설명한 대로, /var/www/uploads/flag.php 에 위치해 있다는 걸 확인할 수 있다.
<list.php>
<h2>List</h2>
<?php
$directory = '../uploads/';
$scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
foreach ($scanned_directory as $key => $value) {
echo "<li><a href='/?page=view&file={$directory}{$value}'>".$value."</a></li><br/>";
}
?>
<view.php>
<h2>View</h2>
<pre><?php
$file = $_GET['file']?$_GET['file']:'';
if(preg_match('/flag|:/i', $file)){
exit('Permission denied');
}
echo file_get_contents($file);
?>
</pre>
<index.php>
<html>
<head>
<link rel="stylesheet" href="<https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css>">
<title>PHP Back Office</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="/">PHP Back Office</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li><a href="/?page=list">List</a></li>
<li><a href="/?page=view">View</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><br/><br/>
<div class="container">
<?php
include $_GET['page']?$_GET['page'].'.php':'main.php';
?>
</div>
</body>
</html>
php 문을 보면, include 함수를 이용하여 main.php를 불러온다는 걸 알 수 있다.
main 페이지에서 무언가 할 수 있을듯 하다.
파일의 내용에 php 태그가 포함될 시 실행된다고 하는데 view.php에서 flag에 필터링이 걸려 있으므로 다른 페이지에서 취약점을 터뜨려(?) 보자.
우리는 flag.php 파일 찾아야 하므로, php wrapper를 한번 작성해 보자.
참조 :