STAGE 5: DOM XSS 취약점을 완화시키는 client 쪽 HTML entity encoding을 수행하세요.
유용한 method는 당신의 escape.js 안에 제공됩니다.
풀이
다음은 Stage 5에 대한 WebGoat 소스 입니다.
protected Element doStage5(WebSession s) throws Exception { ElementContainer ec = new ElementContainer(); ec.addElement(mainContent(s)); /** * They pass iff: * * 1. If the DOMXSS.js file contains the lines "escapeHTML(name)" */ String file = s.getWebResource(LessonUtil.buildJsPath(s, this, "js/DOMXSS.js")); String content = getFileContent(file); if (content.indexOf("escapeHTML(name)") != -1) { makeSuccess(s); } return ec; }
DOMXSS.js 에 escapeHTML(name)이 있으면 정답이라고 하네요.
F12 -> 개발자 도구 -> Net 탭에서 정보를 가져옵니다.
우리가 원하는 파일이 둘다 있네요.
escape.js 파일의 내용은 아래와 같습니다.
function escapeHTML (str) { var div = document.createElement('div'); var text = document.createTextNode(str); div.appendChild(text); return div.innerHTML; }
str을 파라미터로 받아와 text로 변경하여 div tag의 자식으로 추가한 후 HTML에 다시 적용하고 있습니다. 이렇게 하면 악의적인 스크립트들이 동작하지 못하겠네요.
이 파일의 내용을 DOMXSS.js에 포함시키면 됩니다.
크롬의 경우 개발자도구에서 바로 가능할 텐데 firefox는 그렇지 않네요. 서버에서 변경한 후 받아야 갰습니다.
Net 탭에서 DOMXSS.js의 위치는
WebGoat/plugin_extracted/plugin/DOMXSS/js/DOMXSS.js
로 나오네요.
서버에서의 위치는
<WebGoat 디렉토리>/WebGoat/webgoat-container/target/webgoat-container-7.0-SNAPSHOT/plugin_extracted/plugin/DOMXSS/js
입니다. 이 위치로 가서 DOMXSS.js 파일에 escape.js 파일의 내용을 추가시켜 주세요.
$ cat escape.js >> DOMXSS.js
DOMXSS.js 파일의 내용이 바뀌었습니다. 만약 안 바뀐다면 쿠키 등을 지워보고 페이지 새로 고침을 해주세요. 그 다음엔, 이 함수가 실행되도록 수정해야합니다.
지금부터…수정할 위치를 찾는 수사를 진행하도록 하지…
입력하는 곳에서 우클릭 -> 요소검사를 하면 displayGreeting(person.value) 로 입력 값을 넘기는 걸 볼 수 있습니다.
일일이 찾기는 귀찮으니 서버에서 명령어로 찾습니다.
$ cd <WebGoat 디렉토리>/WebGoat/webgoat-container/target/webgoat-container-7.0-SNAPSHOT
$ grep -r "displayGreeting" ./*
결과는 아래와 같습니다.
음…찾고 보니 DOMXSS.js 파일에 있던 함수네요…;;;
DOMXSS.js 파일 안에 escapeHTML함수를 넣고 같은 곳에 있는 displayGreeting 함수에서 호출하도록 수정하는 문제였습니다…;;;
다음과 같이 수정해주세요.
function displayGreeting(name) { if (name != ''){ document.getElementById("greeting").innerHTML="Hello, " + escapeHTML(name) + "!"; } } function escapeHTML (str) { var div = document.createElement('div'); var text = document.createTextNode(str); div.appendChild(text); return div.innerHTML; }
이제 DOM Based XSS를 시도해도 스크립트가 실행되지 않고, 입력한 값 그대로 화면에 출력되는 것을 볼 수 있습니다.
하지만, Complete는 안뜨네요…하…