관리 메뉴

FU11M00N

[ DreamHack ] php-1 본문

Web Hacking/DreamHack

[ DreamHack ] php-1

호IT 2021. 3. 28. 07:07

- 문제 정보

php로 작성된 Back Office 서비스입니다.

LFI 취약점을 이용해 플래그를 획득하세요. 플래그는 /var/www/uploads/flag.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>

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

list.php

<h2>Back Office!</h2>

main.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>


view.php

 

 

 

 

페이지에서 List를 드가 보면 flag.php와 hello.json 파일이 있는데 flag.php를 클릭하면 permission denied가 출력되어 확인할 수 없고 hello.json은 파일의 내용이 출력되는 것 같다.

 

 

<?php include $_GET['page']?$_GET['page'].'.php':'main.php'; ?>

 

index.php 파일에서는 include를 사용해서 page를 불러온다.

저런 형식을 처음 봐서 해석하는데 시간을 많이 쏟았었다.

get 방식으로 page파라미터에 값을 받고 이 값에. php를 추가한다.

하지만 이때 입력값이 없으면 main.php 파일을 불러온다.

 

 

 

 

<?php
    $file = $_GET['file']?$_GET['file']:'';
    if(preg_match('/flag|:/i', $file)){
        exit('Permission denied');
    }
    echo file_get_contents($file);
?>

view.php 파일에선 GET방식으로 받아오는 값에 preg_match로 필터링이 되어 "flag"와 ":(콜론)" 문자가 있으면 exit 함수가 실행되어 권한이 없다고 출력된다. 

 

일단 index.php에 include 하는 부분에 page파라미터로 값을 받아와

php 코드를 실행시키니깐 이 부분을 공략해야겠다고 생각했다.

 

/?page=/var/www/uploads/flag

위와 같이 페이로드를 작성하면 아래와 같이 출력된다.

can you see $flag?

음.. 뭔가 당황했었다. 어디까지 접근한 걸까 싶어 강의 파일을 계속 읽다가

그래서 php 코드를 실행시키지 않고, php 코드를 그대로 불러오고자 PHP Wrapper를 사용해 주었다.

php 코드를 그대로 실행 안 하고 코드 자체를 읽어야 하기 위해 PHP Wrapper를 사용해야 한다는 것을 알았다.

 

Wrapper 개념에 대해 정말 예전에 수박 겉핥기식의 개념만 알고 있어서 드림핵 강의 파일도 계속 읽어보고 구글링 한 결과 

/?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag

PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==

정답 페이로드를 알아냈다. 그럼 base64값을

여기에서 www.convertstring.com/ko/EncodeDecode/Base64Decode에서 디코딩했다.

 

'Web Hacking > DreamHack' 카테고리의 다른 글

[ DreamHack ] command-injection-1  (0) 2021.03.28
[ DreamHack ] simple-ssti  (0) 2021.03.28
[ DreamHack ] csrf-1  (0) 2021.03.28
[ DreamHack ] proxy-1  (0) 2021.03.28
[ DreamHack ] image-storage  (0) 2021.03.28
Comments