Intro

JSONP(JSON with Padding)는 Same-Origin Policy 일명 SOP 정책을 우회하기 위해 나온 것으로 다른 도메인으로부터 데이터를 가져와야 하는 상황이 많은데, 이럴 때마다 cross-domain 이슈가 발생하여 이러한 번거러움을 없애기 위해 나온 방법입니다.

<script>태그는 src 속성에 대해서 해당 자바스크립트를 포함이 아닌 실행시키는 특징을 가지고 있습니다. 이 때, JSONP 요청으로 응답이 온 Text 타입을 javascript로 인식하여 바로 실행하게 됩니다.

Detect & Exploit

Detect

보통 CSP 정책을 설정할 때, google.com 등과 같이 메이저 도메인을 사용하는 경우가 많고, 그렇기에 허용해주는 경우도 많습니다. JSONP를 제공하는 도메인이 CSP 정책에서 허용되어 있는지만 확인하면 됩니다.

[Response]
HTTP/2 200 OK
Content-Security-Policy: script-src *.google.com ~

Exploit

가장 흔한 google의 oauth API를 예시로 적고 나머지는 Reference에 적어둔 페이지에서 상황에 맞게 사용하시면 되겠습니다.👍

<script src="https://accounts.google.com/o/oauth2/revoke?callback=alert(1337)"></script>

Security Measures

와일드카드로 설정하는 것을 가급적 피하고, nonce- 혹은 sha256- 과 같은 엄격한 CSP 정책을 설정해주는 것이 좋습니다.

References

Content Security Policy JSONP Payload