SOP(Same-Origin Policy)
- 브라우저의 보안 정책
- 동일한 출처의 리소스만 (자바스크립트) 접근 가능
- 동일 출처의 기준 : Scheme, Domain, Port
- ex) http://alioth.com:1234/main/test.html
Origin : http://alioth.com:1234
위의 페이지에서 로드된 리소스에 접근 가능하려면
동일한 출처 즉, Scheme, Domain, Port 가 전부 같은 곳에서 요청한 경우만 접근 가능하다.
ex)
http://a1ioth.com:1234/main/test.html -> X 도메인이 다름
https://alioth.com:1234/main/test.html -> X 스키마가 다름
http://alioth.com:80/main/test.html -> X 포트가 다름
http://alioth.com:1234/main/index.html -> O 리소스 접근 가능
※ 한계
- 다른 도메인과 리소스 교환이 불가능해지면서 웹 사이트의 확장성이 없어짐.
※ 대응
CORS(Cross-Origin Resource Sharing)
- 브라우저의 보안 정책
- (ACAO 헤더에 포함된) 다른 출처에서도 리소스에 접근 가능
ACAO(Access-Control-Allow-Origin) Header
- 다른 출처의 접근을 화이트 리스트 기반으로 허용해 준다.
- 리소스 접근에 허용할 도메인을 ACAO 헤더에 등록한다.
- 요청의 Origin 값과 응답의 ACAO 값 검증
<!-- Origin : http://white.com -->
<iframe src="vuln.com/mypage.php">
</iframe>
<script>
// vuln.com 의 리소스 사용할 거에요!
</script>
예를 들어 white.com 도메인에서 vuln.com 도메인의 마이페이지 리소스를 불러온다고 했을 때,
Access-Control-Allow-Origin : http://white.com
브라우저가 vuln.com의 ACAO 헤더를 확인한 뒤,
white.com 도메인이 포함돼 있으면
white.com에서 자바스크립트로 vuln.com의 리소스를 사용할 수 있는 것이다.
<!-- Origin : http://hack.com -->
<iframe src="vuln.com/mypage.php">
</iframe>
<script>
// vuln.com 의 리소스 사용할 거에요!
</script>
반대로 ACAO 헤더에 포함되지 않은 hack.com 도메인에서 vuln.com의 리소스를 요청한다면
<iframe>은 동작해서 vuln.com/mypage.php 페이지가 로드되지만,
자바스크립트로 로드된 페이지에 접근이 불가능해진다.
※ 주의사항
- 서버에서 응답된 <iframe> 페이지 로드는 동작한다.
- 브라우저에서 <iframe>으로 로드된 페이지에 자바스크립트 접근을 차단한다.
- 자바스크립트 접근을 막는 것이지 <iframe> 로드를 막는 게 아니다!!
- 때문에 <img> 태그 등은 자바스크립트와 관련이 없으므로 동작한다!!
※ 한계
와일드 카드 사용
Access-Control-Allow-Origin : *
ACAO 헤더의 경우
개발자가 White List 기반으로 허용할 도메인을 하나하나 추가해 주어야 한다.
하지만, ACAO 헤더에 * (와일드카드)를 사용해 모든 도메인을 허락하도록 개발하는 경우가 있다.
이런 경우 SOP와 CORS의 존재 이유가 사라지기 때문에
브라우저에서는 ACAO 헤더에 *(와일드카드) 사용 시, 쿠키 리소스를 사용 불가능하게 만들었으며,
ACAC 헤더를 만들어 쿠키 리소스 사용을 제한했다.
※ 대응
ACAC(Access-Control-Allow-Credentials) Header
<!-- 와일드 카드 사용 불가능!! -->
Access-Control-Allow-Origin : *
Access-Control-Allow-Credentials : true
<!-- 정상적인 설정 -->
Access-Control-Allow-Origin : http://white.com
Access-Control-Allow-Credentials : true
쿠키 리소스를 사용해야 하는 요청을 하면
서버는 ACAC 헤더의 값을 true로 설정하고
이 경우 ACAO 헤더에 *(와일드카드)를 사용할 수 없으며, 특정 도메인을 명시해야 한다.
※ CORS Misconfig Vuln 1
ACAO 헤더 동적 할당
<!-- Origin : http://hack.com -->
<iframe src="vuln.com/mypage.php">
</iframe>
<script>
// vuln.com 의 리소스 사용할 거에요!
</script>
hack.com 도메인에서 vuln.com의 리소스를 사용하겠다는 요청을 한다.
Access-Control-Allow-Origin : http://white.com, http://hack.com
들어온 요청의 도메인을 ACAO 헤더에 동적으로 할당한다.
※ CORS Misconfig Vuln 2
Origin Header 에 Null 값 허용
<!-- 요청 -->
Origin: null
<!-- 응답 -->
Access-Control-Allow-Origin : null
개발 과정 중, 임시로 Origin 헤더 값에 null을 허용하는 케이스가 있다. (ACAO : null)
이 경우 <iframe>에서 요청을 보내면 Origin 헤더 값이 null로 요청되므로 리소스에 접근할 수 있게 된다.
※ CORS Misconfig Vuln 3
서브도메인 허용
<!-- 요청 -->
Origin : badalioth.com
<!-- 응답 -->
Access-Control-Allow-Origin : *alioth.com
예를 들어 alioth.com 도메인의 서브 도메인들을 ACAO 헤더에 등록할 때,
와일드카드 등을 이용해서 맨뒤가 alioth.com인 도메인을 전부 허용하도록 설정하면,
badalioth.com과 같은 공격자의 요청이 내부 도메인 리소스에 접근할 수 있게 된다.
'Web > Theory' 카테고리의 다른 글
Web Cache Work (2) | 2024.07.22 |
---|---|
File Upload Vuln (0) | 2024.07.20 |
CSRF(Cross Site Request Forgery) (0) | 2024.07.08 |
XSS 정리 (1) | 2024.06.24 |
DOM Based XSS (1) | 2024.06.24 |