이번 문제는 전에 풀었던 드림핵 워게임과 유사해서 쉽게 파악하고 풀 수 있었다.
아래는 웹 소스 코드이다.
<h2>you can inject anything</h2>
<div id=injected>
foo
</div>
<script src=/script.js nonce=Ov48IUuCBCL/8LzojAxTobUck1k=></script>
나름 친숙한 nonce가 보인다.
아래는 웹페이지다.
Error Report를 누르면 아래와 같은 화면이 나온다.
admin이 url을 확인하고 접속하는 것 같다.
inject파라미터에 따라서 파라미터가 html에 그대로 노출된다.
이걸 보아하니 XSS공격 같다.
대놓고 아래처럼 스크립트를 삽입해보았다.
필터링이 되지 않고 있다.
하지만 스크립트 역시 실행이 되지 않고 있다.
이건 바로 csp정책 때문이다.
전에 공부했듯이 nonce가 설정이 되어있으면 예측 가능하지 않는 이상 script문을 실행할 수 없다.
근데 바로 떠올릴 수 있었던 것 바로 이 소스에 base url이 지정되어 있지 않다는 것이었다.
base를 나의 서버로 하고 그 곳에 악성 script.js파일을 만들어 놓고 이 웹에서 <base href="내 도메인">를 한다면 자연스럽게 /script.js는 나의 서버의 파일을 가져오게 될 것이다.
그럼 내 dothome 게시판 웹에 script.js를 올려보겠다.
드림핵의 request.bin 툴을 이용하여 요청을 받은 내용을 확인하고 그 안에 쿠키를 심어서 보낼 생각이다.
그럼 그 코드가 실행된 피해자는 자신의 쿠키를 나에게 보내게 되어 나는 쿠키를 탈취할 수 있게 될 것이다.
아래는 나의 악성 스크립트 파일이다.
이제 원래 웹에 가서 base를 지정해주자.
아래처럼 하게 되면
다음과 같이 base태그가 삽입 되면서 /script.js는 내 서버에 가져오게 된다.
하지만 이렇게 하면 내 쿠키가 갈 뿐이므로 admin에게 접속하게 하여 admin의 쿠키를 가져오자
바로 아래에서 똑같은 url로 접속하게 하면
request툴에 url뒤로 admin의 쿠키에 있는 flag가 딸려오게 된다.