접속 시 위와 같은 화면이 뜹니다. 계산해보니 대회가 끝난 후 5분 뒤 이곳에서 플래그가 공개되는 것 같습니다.
HINT 버튼 클릭 시 flag.php
의 소스코드가 나옵니다. 해당 소스코드를 대충 분석해보겠습니다.
- 유저 입력값을
htmlspecialchars
를 거쳐 passcord 변수에 저장합니다.
mb_strcut($passcord, 0, 3, 'UTF-8');
를 통해 3바이트까지 자릅니다.
$passcord = iconv("UTF-8", "ISO-2022-CN-EXT", $passcord);
를 두번 실행합니다.
- hex 코드로 변환한 뒤 4번째 바이트 값이
$fourth_byte_value >= 0x48 && $fourth_byte_value <= 0x4C
를 만족할 때 플래그를 반환합니다.
여기서 제가 파악한 문제점은 ISO-2022-CN-EXT로 변환된 값을 UTF-8이라며 다시 ISO-2022-CN-EXT로 변환하는 부분입니다. mb_strcut으로 인해 3바이트까지 잘라서 4바이트 값을 만족할 수 없는데, 두 번 변환하면서 4바이트를 넘어가게 되는 것 같습니다.
CVE-2024-2961
취약점도 의심하였으나, 트리거 조건이 입력 4바이트 이상일 때 트리거되는것으로 확인했습니다. iconv 가 두번 되어서 4바이트를 넘어가도 제어할 수 없으므로 해당 취약점은 사용할 수 없다고 판단했습니다.
ISO-2022-CN-EXT 코덱이 로컬에서는 오류로 인해 테스트 할 수 없었습니다. 아래 사진과 같이 iconv 결과가 ? 로 나왔습니다.
서버에서는 혹시나 다를까 해서 저 한자 喝 를 보냈더니, 플래그가 떴습니다.