https://dreamhack.io/wargame/challenges/46/?page=6
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/>";
}
?>
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>
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>
main 화면
List에서 flag.php를 누르면
이와같은 경로로 리다이렉트된다.
view.php 소스를 확인해보면 preg_match를 통해 필터링을 하고있다.
preg_match('/flag|:/i', $file)
정규식이 뒤의 값과 일치하면 1 아니면 0을 반환한다.
// 사이에 들어가는 것이 찾을 표현.
| 는 or를 의미. i는 대소문자를 구분하지 않겠다는 뜻이다.
즉 flag 또는 :가 $file에서 발견된다면 1을 반환한다. 즉 flag와 관련없는 파일명에 대해서만 허용하겠다는 뜻.
preg_match()를 우회하려 해봤으나 마땅한 방법이 없었다. ($file명을 flag없이 접근해서 얻을 게 없음.)
index.php를 보면 $_GET['page']를 통해 입력을 받아서 include로 실행한다.
따라서 ?page=/var/www/uploads/flag 경로로 실행해봤다.
can you see $flag? 라는 문자가 출력되었다. 즉 접근이 가능하다는 뜻이다.
그리고 $flag는 php 변수이다.
include는 php파일의 경우 소스를 그대로 보여주는 것이 아니라 실행을 시켜버린다.
따라서 소스를 가져올 수 있다면 실마리를 얻을 수 있다.
wrapper를 통해 flag.php를 base64 인코딩하고 , 이를 디코딩해서 가져오기로 한다.
아래와 같이 요청한다. (/resource=파일) <- 주의 resource 빼먹지 말아야한다.
인터넷에 널린 디코더를 통해 디코딩하니 역시 flag 획득 가능.
'Security' 카테고리의 다른 글
[wargame] image-storage (0) | 2021.09.30 |
---|---|
[Webhacking] Javascript (0) | 2021.09.30 |
[wargame] Tomcat Manager (0) | 2021.09.27 |
[Webhacking] PHP (0) | 2021.09.27 |
[Webhacking] language specific vulnerability (0) | 2021.09.27 |