본문 바로가기
CTF/Dreamhack

[Dreamhack] php-1

by 8희 2023. 3. 28.

https://dreamhack.io/wargame/challenges/46

 

php-1

php로 작성된 Back Office 서비스입니다. LFI 취약점을 이용해 플래그를 획득하세요. 플래그는 /var/www/uploads/flag.php에 있습니다. Reference Server-side Basic

dreamhack.io

 

이 문제는 php로 작성된 Back Office 서비스이다.

LFI 취약점을 이용해 플래그를 획득하는 문제이다.

 

LFI(Local File Inclusion) 취약점웹 브라우저를 통해 서버에 파일을 포함시키는 과정이다.

이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고,

디렉토리 변경 명령어들의 삽입을 허용했을 때 일어난다.

출처: http://blog.plura.io/?p=7602 

 

php가 버전이 높아지면서 php wrapper을 활용해 LFI 공격을 해야 한다.

LFI 공격을 하면서 유용하게 사용할 수 있는 wrapper는 총 세 가지이다.

1. expect://

: system command의 실행이 가능하다.

2. php://filter/

: 서버안의 문서들을 encode 또는 decode의 형태로 열람할 수 있게 해준다.

'www.[웹사이트주소]/?file=php://filter/convert.base64-encode/resource=파일명'을 활용하면,

base64로 인코딩된 파일을 얻을 수 있다.

3. zip://

: zip 파일의 압축을 풀고, 압축을 푼 파일안에 있는 코드를 실행이 가능하다.

출처: https://zzzmilky.tistory.com/entry/%EC%9B%B9%ED%95%B4%ED%82%B9-LFI-%EC%B7%A8%EC%95%BD%EC%A0%90-php-wrapper

 

 

 

접속 정보를 통해 문제 사이트에 접속하면 이런 화면을 볼 수 있다.

 

 

List에 들어가면 flag.php가 보인다.

 

 

flag.php를 클릭 시 권한이 없다는 문장을 볼 수 있다.

 

 

List에서 hello.json을 클릭 시 flag.php와 달리 읽기가 가능했다.

 

 

문제 파일로 주어진 php 파일 중 index.php 파일을 먼저 확인했다.

 

index.php의 정보를 확인하면 메인 화면임을 알 수 있다. 별 소득이 없다.

 

 

view.php 코드를 확인했다.

코드를 보면 file 변수에 경로를 줄 때, preg_match 함수를 이용하여 flag 문자열을 필터링한다.

flag.php를 클릭 시 왜 권한이 없다는 문장이 떴는 지 해당 코드 부분을 통해 알 수 있었다.

문제에서 flag는 /var/www/uploads/flag.php에 있다고 했으므로

즉, flag 문자열 필터링을 우회해야 flag.php에서 flag 값을 얻을 수 있을 것이다.

 

이건 php wrapper를 통해 해결할 수 있다.

php://filter/를 활용하여 flag.php를 출력하면 된다.

 

 

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

이걸 url로 입력하면 개발자 도구에서 base64 인코딩 된 flag.php를 확인할 수 있다. 

 

PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==

 

 

Base64 디코딩 사이트

https://www.convertstring.com/ko/EncodeDecode/Base64Decode

 

해당 값을 base64 디코딩 하면 flag 값을 확인할 수 있다.

 

 

문제를 해결했다!