Stage 2: Add Business Layer Access Control
이 Lesson은 WebGoat의 Developer version에서만 동작합니다.
삭제 기능에 대한 비인가 접근을 막기 위해 수정을 해라. 이를 위해, WebGoat code를 고쳐야 할 것입니다. 이 것을 할 때, stage 1을 반복하고, DeleteProfile 기능으로의 접근이 제대로 거부되는 지 확인해라.
풀이
(저의 모든 풀이는 WebGoat 7.0 기준임을 알려드립니다.)
주요 기능은 java 파일로 되어 import 되기 때문에 제대로 이해하기 위해선 WebGoat을 Eclipse에 연동시킬 필요가 있습니다.
연동시킨 후 이 문제에 해당하는 파일은 org.owasp.webgoat.plugin.rollbased package에 있는 java 파일들과 WebContent/plugin_extracted/plugin/RoleBasedAccessControl/jsp 에 있는 파일들입니다.
여기서 RoleBasedAccessControl.java 파일의 240번째 줄을 보면 Stage 2 완료 조건이 나와있습니다.
(참고로, 이크립스 자동 줄 맞춤은 Ctrl + Shift + F 입니다.)
if (STAGE2.equals(stage)) { try { if (RoleBasedAccessControl.DELETEPROFILE_ACTION.equals(requestedActionName) && !isAuthorized(s, getUserId(s), RoleBasedAccessControl.DELETEPROFILE_ACTION)) { setStageComplete(s, STAGE2); } } catch (ParameterNotFoundException pnfe) { pnfe.printStackTrace(); } }
!isAuthorized(…)를 수행한 결과가 참이면 문제가 풀리니 그대로 적용시켜 참이 되게 만들면 됩니다. 이 소스를 수정할 위치는 213 ~ 219번째 줄입니다.
(RoleBasedAccessControl.java: 213 ~ 219)
WebGoat의 구조라서 저도 자세히는 모르지만 handleRequest Method의 내부인 것으로 보아 현재 request에 대한 처리 부분이라 생각하고 있습니다. 게다가 CODE HERE 이래잖아요…ㅎㅎㅎ;;;
// ***************CODE HERE************************* // ************************************************* if (action.isAuthenticated(s)) { action.handleRequest(s); } else throw new UnauthenticatedException();
이 부분을
// ***************CODE HERE************************* // ************************************************* if (action.isAuthenticated(s)) { int userId = action.getUserId(s); if (action.isAuthorized(s, userId, action.getActionName())) { action.handleRequest(s); } else { throw new UnauthorizedException(); } } else throw new UnauthenticatedException();
이렇게 고치시면 됩니다. isAuthorized()를 따로 빼도 되고, 수정 형태는 마음대로 하셔도 됩니다.
뭐… 사실 284번째 줄에 가면 handleRequest() method에 대한 정답 버전 백업이 있습니다. 어떻게 해야할 지 모르겠다면 이 백업을 참고하시면 됩니다. 저도 참고…ㅎㅎ…
실제로 적용하는 위치는
<WebGoat 디렉토리>/WebGoat/webgoat-container/target/webgoat-container-7.0-SNAPSHOT/plugin_extracted/org/owasp/webgoat/plugin/rollbased
이고, 이 디렉토리는 WebGoat이 시작할 때
<WebGoat 디렉토리>/WebGoat-Lessons/role-based-access-control/src/main/java/org/owasp/webgoat/plugin/rollbased
이 위치를 참고하는 거 같은 데…해도 안 풀리네요;;; 풀이는 저게 맞는 데…;;;