Oh! JUN

[WebGoat] Cross Site Scripting - 3 본문

웹 해킹/Cross-Site Scripting(XSS)

[WebGoat] Cross Site Scripting - 3

Kwon Oh! JUN 2023. 12. 21. 20:53


DOM 기반 XSS의 잠재력 식별

DOM 기반 XSS는 일반적으로 클라이언트 측 코드에서 경로 구성을 검색하여 찾을 수 있습니다. 페이지에 "반영"되는 입력을 받는 경로를 찾으세요.

이 예에서는 경로 핸들러에서 일부 '테스트' 코드를 찾고 싶을 것입니다(WebGoat는 백본을 기본 JavaScript 라이브러리로 사용합니다). 때로는 테스트 코드가 프로덕션 환경에 남겨지는 경우도 있습니다(그리고 종종 테스트 코드가 매우 단순하고 보안이나 품질 관리가 부족합니다!).

당신의 목표는 경로를 찾아 활용하는 것입니다. 우선...​ 기본 경로는 무엇입니까? 예를 들어, 이 강의의 URL을 살펴보세요. /WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9와 같은 형태여야 합니다. 이 경우 '기본 경로'는 다음과 같습니다. start.mvc#lesson/ 그 뒤의 CrossSiteScripting.lesson/9는 JavaScript 경로 핸들러에 의해 처리되는 매개변수입니다.

그렇다면 제작 과정에서 앱에 남아 있던 테스트 코드의 경로는 무엇일까요? 이 질문에 대답하려면 JavaScript 소스를 확인해야 합니다.


 

http://127.0.0.1:5555/WebGoat/start.mvc#lesson/MissingFunctionAC.lesson

/WebGoat/start.mvc -> 웹 서버
#lesson/CrossSiteScripting.lesson/6 -> 클라이언트


http://127.0.0.1:5555/WebGoat/start.mvc#test

javascript 코드를 확인해보면

'test'이 나올때는 'testRoute'함수가 호출되고 param이 전달됩니다.


lessonController 파일에서 testHandler(param)함수에 param 전달됩니다.


lessonContentView 파일에서 showTestParam(param)함수로 전달됩니다.


$el 프로퍼티에서 .lesson-content라는 클래스를 가진 HTML 요소를 찾고 html('test:' + param); 부분은 찾아낸 HTML 요소의 내용을 'test:'라는 문자열 뒤에 param 값을 붙인 문자열로 변경하는 것입니다.


그래서!

 

http://127.0.0.1:5555/WebGoat/start.mvc#test/a

클라이언트 단에서 #test/a 지정해주니까

'test:a'가 출력되는것을 확인할 수 있다.


 

DOM base XSS는 스크립트 코드가 응답값에 실리지 않고

클라이언트단에서 악성 스크립트가 구성됩니다.

 

그래서

 

위의 스크립트 코드를 burp로 잡아봐도

클라이언트(#test/<script>alert(document.cookie);<%2fscript>) 단은

잡히지 않는것을 확인할 수 있습니다.


이번 문제의

"그렇다면 제작 과정에서 앱에 남아 있던 테스트 코드의 경로는 무엇일까요?"

의 정답은 strat.mvc#test