Fail Open 취약점이라는 좋은 내용이 WebGoat에 잘 소개되어 있어서 올립니다.
아래와 같은 코드로 로그인 창이 작성되어 있다고 할 때, (클래스명 같은건 좀 틀려도 이해해주시길)
void processLogin(Request r) { try { String username = r.getParameter("Username"); String password = r.getParameter("Password"); if (username.equals("ADMIN") == false || password.equals("ADMINPW") == false) { // redirect to login form } } catch(Throwable t) { } showWelcomeScreen(); }
어떤 문제가 발생할 수 있는지 알아보실 수 있겠습니까? 맞춰보세요….
위와 같은 로그인 체크는 http://…/action?Username=user 에 의해 바로 뚫려버립니다. 왜냐하면 password는 주어지지 않았으므로 NULL이 될테고, 따라서 passworld.equals 호출시 NullPointerException이 뜨는데 이것이 catch에 의해 소리소문없이 사라져버린 뒤 welcome화면으로 넘어가게 되기 떄문입니다.
이것이 바로 Fail Open 취약점입니다. 이 취약점은 잘못된 조건검사로 인해 사실은 거부당해야 하는 조건임에도 화면이 열려버리는 상황을 의미합니다. 섬뜩하죠? 자.. 자기 코드를 뒤돌아 봅시다.
Leave a Reply