
이번에 포스팅 할 문제는 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 |