이번 문제는 코드를 이해하는게 가장 중요하다.
바로 코드를 확인해보자
코드의 처음 부분을 확인해보면 filter_cmd에서 command_list에 여러 수상한 문자가 담겨있는것을 확인할 수 있다.
바로 아래 메인 코드를 확인해보면 if not filter_cmd(cmd):에 의해 command_list의 문자들이 필더링되는것을 확인할 수 있다.
즉 command_list 안에 문자를 사용하지 않고 공격을 진행해야 한다.
우선 공격이 먹히는지 확인해보자
버프 스위트를 통해 값을 변조해서 입력해보면
이렇게 ls 명령어가 잘 실행되는것을 확인해볼 수 있다.
다만 cat 등의 명령어는 사용하지 못하기에 직접적으로 값을 추출하는것은 불가능하다
이제 다시 코드를 확인해보자
이 부분이 값을 입력한 후 실행되는 코드이다.
여기서 정상적으로 코드가 실행되는 subprocess.check_output 부분을 확인해보면
timeout=5 로 5초의 시간제한이 걸려있는것을 확인해볼수 있다.
아래 코드를 보면 만약 타임아웃이 걸리면 render_template('flag.html', txt=f'Timeout! Your key: {KEY}')가 실행되고
이외의 오류가 발견되면 render_template('flag.html', txt="Error!")가 실행되는 모습을 확인할 수 있다.
여기서 타임아웃으로 render_template이 실행될 경우 KEY의 값을 출력하는 모습을 확인할 수 있는데
이렇게 KEY의 값을 알 수 있다면 플레그를 확인할 수 있기에 강제로 타임아웃을 일으켜 KEY 값을 확인하면 된다.
아까 cmd_input이 정상적으로 실행되는것을 확인했으니 이제 sleep 명령어를 사용해 key를 얻을 수 있을것이다.
버프 스위트로 값을 변조해 5분간 대기하도록 명령을 보내고 기다려보면
이렇게 타임아웃이 일어나 KEY의 값이 출력되는걸 확인할 수 있다.
마지막으로 출력된 키를 입력해보면
이렇게 플레그가 출력된다.