이번 문제는 CSP 가 적용된 웹사이트에 xss 공격을 성공시켜야 하는 문제인것으로 확인됩니다.
CSP는 웹사이트에서 사용되는 컨텐츠에 대한 규칙같은 것입니다.
CSP는 헤더를 통해서 규칙을 설정합니다.
그러므로 우선 이 웹사이트의 응답 헤더를 살펴보고 어떤 규칙이 있는지 확인해봐야 합니다.
CSP는 Content-Security-Policy의 약자입니다.
이 부분을 살펴보면
특정 도메인만 무조건 SSL 통신을 하도록 설정 되어있다는것을 알수 있습니다.
여기에는 두 도메인이 설정되어있는데, 이 웹사이트 도메인과 사진을 가져오는 도메인입니다.
이 웹사이트에서 about me 페이지의 소스입니다.
잘보면 ?menu= 뒤에있는 문자열에 따라서 페이지가 달라지는것이 보입니다.
YWJvdXQ= 이라는 문자열이면 About Me 페이지로 가는 신기한 방식입니다.
그리고 About Me 페이지에서는 jsonp?menu=about 이라는 스크립트를 불러오는 방식으로 되어있습니다.
Cat 탭을 눌러서 넘어가면 다음과 같이 jsonp?menu=cats 라는 JS가 작성되어있습니다.
서로 연관성 없어보이는 문자열인데 굳이 왜 이렇게 했을까라는 생각이 들어서 이 웹사이트에서 쓰인
자바스크립트 파일을 찾아봤습니다.
이 JS 파일을 보면 지금까지의 의문점이 풀립니다.
main 함수에서는 ?menu= 뒤에 문자열이 있으면 atob 함수에 문자열을 인자로 넣은값으로 menu 변수를 초기화합니다.
만약 없다면 그냥 'about' 이라는 문자열로 초기화 합니다. 그리고 html 문서에 아까전에 봤었던
자바스크립트 형식에 menu변수를 encodeURIComponent함수에 인자로 넣었을때 나온 반환값으로 추가시킵니다.
요약해보자면 ?menu= 뒤에 있는 임의의 문자열을 atob함수에 넣으면 특정 문자열로 변하게되고
만약 아무 문자열도 없으면 그냥 'about' 이 됩니다.
일단 ?menu= 뒤에 적절한 JS 코드를 넣으면 사이트에 JS가 삽입되어서 alert함수를 실행시킬수 있을것으로 보입니다.
이 사이트에서는 뒤에붙는 문자열을 atob함수에 넣어서 변환시키기 때문에,
JS 코드를 짠뒤, btoa함수를 통해서 JS코드를 변환시켜준뒤 ?menu= 뒤에 넣어서 전송하면
alert를 실행할수 있을것입니다.
이를 기반으로 먼저 코드를 짜보면 다음과 같습니다.
<script src = 'jsonp?callback=alert(1);//'></script>
이 코드를 btoa함수로 변환시키면 다음과 같은 문자열이 나옵니다.
이 문자열을 통해서 쿼리를 작성해보면 다음과 같습니다.
.../?menu=PHNjcmlwdCBzcmMgPSAnanNvbnA/Y2FsbGJhY2s9YWxlcnQoMSk7Ly8nPjwvc2NyaXB0Pg==
이 쿼리를 전송하면 다음과 같이 성공적으로 xss에 성공한것을 확인할수 있습니다.
'워게임 > xssgame.com' 카테고리의 다른 글
[xssgame] Angular 2 (0) | 2022.06.07 |
---|---|
[xssgame] Angular (0) | 2022.06.07 |
[xssgame] Google Reader (0) | 2022.06.07 |
[xssgame] Gallery (0) | 2022.06.06 |
[xssgame] Time's out! (0) | 2022.06.06 |