반응형
문제 설명
php로 작성된 Back Office 서비스입니다.
LFI 취약점을 이용해 플래그를 획득하세요.
플래그는 /var/www/uploads/flag.php에 있습니다.
코드 분석
index.php
...
<?php
include $_GET['page']?$_GET['page'].'.php':'main.php';
?>
...
- page 파라미터로 동적 include
?page=main 이라고 쓰면 main.php 출력, ?page=list 이라고 쓰면 list.php 출력
list.php
<?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/>";
}
?>
- ../uploads/ 폴더를 스캔해서 파일 리스트 출력
- 파일 클릭 시 /?page=view&file ../uploads/파일명 형태
view.php
<?php
$file = $_GET['file']?$_GET['file']:'';
if(preg_match('/flag|:/i', $file)){
exit('Permission denied');
}
echo file_get_contents($file);
?>
- file 파라미터로 파일 읽기
- flag 또는 : 포함되면 차단 (옵션 i 때문에 대소문자 무관하게 차단)
- 아니면 file_get_contents()로 출력
취약점 분석
- page 값 검증 없음 → pathtraversal 가능
- php://filter 같은 래퍼 허용
- flag /: 만 차단 → 일반 파일은 읽힘
익스플로잇
먼저 list에 들어가서 flag.php와 hello.json 파일 들어가서 URL과 출력화면 확인해 봄
http://host3.dreamhack.games:19636/?page=view&file=../uploads/flag.php
http://host3.dreamhack.games:19636/?page=view&file=../uploads/hello.json


- hello.json파일을 통해 사용자가 입력한 경로를 따라가서 파일을 읽고 있다는 것을 확인 가능
LFI와 PathTraversal의 증거
아까 index.php에서 .php가 자동으로 include 되는 것을 확인했음
따라서 page= ../uploads/flag 를 하면 실제로는 ../uploads/flag.php가 됨
page=../uploads/flag -> ../uploads/flag.php
다음과 같이 URL을 작성해 줌
http://host3.dreamhack.games:19636/?page=../uploads/flag


문자열을 확인해보니 can you see $flag? 라는 문자열이 브라우저에 출력됨
flag.php가 include 됐지만 화면에 $flag가 안 보이지만 실행만 된다는 것을 확인
php://filter로 소스 덤프
/?page=php://filter/convert.base64-encode/resource=../uploads/flag

다음과 같이 인코딩 된 문자열이 나오고 이 문자열을 디코딩해주면

php://filter
: PHP의 스트림 래퍼(Wrapper) 중 하나이다. 파일을 읽거나 include할 때 데이터를 변환(필터링)해서 다루게 해주는 기능이다.
쉽게 말해, include나 filter_get_content가 파일을 읽을 때 그 내용을 그대로 실행/출력하지 않고 변환해서 가져올 수 있다.
대표적으로 다음과 같이 작성
php://filter/convert.base64-encode/resource=파일경로
- 파일 내용을 base64로 인코딩해서 읽어오라는 뜻
자주 쓰는 것
- convert.base64-encode
→ 파일 내용을 base64로 만들어서 소스 덤프용으로 사용 - convert.base64-decode
→ 반대로 디코딩 (보통 data://랑 같이 씀) - string.rot13
→ ROT13 변환 - string.toupper / string.tolower
→ 대/소문자 변환
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| easy client side (0) | 2026.02.03 |
|---|---|
| easy server side (0) | 2026.02.03 |
| image-storage (0) | 2026.02.02 |
| simple-ssti (0) | 2026.01.30 |
| simple_sqli chatgpt (0) | 2026.01.30 |