Cross Site Scripting (XSS)

옥영진·2021년 3월 28일
0

WebGoat

목록 보기
6/9

Cross Site Scripting

1)


단순히 같은 브라우저 내에서 여러 탭으로 접속했을 때, 각 탭마다 로그인 세션값이 같은지에 대한 문제이다. 같은 브라우저에서는 쿠키 값을 공유하므로 로그인 세션값이 모두 같으므로 yes라는 대답을 전송하면 통과할 수 있다. 물론 다른 브라우저로 접속한다면 각 브라우저 마다 쿠키를 공유하지 않기 때문에 로그인 세션값이 다르다.

2)


해당 페이지에 존재하는 입력 필드들 중 XSS에 취약한 필드를 찾아내는 것이 문제이다.


일단 update 버튼은 단순히 수량을 초기화 하는 기능에 불과했고, purchase 버튼을 클릭했을 때는 위와 같은 패킷을 전송했다. GET 방식으로 url에 총 6개의 파라미터를 전송하고 있었다.


수량을 입력하는 필드는 전부 숫자형 타입으로 되어 있었고,


개발자 도구를 통해 숫자 타입을 지운 채로 스크립트를 입력하여 전송해보았지만,


400에러를 리턴하였고, 메시지를 확인해보니 서버에서 문자열을 숫자형으로 변환할 때 에러가 발생한 것 같다. 이는 수량 입력 필드는 서버에서 숫자형으로 변환하면서 입력값을 검증하기 때문에 스크립트를 삽입할 수 없다는 것을 의미한다.


이번에는 카드 번호 입력 필드에 스크립트를 삽입하여 전송해보았다.


서버의 응답으로 페이지 내에서 입력했던 스크립트가 실행되어 해당 필드가 XSS에 취약하다는 것을 알 수 있다.


원래 정상적으로 카드 번호를 입력했을 때, 입력한 카드 번호가 서버의 응답으로 그대로 전달되기 때문에 발생하는 문제이다. 서버에서 카드 번호 입력 필드에 입력한 값을 따로 검증하지 않은 채 그대로 클라이언트로 전송하여, 입력한 스크립트가 클라이언트 상에서 실행되는 것이다.
결국 서버에서 입력값에 대한 검증을 하거나, 입력값을 클라이언트 페이지 상에 그대로 노출되지 않도록 조치하면 될 것으로 보인다.

3)


이번 문제는 개발시에 남겨놓은 테스트 코드를 찾아 해당 경로에 대한 정보를 알아내면 되는 문제이다. 현재 페이지의 url이 /WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9로 되어 있는데, 기본 경로는 /WebGoat/start.mvc#lesson이고, 그 이하는 자바스크립트 라우터 핸들러 파일에 의해 처리되는 파라미터라고 한다. 자바스크립트 파일에 의해 경로가 처리된다고 했으므로, 개발자 도구를 통해 로드된 자바스크립트 파일 목록을 살펴보기로 했다.


개발자 도구의 Debugger 탭에서 검색을 통해 경로 처리를 하는 자바스크립트 파일을 찾아보았다.


route로 검색해보니 GoatRouter.js 라는 파일에서 경로 처리를 하는 것으로 보이는 부분이 존재했다.


현재 페이지 url 처럼 /WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9lesson/:name/:pageNum으로 매칭을 할 수 있다. 그렇다면 테스트용 url로 보이는 test/:param으로 매칭해보면, /WebGoat/start.mvc#test/parameter 이런 url 형식으로 접근이 가능하다고 예상할 수 있다. 여기서 파라미터를 제외한 기본 경로인 start.mvc#test를 입력하면 된다.

4)


이전 문제에서 확인한 url로 접근하면 parameter 값을 적절히 필터링하지 않는 것을 알 수있는데, 이를 통해 url로 webgoat.customjs.phoneHome() 함수를 호출하여 그 값을 구하면 되는 문제이다.


개발자 도구에 있는 콘솔창을 통해 해당 함수를 호출하면 위와 같은 값이 결과로 나오는 것을 알 수 있었다.


이전에 구한 테스트 url로 접근하면 url에 입력한 파라미터 값을 클라이언트 브라우저 상에 그대로 표시하고 있다. 그렇다는 건 파라미터에 스크립트를 삽입하면 그대로 응답으로 온다는 의미이므로 문제에서 요구한 함수를 실행하는 스크립트를 삽입해보았다.


url에는 아스키코드에 포함되지 않은 문자나 특수문자는 인코딩해서 전송해야하므로 스크립트를 url 인코딩처리를 했다.


스크립트를 삽입한 후 접속하면 브라우저 상에는 어떠한 값도 표시되지 않았다.


하지만 버프 슈트에는 패킷이 잡혀있었는데, 해당 패킷의 응답에 어떤 숫자가 리턴된다. 이 값을 입력하면 해결된다.

profile
안녕하세요 함께 공부합시다

0개의 댓글