1. Intro

얼마전 cake CTF 2022 대회가 있었는데, 일 때문에 주말에는 쉬고 싶어서 참가는 안했네요,,,

암튼 이후 writeup을 봤는데 신기해서 기록하고자 합니다.

 

 

2. switch case

if else 구문이 지저분한 사람들이 switch case 구문을 좋아하더라구요.

아래처럼 switch case 구문이 있다고 가정해 봅시다.

<?php

    $user = json_decode(file_get_contents("php://input"));
    
    if($user->name === "admin" ){
        exit("no hack");
    }
    
    switch($user->name){
        case "admin":
            echo "Good";
            break;
        default:
            echo "no";
    }
?>

POST방식으로 `user` 정보를 받고 이를 json으로 파싱하고 있습니다. 이후 if 문으로 입력 값을 검증하고 있습니다.

최종적으로는 `user->name` 변수의 값이 admin 이어야 하지만, if문에서 admin 문자열을 필터링 하고 있습니다.

 

어떻게 하면 이를 bypass 할 수 있을까요?

 

정답은 switch case 구문에 있습니다.

공식 docs를 보면 아래 사진의 맨 밑에 "약한 비교" 를 한다고 되어 있습니다. 즉, php에서는 `==` 과 `===` 가 있는데 여기서 switch case 구문은 약한 비교(==) 를 한다고 적혀있네요.

https://www.php.net/manual/en/control-structures.switch.php

 

 

3. Exploit  

약한 비교의 취약점을 이용하면 쉽게 풀 수 있습니다.

json 에서 true/false 타입을 지원하기 때문에 아래처럼 `user->name` 값이 true 이면 if문과 switch 문을 bypass 할 수 있습니다.

<?php

$user = @json_decode('{"name":true}');
    
    if($user->name === "admin" ){
        exit("no hack");
    }
    
    switch($user->name){
        case "admin":
            echo "Good";
            break;
        default:
            echo "no";
    }
?>

 

 

4. Reference

https://github.com/satoki/ctf_writeups/tree/master/CakeCTF_2022/CakeGEAR

https://www.php.net/manual/en/control-structures.switch.php