본문 바로가기

드림핵

[Dreamhack] php-1

이번에 포스팅 할 문제는 LFI 취약점을 이용한 php 문제이다.

서버를 생성하여 해당 문제의 페이지를 확인해보자.

 

페이지를 확인하였을 때, 중요하게 볼 페이지는 List와 View 페이지이다.

먼저 문제 파일을 받아보면 view.php, main.php, list.php, index.php 4개의 파일이 있다.

 

그 중에서 취약점이 나타날 것으로 추정되는 view 페이지를 살펴보자.

 

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

코드를 확인해보면 preg_match() 함수를 사용하여 사용자 입력값인 file 파라미터에 대해 문자열 필터링을 수행한다.
정규식 /flag|:/i에 의해 입력 값에 flag 문자열 또는 : 문자가 포함될 경우 Permission denied를 출력하며 실행을 종료한다.
그래서 flag 입력 값이 필터링 되어 있으므로, 우리는 우회할 방법을 찾아야 한다.

 

<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 include $_GET['page']?$_GET['page'].'.php':'main.php'; ?>

이 코드이며, 해당 코드는 LFI/파일 포함 취약점의 교과서 예제이다.

URL 파라미터 page 값에 따라 해당 PHP 파일을 서버에서 include(실행) 한다.

즉, page 매개변수에 서버 내 존재하는 PHP 파일의 경로를 지정함으로써 임의의 PHP 파일을 실행시킬 수 있다.

 

해당 URL 경로에 index.php?page=/var/www/uploads/flag를 입력하였을 때, can you see $flag? 라는 문자열을 확인할 수 있엇다. 다만, flag 파일을 실행시키는 것이 아닌 내용을 출력해야 하는 것으로 추정할 수 있다.

 

php 파일의 내용을 확인하기 위해 php Stream wrapper를 사용해보자.

 

PHP Wrapper는 PHP에서 파일이나 스트림을 처리할 때 사용하는 특수한 프로토콜 방식으로, include, require, file_get_contents() 등의 함수에서 일반 파일 경로 대신 다양한 데이터 소스를 참조할 수 있도록 한다.

 

이를 통해 flag.php 파일을 실행하지 않고 Base64 인코딩된 형태로 출력함으로써 파일의 내용을 확인할 수 있다.

 

PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==

해당 파일 내용이 인코딩된 형태로 출력되었으며, 이를 디코딩을 통해 해당 플래그 값을 확인할 수 있다.

 

인코딩으로 출력된 값을 Base64 웹을 통해 디코딩하였으며,  플래그 값을 획득할 수 있었다.

'드림핵' 카테고리의 다른 글

[Dreamhack] proxy-1  (0) 2026.01.02
[Dreamhack] CSRF-1 및 CSRF-2  (1) 2025.12.04
[Dreamhack] XSS-1 및 XSS-2  (0) 2025.12.03
[Dreamhack] php7cmp4re  (0) 2025.12.02
[Dreamhack] command-injection-1  (0) 2025.04.04