
Dreamhack(Web) - php-1
O_o22
·2022. 10. 4. 23:22



LFI(Local File Inclusion) 취약점을 이용하여 문제를 풀어야하고, 파일을 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>
LFI 대응방안
개요 LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다. 이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고 디렉토리 변경 명령어들의 삽
blog.plura.io
LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다.
이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고 디렉토리 변경 명령어들의 삽입을 허용했을 때 일어납니다.
대부분의 LFI 취약점은 URL을 통해 이뤄지는데 이는 보통 개발자가 GET Method 사용을 선호하기 때문입니다.
라고 합니다.
확인해보면,
<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>
GET 방식으로 file 값을 불러오고 있는데, /flag 를 필터링 하고 있으니, 필터링을 우회해서 url 값에 삽입하면 될 것 같습니다.
사실 어떻게 풀지 모르겠어서, url 인코딩해보며 삽질도 하고, 결국 php wrapper 라는 것을 알게되었다.
https://opentutorials.org/module/4291/26819
LFI(2) - with php wrapper - WEB1
이번 시간에는 php wrapper를 사용한 lfi에 대해 알아보도록 하겠습니다. 우선 wrapper란 실제 데이터의 앞에서 어떤 틀을 잡아 주는 데이터 또는 다른 프로그램이 성공적으로 실행되도록 설정하는
opentutorials.org
그런데, 입력해도 값이 나오지 않는다.
다시 보면,

플래그 경로는 /var/www/uploads/flag.php 라고 한다.

flag.php 가 아닌 flag로 쳐야 뭔가가 나온다.

can you see $flag라는 말이 추가되었는데, php wrapper 를 사용할 때 함께 자주 쓰인다는 encode 옵션을 이용했다.




'네트워크, 웹 (Network & Web) > Wargame' 카테고리의 다른 글
Dreamhack(web) - web-deserialize-python 풀이 (0) | 2022.11.04 |
---|---|
Dreamhack(Web) - simple-ssti (0) | 2022.10.05 |
webhacking.kr - old-06 풀이 (0) | 2022.10.03 |
webhacking.kr - old-05 풀이 (0) | 2022.09.06 |
webhacking.kr - old-04 풀이 (0) | 2022.09.05 |