이제, 이 문제를 고쳐봅시다. 오직 Moe Stooge가 볼 수 있는 결과만을 돌려주도록 서버를 수정하세요.
풀이
어…jsp 파일의 위치를 찾았네요…ㅎㅎㅎ
<WebGoat 디렉토리>/WebGoat/webgoat-container/target/webgoat-container-7.0-SNAPSHOT/plugin_extracted/plugin/ClientSideFiltering/jsp/clientSideFiltering.jsp
그리고 이 디렉토리는
<WebGoat 디렉토리>/WebGoat-Lessons/client-side-filtering/src/main/resources/plugin/ClientSideFiltering/jsp
와
<WebGoat 디렉토리>/webgoat/WebGoat-Lessons/client-side-filtering/target/classes/plugin/ClientSideFiltering/jsp
를 참고하는 군요.
소스 수정을 통한 보안 향상 문제는 이 위치를 참고해서 풀면 될 것 같아요…ㅎㅎㅎ
(2016-01-06 추가: Access Control Flaws의 Stage 2, 4를 푸는 데 수정한 파일들이 계속 원래대로 돌아오네요...실행시킨 후 수정해도 적용안되고...)
jsp파일은 xml 파일을 읽은 다음 xPath.evaluate() method를 통해 필요한 내용만 뽑아내어 출력합니다. 우리는 여기서 evaluate를 통해 내용을 가져올 때, 허락된 내용만 가져오도록 권한 검사를 해줘야 합니다.
소스를 보시면
File d = new File(this.getServletContext().getRealPath("/plugin/ClientSideFiltering/jsp/employees.xml")); if (d.exists()) { System.out.print("File does exist"); } else { System.out.print("File DOES NOT exist"); }
Xml 파일을 불러오고 있습니다. 이 파일은 jsp파일과 같은 폴더에 있으며, 그 구조는 다음과 같습니다.
<Employees> <Employee> <UserID>101</UserID> <FirstName>Larry</FirstName> <LastName>Stooge</LastName> <Street>9175 Guilford Rd</Street> <CS>New York, NY</CS> <Phone>443-689-0192</Phone> <StartDate>1012000</StartDate> <SSN>386-09-5451</SSN> <Salary>55000</Salary> <CreditCard>2578546969853547</CreditCard> <Limit>5000</Limit> <Comments>Does not work well with others</Comments> <DisciplinaryExplanation>Constantly harassing coworkers</DisciplinaryExplanation> <DisciplinaryDate>10106</DisciplinaryDate> <Managers> <Manager>102</Manager> <Manager>111</Manager> <Manager>112</Manager> </Managers> </Employee> ... ... ... </Employees>
정책의 아래쪽을 보시면 Managers 라고 해당 Profile을 볼 수 있는 사용자들이 적혀있습니다.
다시 JSP 파일로 와서, 위 XML 파일의 내용 중 가져올 내용을 설정하는 부분은 다음과 같습니다.
StringBuffer sb = new StringBuffer(); sb.append("/Employees/Employee/UserID | "); sb.append("/Employees/Employee/FirstName | "); sb.append("/Employees/Employee/LastName | "); sb.append("/Employees/Employee/SSN | "); sb.append("/Employees/Employee/Salary "); String expression = sb.toString();
여기에 권한 검사를 추가해야합니다. XML에서 Managers를 통해 접근 권한을 설정해 두었으므로 이를 이용하면,
StringBuffer sb = new StringBuffer(); sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/UserID | "); sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/FirstName | "); sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/LastName | "); sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/SSN | "); sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/Salary "); String expression = sb.toString();
이와 같이 수정 할 수 있습니다. 변경된 소스를 적용하고 다시 시도하면, 공격이 불가능해지면서 문제를 풀 게 됩니다.
userId를 바꿔가면서 접속해보면 표시되는 내용이 다릅니다. 근데 문제는 풀렸다고 안뜨네요…왜지….
userId=102
userId=106