김승현

[Dreamhack : Web] SCP Bypass advanced 본문

Web/Dreamhack : Web

[Dreamhack : Web] SCP Bypass advanced

kshind 2023. 3. 3. 13:02

문제

 

CSP Bypass 문제의 업그레이드 버전이다.

 

풀이

접속하면 이렇게 vuln, memo, flag 페이지를 볼 수 있다. vuln 부터 가보자.

이렇게 생겼다. memo로 가보자.

이렇게 생겼다. flag로 가보자.

각 엔드포인트들은 지금까지 보던 것들과 완전 똑같이 생겼다. 이번엔 소스코드를 확인해 보자.

memo나 flag 같은 페이지는 이전 문제들과 큰 차이점이 없기 때문에 차이점이 있는 내용들만 분석하겠다.

nonce

일단 코드 초반부에 unsigned 랜덤값을 16진수로 변환해서 nonce 변수에 저장한다.

 

vuln

vuln엔드포인트에서 이전엔 그냥 param을 return하는 방식이었는데 이번엔 html을 render_template를 이용해서 보여주기

때문에 vuln 페이지에서 테스트를 해볼 순 없을 것 같다....ㅜ

 

after_request

이 함수의 경우  HTTP 요청이 끝나고 브라우저에 응답하기 전에 실행되는 것들이다.

전역 변수로 nonce를 선언response의 헤더에,

['Content-Security-Policy'] = f"default-src 'self'; img-src https://dreamhack.io; style-src 'self' 'unsafe-inline'; script-src 'self' 'nonce
-{nonce}'; object-src 'none'"

내용을 저장. 저번 csp 문제와 다른 점은 obeject-src에 none이 추가된 것이다.

onject-src의 경우 찾아보니까 <object>, <embed>에 대한 유요한 소스 검사라고 하는데 해당 내용은 none이기 때문에

위의 object, embed와 같은 태그들은 모두 쓰지 못할 것 같다.

nonce 변수에 unsinged 랜덤값을 16진수로 저장

response를 반환

 

이정도만 봐도 memo, flag, index 엔드포인트들은 기존에서 nonce만 추가됐기 때문에 분석할 필욘 없어 보인다.

 

CSP Bypass문제에서 사용한 코드는

<script src="/vuln?param=location='/memo?memo='%2bdocument.cookie"></script>

위의 코드인데 여기는 object-src에 해당되는 내용이 없는 것 같아서 그대로 한 번 flag에 넣고 memo를 확인했다.

그러나 flag없이 hello만 있었다. 분명 flag에선 good이 떴기 때문에 필터나 그런 건 걸린 게 아닌 것 같긴 한데....

object-src에 포함되는 코드들을 검색해봤다. 그러나 딱히 내가 입력한 파라미터완 관련이 없어 보여서 강의를 다시 봤더니

base uri 미지정일 때 nonce retargeting이라는 공격이 있다고 해서 이걸 활용하면 될 것 같다.

강의에서 보면 jquery.js처럼 우리가 사용할 수 있는 서버 내의 js 코드를 찾아낼 필요가 있다. 개발자도구를 써보자.

vuln 페이지의 Elements인데 스크립트로 실행되는 /static/js/jquery.min.js와  /static/js/bootstrap.min.js이 있다.

이걸 내 서버에 같은 이름으로 업로드 하는데 내용만 바꿔서 올려보자. 

/static/js/jquery.min.js

location.href="127.0.0.1/memo?memo="+document.cookie