카테고리 없음

BypassIF

lriyan 2024. 9. 29. 22:58

이번 문제는 코드를 이해하는게 가장 중요하다.

 

바로 코드를 확인해보자

 

코드의 처음 부분을 확인해보면 filter_cmd에서 command_list에 여러 수상한 문자가 담겨있는것을 확인할 수 있다.

 

 

바로 아래 메인 코드를 확인해보면 if not filter_cmd(cmd):에 의해 command_list의 문자들이 필더링되는것을 확인할 수 있다.

즉 command_list 안에 문자를 사용하지 않고 공격을 진행해야 한다.

 

우선 공격이 먹히는지 확인해보자

 

 

버프 스위트를 통해 값을 변조해서 입력해보면

 

 

이렇게 ls 명령어가 잘 실행되는것을 확인해볼 수 있다.

다만 cat 등의 명령어는 사용하지 못하기에 직접적으로 값을 추출하는것은 불가능하다

 

이제 다시 코드를 확인해보자

 

이 부분이 값을 입력한 후 실행되는 코드이다.

 

여기서 정상적으로 코드가 실행되는 subprocess.check_output 부분을 확인해보면

timeout=5 로 5초의 시간제한이 걸려있는것을 확인해볼수 있다.

except subprocess.TimeoutExpired:
                    return render_template('flag.html', txt=f'Timeout! Your key: {KEY}')
                except subprocess.CalledProcessError:
                    return render_template('flag.html', txt="Error!")

 

아래 코드를 보면 만약 타임아웃이 걸리면 render_template('flag.html', txt=f'Timeout! Your key: {KEY}')가 실행되고

이외의 오류가 발견되면 render_template('flag.html', txt="Error!")가 실행되는 모습을 확인할 수 있다.

 

여기서 타임아웃으로 render_template이 실행될 경우 KEY의 값을 출력하는 모습을 확인할 수 있는데

if cmd == '' and key == KEY:
            return render_template('flag.html', txt=FLAG)

 

이렇게 KEY의 값을 알 수 있다면 플레그를 확인할 수 있기에 강제로 타임아웃을 일으켜 KEY 값을 확인하면 된다.

아까 cmd_input이 정상적으로 실행되는것을 확인했으니 이제 sleep 명령어를 사용해 key를 얻을 수 있을것이다.

 

 

버프 스위트로 값을 변조해 5분간 대기하도록 명령을 보내고 기다려보면

 

이렇게 타임아웃이 일어나 KEY의 값이 출력되는걸 확인할 수 있다.

 

마지막으로 출력된 키를 입력해보면

 

이렇게 플레그가 출력된다.