2022년 사이버공격방어대회 (CCE) reborn of php Write Up 입니다.

문제에 접속하면 다음과 같은 페이지가 출력됩니다.

아무 페이지에 들어가서 URL을 확인해 보았습니다. b 인자와 a 인자가 있는 것을 확인할 수 있습니다.

이 인자들의 역할은 lib/controller.lib.php 코드에서 확인할 수 있습니다.
b가 board, a가 action인데, 이 두 개를 결합하여 path를 설정합니다.
[그림 3.2]를 예로 들면, b = register, a = index이므로
path는 register/index가 되고, 26번 라인으로 인해 최종적으로 register/index.php가 완성됩니다.
만약 11라인으로 인해 필터링에 걸리거나, 해당 경로에 파일이 존재하지 않으면 path는 main/index로 고정됩니다.
이 경로를 잘 조작하여 LFI 공격을 통해 flag를 열어야 할 것으로 보입니다.

경로 자체는 조작을 쉽게 할 수 있습니다. 그러나, [그림 3.3] 26번 라인에서 include를 할 때 경로 뒤에 .php를 붙입니다. 단순 경로 조작만으로는 flag 파일을 열 수 없다는 것입니다. flag 파일은 뒤에 확장자가 붙지 않기 때문입니다.
따라서, 서버 내부적으로 flag를 볼 수 있도록 하는 코드를 실행시켜야 합니다.

보통 파일 업로드를 많이 사용하지만, 해당 서버에는 파일 업로드 기능 구현이 되어 있지 않았습니다. 대신 회원가입 기능을 이용하여 코드를 작성할 수 있었는데, [그림 3.5] 15라인을 보면 id랑 pw를 입력받아 save_user_id()를 호출하는 것을 확인할 수 있습니다.

해당 함수의 정의는 lib/util.lib.php에서 확인할 수 있습니다.
Id는 dbs/id에, pw는 serialize()로 필터링 없이 저장합니다.

이를 이용해, id에 .php를 붙이고, pw는 <?php echo file_get_contents(“/flag”) ?> 로 계정을 생성합니다.

계정을 생성하고, dbs/qazz.php로 접속해봅니다.
다만 [그림 3]에서 b 인자를 필터링 하고 있고, include() 시 .php가 붙는 것을 고려해서 URL을 구상합니다.
/?b=..&a=dbs/qazz로 접속하면, dbs/qazz.php가 열리고 해당 코드가 실행되어 flag가 출력됩니다.
'CTF > ETC' 카테고리의 다른 글
| [CTF] CCE2022 BabyWeb Write-Up | Web (0) | 2026.03.10 |
|---|
댓글