(드림핵) 1단계: php-1

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의 값을 찾는 것으로 해석됩니다.

(참조) https://lemon-soju.47

– 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을 조작해 보았습니다.

http://host3.dreamhack.games:19096/index.php?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag

– Base64로 인코딩된 flag.php를 얻을 수 있습니다.


PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==


(6) 디코딩

https://www.base64decode.org/

Base64 디코딩 및 인코딩 – 온라인

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

www.base64decode.org


플래그: DH{bb9db1f303cacf0f3c91e0abca1221ff}