Untitled

문제 파일을 다운받고, 코드를 알아보자.

플래그는 문제에서 설명한 대로, /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 페이지에서 무언가 할 수 있을듯 하다.

Untitled

파일의 내용에 php 태그가 포함될 시 실행된다고 하는데 view.php에서 flag에 필터링이 걸려 있으므로 다른 페이지에서 취약점을 터뜨려(?) 보자.

Untitled

우리는 flag.php 파일 찾아야 하므로, php wrapper를 한번 작성해 보자.

Untitled

참조 :