본문 바로가기
웹 해킹/드림핵

[Dreamhack] php-1

by L3m0n S0ju 2021. 7. 16.


 

문제에서 주어진 코드는 php로 아래와 같이 4개의 파일이 존재한다.

 


 

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>

 


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/>";
    }
?>


main.php

 

<h2>Back Office!</h2>

 

 

 


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>

 


 

list 페이지에 들어가면 위 그림과 같이 2개의 목록이 있다.

 

 

 


flag.php는 권한이 막혀있고 hello.json은 view 페이지로 이동하면서 출력된다. flag가 출력되지 않는 이유는 file=../uploads/flag.php에서 파일을 가져오는데 view 페이지에서 file에 flag라는 값이 있으면 Permission denied 문자열을 출력하고 종료되도록 설계되었다. 따라서 file이 아닌 page를 통해서 flag.php를 출력하면 되지 않을까? 라는 생각을 할 수 있다. flag.php 위치는 file=../uploads/flag이므로 보통 웹 서버의 디렉토리는 /var/www/html이므로 html에서 한번 뒤로 이동하며 /var/www이고 http://host1.dreamhack.games:17985/?page=/var/www/uploads/flag 주소로 이동하면 can you see $flag?라는 문자열이 출력된다. flag.php로는 플래그를 알 수 없고 flag.php안에 $flag라는 값을 찾아라는 의미로 해석된다.

 

 

file은 막혀있으므로 다른 방법을 사용해야하는데 PHP Wrapper라는 기능을 사용할 수 있습니다. 예시는 아래와 같습니다.

 

www.[희생자 사이트].index.php?page=php://filter/convert.base64-encode/resource=/etc/passwd

 

위 예시를 참고하여 다음과 같은 주소로 접속합니다.

http://host1.dreamhack.games:17985/?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag

 

 

해당 주소로 이동하면 아래와 같은 base64 값이 출력되고 해당 값을 디코딩하면 정상적인 코드가 출력됩니다.

PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==

 

 

<?php
$flag = 'DH{bb9db1f303cacf0f3c91e0abca1221ff}';
?>
can you see $flag?

'웹 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] simple-ssti  (0) 2021.07.20
[Dreamhack] Mango  (0) 2021.07.18
[Dreamhack] pathtraversal  (0) 2021.07.16
[Dreamhack] proxy-1  (0) 2021.07.16
[Dreamhack] csrf-1  (0) 2021.07.15

댓글