https://dreamhack.io/wargame/challenges/46
이 문제는 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 파일의 압축을 풀고, 압축을 푼 파일안에 있는 코드를 실행이 가능하다.
접속 정보를 통해 문제 사이트에 접속하면 이런 화면을 볼 수 있다.
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를 출력하면 된다.
이걸 url로 입력하면 개발자 도구에서 base64 인코딩 된 flag.php를 확인할 수 있다.
PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==
Base64 디코딩 사이트
https://www.convertstring.com/ko/EncodeDecode/Base64Decode
해당 값을 base64 디코딩 하면 flag 값을 확인할 수 있다.
문제를 해결했다!
'CTF > Dreamhack' 카테고리의 다른 글
[Dreamhack] Carve Party (0) | 2023.04.04 |
---|---|
[Dreamhack] file-download-1 (0) | 2023.03.28 |
[Dreamhack] System Hacking STAGE 7 - Mitigation: NX & ASLR, Background: Library - Static Link vs. Dynamic Link (0) | 2022.11.06 |
[Dreamhack] System Hacking STAGE 6 - Mitigation: Stack Canary (0) | 2022.11.06 |
[Dreamhack] System Hacking STAGE 5 - Stack Buffer Overflow (0) | 2022.10.30 |