1. 문제
https://dreamhack.io/wargame/challenges/46
php-1
PHP로 작성된 백 오피스 서비스입니다. LFI 취약점을 사용하여 플래그를 획득합니다. 플래그는 /var/www/uploads/flag.php에 있습니다. 서버측 기본 참조
dreamhack.io

– 질문은 플래그가 /var/www/uploads/flag.php에 있음을 나타냅니다.
2. 솔루션 프로세스
(1) 문제 파일 다운로드
– 다운로드 후 압축을 풉니다. 4개의 PHP 파일을 확인할 수 있었습니다.

– vscode를 통해 파일을 열었습니다.
-index.php

<?php
include $_GET('page')?$_GET('page').'.php':'main.php';
?>
-> 위 코드는 include 함수를 통한 코드입니다. 다른 PHP 파일을 로드하고 현재 파일(인덱스)의 일부인 것처럼 포함합니다.
즉, index.php에서 GET 메소드를 통해 전달된 페이지 값이 존재하면 main.php page.php 파일호출 시도(존재 X -> load main.php)
#체크오버
PHP에서 다른 PHP 파일을 로드하는 명령은 다음과 같습니다. 포함하다, include_once, 필요하다, 한 번 필요 네 가지가 있습니다.
- 포함하다 파일이 존재하지 않더라도 경고만 표시되고 PHP는 계속 실행됩니다. 파일이 여러 번 호출되면 파일은 호출된 횟수만큼 기록됩니다.
- include_once 파일이 존재하지 않더라도 경고만 표시되고 PHP는 계속 실행됩니다. 파일이 여러 번 호출되더라도 파일은 처음에만 로드됩니다.
- 필요하다 파일이 존재하지 않으면 오류가 발생하고 PHP 실행이 완전히 중지됩니다. 파일이 여러 번 호출되면 파일은 호출된 횟수만큼 기록됩니다.
- 파일이 존재하지 않고 PHP가 더 이상 실행되지 않으면 require_once에서 오류가 발생합니다. 파일이 여러 번 호출되더라도 파일은 처음에만 로드됩니다.
<?php
include '(불러올 파일명)';
?>
(참조) https://wikidocs.net/116894, https://server-talk.247
(2) main.php, view.php 코드 확인
-main.php
<h2>Back Office!</h2>
-> 백은 무슨 뜻인가요?
-view.php

– 뷰 파일 조회 시 GET을 통해 파일이 존재하면 파일을 조회하고, 그렇지 않으면 공백을 조회합니다.
– preg_match 함수를 통해 파일 함수의 플래그 문자열을 필터링하여 차단합니다. 따라서 플래그를 보려면 이 필터링을 우회해야 한다고 추측할 수 있습니다.
(3) 연결
– main.php 연결 화면

– list.php 연결 화면

– Flag.php 연결 화면

(4) 바이패스 처리
처음에는
http://host3.dreamhack.games:18096/?page=view&file=../uploads/flag.php 보기 페이지의 파일에 flag라는 값이 있어서 preg_match 함수로 걸러내서 Permission denied 문자열을 반환하고 종료를 해서 확인이 안되는 줄 알았습니다.
그래서 preg_match 필터링을 우회하는 방법을 생각했습니다.
경로 우회 ??
-> 인터넷 보고 배웠는데 해봐야겠다는 생각으로 url 조작을 해봤습니다.
모르겠습니다!!!!!!!!!! 내가 생각한 방향이 아닌 것 같아
preg_match 함수는 파일의 플래그를 필터링합니다. 따라서 필터링을 우회하려면 필터 코드가 포함된 보기 페이지가 아닌 다른 페이지에서 가져와야 합니다. index.php로 우회하려고합니다.
f(preg_match('/flag|:/i', $file))
내가 상상할 수 있는 한.
그 뒤로는 잘 몰라서 구글링으로 남들이 어떻게 하는지 따라해봤습니다.
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의 값을 찾는 것으로 해석됩니다.
– http://host3.dreamhack.games:18096/?page=/var/www/uploads/flag 연결하다


-> 문자열이 출력되는데 navi에서 숨겨서 개발자 도구를 통해 소스코드를 확인했습니다.
‘$flag를 볼 수 있습니까?’
……….
아니면 정확히 아니오라고 말할 것입니다. 왜 그런 식으로 표현되어 있습니까?
..다 이유가 있겠지만.. 왕은
아마도 flap.php 코드에서 $flag의 값을 찾는다는 의미인 것 같습니다.
그런데 서버에서 flag.php 파일을 어떻게 읽어야 하느냐가 문제였습니다.
“LFI 취약점” 에서 힌트를 얻을 수 있습니다.
LFI(Local File Inclusion) 취약점은 파일이 대상 서버에 있을 때 사용할 수 있는 방법입니다. 이 문제의 경우와 PHP가 더 높은 버전을 얻을 때 PHP 래퍼LFI 공격을 수행해야 한다고 합니다.
(5) 전용처리 2
우회용으로 PHP Wrapper라는 기능을 사용할 수 있다고 합니다.
PHP 래퍼?
실제로 LFI 공격을 수행하는 데 유용할 수 있는 래퍼가 있다고 합니다.
1. 예상: //
2. php://필터/
3.zip://
expect:// 래퍼의 경우 시스템 명령을 실행합니다.
기대하세요. 시스템 명령 ls는 디렉토리를 표시합니다.
php://filter의 경우 서버에서 문서를 검색(인코딩 또는 디코딩 형식으로)할 수 있습니다. www.(웹사이트 주소)/?file=php://filter/convert.base64-encode/resource=filename base64로 인코딩된 파일을 가져옵니다.
zip://의 경우 zip 파일을 추출하고 추출된 파일의 코드를 실행합니다.
(참조) https://www.php.net/manual/en/wrappers.php, https://zzzmilky.entry/%EC%9B%B9%ED%95%B4%ED%82%B9-LFI-%EC%B7%A8%EC%95%BD%EC%A0% 90php 래퍼
문제에서 php://filter를 사용해야 한다고 상상할 수 있습니다.
www.(웹사이트 주소)/?file=php://filter/convert.base64-encode/resource=filename형식에 따라 URL을 조작해 보았습니다.
– Base64로 인코딩된 flag.php를 얻을 수 있습니다.

PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==
(6) 디코딩
Base64 디코딩 및 인코딩 – 온라인
Base64 형식에서 디코딩하거나 다양한 고급 옵션으로 인코딩합니다. 당사 웹 사이트에는 사용하기 쉬운 온라인 도구가 있어 데이터를 변환할 수 있습니다.
www.base64decode.org

플래그: DH{bb9db1f303cacf0f3c91e0abca1221ff}