본문 바로가기

Web/Theory

CORS(Cross-Origin Resource Sharing)

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