DOM XSS? 그렇다면 Eval Villain

올해 초 Burpsuite에선 DOM Invador라는 도구를 공개했었습니다. 제가 가볍게 리뷰할 때에도 이야기드렸지만 DOM 기반 테스팅에선 굉장히 유용하기 때문에 Burpsuite 사용자는 물론 ZAP 등 다른 도구 사용자도 충분히 관심가지고 테스트 때 열어서 써봐야할 정도의 도구였었죠.

사실 다른 진영에서도 쓸 수 있는 도구가 일찌감치 있긴 했었습니다. 바로 Eval Villain 란 Firefox extension 인데요.

잘 알려지지 않았던 도구인데 이번에 ZAP의 Browser extension 관련 업데이트 이후 ZAP 공식 블로그를 통해 소개되었고 저도 사용해보고 괜찮다고 판단하여 블로그에 글로 리뷰 해봅니다.

What is Eval Villain?

Eval Villain은 native javascript function을 후킹하여 웹 페이지에서 해당 function을 어떻게 사용하는지, 호출되는지 분석할 수 있도록 arguments, stacktrace 등을 제공해주는 도구입니다. DOM Invador와 비슷하게 URL Query 등으로 들어온 입력 값 또한 분석해서 보여줍니다.

Hook native JavaScript functions, before page load, to see how a website uses them. Search input for user defined strings, regular expressions, or GET parameters.

Installation

Using only Firefox Browser

Eval Villain은 Firefox addons에 등록된 addon으로 https://addons.mozilla.org 에서 검색하시거나 아래 링크로 직접 들어가서 extension을 설치해주시면 됩니다.

https://addons.mozilla.org/en-GB/firefox/addon/eval-villain/

Using in ZAP

chrome, safari 등 다른 브라우저로 https://addons.mozilla.org/en-GB/firefox/addon/eval-villain/ 페이지에 접속하여 xpi 파일을 다운로드한 후 ZAP의 Options > Selenium > Browser Extensions에 추가해주시면 됩니다.

이에 대한 자세한 내용은 [ZAP Browser Extension 영구 적용하기](https://www.hahwul.com/2021/11/28/use-extension-in-zap-embeded-browser/) 글을 참고해주세요.

어떻게 사용하는거지?

Eval Villain이 설치된 상태에서 웹 페이지에 접근하면 Eval Villain의 Extension 버튼을 통해 On/Off 및 여러가지 설정이 가능합니다.

각각 기능과 설정은 아래와 같습니다.

Name Description
Needles 모니터링할 패턴을 지정합니다.
Blacklist 무시할 패턴을 지정합니다.
Functions 모니터링할 Javascript function을 지정합니다. 기본적으로 innerHTML, documentWrite 등 DOM XSS에 사용되는 대다수 패턴을 이미 추가되어 있습니다.
Targets 모니터링할 도메인 패턴을 지정할 수 있습니다.
Enable/Disable 위 패턴을 개별적으로 Enable / Disable 합니다.
Auto open Eanble된 항목에 해당하는 패턴이 매치됬을 떄 콘솔을 열어줍니다.
Types 모니터링할 Type을 지정합니다. (기본은 String)
Configure 위 항목들의 실제 패턴(Regex)을 설정합니다.
Configure > Console Colors 보기 쉽게 Colorize 되어있는데 이 값을 수정할 수 있습니다.

이제 Hook 설정에 따라서 Console에서 정보를 확인하실 수 있습니다.

DOM XSS를 찾아보자!

DOM XSS를 하나 예시로 테스트 해보면

<html>
<head>
<title>Custom Dashboard </title>
</head>
Main Dashboard for
<script>
	var pos=document.URL.indexOf("context=")+8;
	document.write(decodeURI(document.URL.substring(pos,document.URL.length)));
</script>
</html>

해당 페이지는 context 파라미터 값이 DOM으로 반영되는 페이지입니다. Needle에 걸리지 않는 페이지에선 따로 정보가 노출되지 않지만 만약 Needle에 걸리는 패턴이 나타나면 두번째 이미지처럼 arguments, query(파라미터명+값), stack(stacktrace) 정보를 보여줍니다.

Needle에 걸리지 않을 땐 별다른 정보가 없지만..

Needle에 걸리면 디테일한 정보를 넘겨줍니다 😍

분석가는 이를 보고 페이지의 context 파라미터가 Needle 규칙에 걸리는 패턴으로 확인하고 추가적인 분석을 진행할 수 있습니다.

그래서 stacktrace를 따라가면서 함수 호출 구간을 추적하면 되는데, 위에 EvalVillainHook과 apply는 EvalVillain에서 사용하는 함수 구간으로 바로 아래 <익명> 표기된 마지막 부분을 확인해봅시다. 눌러서 코드 위치로 가보면 어떤 구간에서 사용됬는지 볼 수 있습니다. 바로 코드를 추적하여 Debugger에서 테스트할 수 있는 것도 아주 좋은 장점이죠.

캡쳐에는 제대로 안나왔지만 해당 라인으로 하이라이팅이 걸립니다.

위치 파악이 되었으니 바로 DOM XSS 를 테스트하면 됩니다. 만약 검증 로직 때문에 문제가 있다고 하더라도 아래 콘솔 부분에서 어떻게 처리되는지 확인할 수 있어서 분석에도 편리합니다.

Conclusion

전체적인 기능은 DOM Invador와 유사합니다. 아니 오히려 커스텀할 수 있는 부분이 많아서 잘 쓴다면 Eval Villain이 더 좋다는 느낌을 받습니다. 다만 하나 아쉬운 점이라면 DOM Invador의 경우 Burp에 직접적으로 상호작용 하면서 처리할 수 있는 부분들이 있는데(예를들면 Passive scan과의 조합성) 이런점에선 약간 아쉬움이 있긴 합니다.

아무도 하지 않는다면 나중에 제가 살살 ZAP Passive scan과 연동해봐야겠네요.

그럼 해피 해킹하세요 😎

FnGJfc18tDDHy

References

  • https://addons.mozilla.org/en-GB/firefox/addon/eval-villain/
  • https://www.zaproxy.org/blog/2021-12-01-the-eval-villain-add-on/
  • https://www.hahwul.com/2021/07/01/dom-invader/
  • https://www.hahwul.com/2021/11/28/use-extension-in-zap-embeded-browser/