공격 유형
=====

이 문서는 다양한 유형의 보안 공격과 이를 완화하는 기술을 다룹니다.

클릭재킹
----

클릭재킹은 사용자가 생각하는 것과 다른 링크, 버튼 등을 클릭하도록 사용자를 속이는 행위입니다. 예를 들어 로그인 자격 증명을 훔치거나 멀웨어를 설치하기 위해 사용자도 모르게 권한을 얻는 데 사용할 수 있습니다. (클릭재킹은 때때로 "사용자 인터페이스 교정"이라고 하지만 이는 "교정"이라는 용어를 오용한 것입니다.)

교차 사이트 스크립팅 (XSS)
-----------------

교차 사이트 스크립팅(XSS)은 공격자가 웹 사이트에 악성 클라이언트 측 코드를 주입할 수 있는 보안 공격입니다. 이 코드는 피해자에 의해 실행되며 공격자가 접근 제어를 우회하고 사용자를 가장할 수 있습니다. Open Web Application Security Project에 따르면 XSS는 2017년에 7번째로 가장 흔한 웹 앱 취약점이었습니다.

이러한 공격은 웹 앱이 충분한 유효성 검사 또는 인코딩을 사용하지 않는 경우 성공합니다. 사용자의 브라우저는 악의적인 스크립트가 신뢰할 수 없는지를 감지할 수 없으므로 쿠키, 세션 토큰 또는 다른 중요한 사이트별 정보에 대한 접근 권한을 가져가거나 악의적인 스크립트로 HTML 내용을 다시 쓸 수 있습니다.

일반적으로 교차 사이트 스크립팅 공격은 1) 데이터가 신뢰할 수 없는 소스(대부분 웹 요청)를 통해 웹 앱에 입력되거나 2) 악성 콘텐츠에 대한 유효성 검사 없이 동적 콘텐츠를 웹 사용자에게 전송될 때 발생합니다.

악성 콘텐츠에는 보통 JavaScript가 포함되지만 가끔 HTML, Flash 또는 브라우저에서 실행할 수 있는 기타 코드가 포함되기도 합니다. XSS를 기반으로 하는 공격의 종류에는 거의 제한이 없지만, 일반적으로 쿠키 또는 기타 세션 정보와 같은 개인 데이터를 공격자에게 보내거나, 공격자가 제어하는 웹 페이지로 피해자를 리다이렉션하거나, 취약한 사이트를 가장하여 사용자의 컴퓨터에서 다른 악의적인 작업을 수행하는 것이 포함됩니다.

XSS 공격은 저장(영구라고도 함), 반사(비영구라고도 함) 또는 DOM 기반의 세 가지 범주로 나눌 수 있습니다.

저장된 XSS 공격

삽입된 스크립트는 대상 서버에 영구적으로 저장됩니다. 그런 다음 피해자는 브라우저가 데이터 요청을 보낼 때 서버에서 이 악성 스크립트를 검색하게 됩니다.

반사된 XSS 공격

사용자가 속아서 악성 링크를 클릭하거나 특수 제작된 양식을 제출하거나 악성 사이트를 탐색하면 삽입된 코드가 취약한 웹 사이트로 이동합니다. 웹 서버는 오류 메시지, 검색 결과 또는 요청의 일부로 서버에 전송된 데이터를 포함하는 기타 응답과 같이 주입된 스크립트를 사용자의 브라우저에 다시 반사합니다. 브라우저는 응답이 사용자가 이미 상호 작용한 "신뢰할 수 있는" 서버에서 온 것으로 생각하기 때문에 이 코드를 실행합니다.

DOM기반 XSS 공격

페이로드는 원본 클라이언트 측 스크립트가 사용하는 DOM 환경(피해자의 브라우저에서)을 수정한 결로 실행됩니다. 즉, 페이지 자체는 변경되지 않지만 DOM 환경에 대한 악의적인 수정으로 인해 페이지에 포함된 클라이언트 측 코드가 예기치 않은 방식으로 실행됩니다.

교차 사이트 요청 위조 (CSRF)
-------------------

CSRF(XSRF라고도 함)는 관련 클래스의 공격입니다. 공격자는 사용자의 동의나 인지 없이 사용자의 브라우저가 웹사이트의 백엔드에 요청을 수행하도록 합니다. 공격자는 XSS 페이로드를 사용하여 CSRF 공격을 할 수 있습니다.

위키백과에 CSRF에 대한 좋은 예제가 있습니다. 이 상황에서는 누군가가 실제 이미지가 아닌 이미지를 삽입합니다(예: 필터링되지 않은 채팅 또는 포럼에). 대신 이 이미지는 은행 서버에 돈을 인출하라는 요청입니다.


```html
<img
 src="https://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory" />
```


이제 은행 계좌에 로그인되어 있고, 쿠키가 여전히 유효한 경우라면(다른 확인이 없는 경우) 이 이미지가 포함된 HTML을 로드하는 즉시 송금이 진행됩니다. POST 요청이 필요한 엔드포인트 경우, 페이지가 로드될 때 프로그래밍 방식으로 <form> 제출(보이지 않는 <iframe>에서)을 트리거할 수 있습니다.


```html
<form action="https://bank.example.com/withdraw" method="POST">
  <input type="hidden" name="account" value="bob" />
  <input type="hidden" name="amount" value="1000000" />
  <input type="hidden" name="for" value="mallory" />
</form>
<script>
 window.addEventListener("DOMContentLoaded", () => {
 document.querySelector("form").submit();
 });
</script>
```


이러한 일이 발생하지 않도록 하기 위해 사용해야 하는 몇 가지 기술이 있습니다.

* GET 엔드포인트는 멱등적이어야 합니다. 변경 사항을 적용하고 데이터를 검색하지 않는 작업은 POST(또는 다른 HTTP 메서드) 요청을 보내야 합니다. POST 엔드포인트는 쿼리 문자열의 매개변수를 사용하여 GET 요청을 상호 교환적으로 수락해서는 안 됩니다.
* 세션 고유 CSRF 토큰이 서버에서 브라우저로 제공되어야 합니다. 이 토큰은 브라우저에서 양식을 게시할 때마다(`<form>` 요소의 숨겨진 입력 필드에) 포함될 수 있습니다. 작업을 수행할 가능성이 있는 GET 이외의 모든 요청에 대해 서버는 전송된 토큰을 세션에 저장된 값과 비교합니다. 일치하지 않는 경우 요청이 중단됩니다.
* 이 보호 방법은 사용자에게 할당된 CSRF 토큰을 예측할 수 없는 공격자에 의존합니다. 로그인 시 토큰을 다시 생성해야 합니다.
* (세션 쿠키와 같은) 민감한 작업에 사용되는 쿠키는 SameSite 속성이 Strict 또는 Lax로 설정된 짧은 수명을 가져야 합니다. (위의 SameSite 쿠키 참조). 이는 지원되는 브라우저에서 세션 쿠키가 사이트 간 요청과 함께 전송되지 않도록 하는 효과가 있으므로 요청이 애플리케이션 서버에 대해 효과적으로 인증되지 않습니다.
* CSRF 토큰과 SameSite 쿠키를 모두 제공해야 합니다. 이렇게 하면 모든 브라우저가 보호되고 SameSite 쿠키가 도움이 되지 않는 곳에서도 보호 기능을 제공할 수 있습니다(예: 별도의 하위 도메인에서 시작된 공격).

더 많은 예방 팁은 OWASP CSRF 예방 치트 시트를 참조하십시오.

중간자 공격 (MitM)
-------------

제3자는 웹 서버와 클라이언트(브라우저) 간의 트래픽을 가로채고 데이터(예: 로그인 자격 증명 또는 신용 카드 정보)를 캡처하기 위해 웹 서버를 가장합니다. 트래픽이 통과될 때 트래픽이 변경될 수 있습니다. 개방형 Wi-Fi 네트워크는 이 공격을 실행하는 일반적인 수단입니다.

세션 하이재킹
-------

세션 하이재킹은 사용자의 인증된 세션에 액세스하고 오용하는 것으로 구성됩니다. 이는 기존 세션의 쿠키를 훔치거나 사용자(또는 브라우저)를 속여 미리 결정된 세션 ID로 쿠키를 설정함으로써 발생할 수 있습니다.

유출 경로는 엄격한 Content-Security-Policy를 배포하여 제한할 수 있습니다.

### 세션 고정

제3자는 사용자의 세션 식별자를 결정할 수 있으므로(즉, 이를 읽거나 설정하여) 해당 사용자로서 서버와 상호 작용할 수 있습니다. 쿠키를 훔치는 것도 이를 위한 방법 중 하나입니다.

application.example.com과 같은 하위 도메인은 `Domain` 속성을 다음과 같이 설정하여 example.com 또는 다른 하위 도메인에 대한 요청과 함께 쿠키가 전송되도록 설정할 수 있습니다.


```http
Set-Cookie: CSRF=e8b667; Secure; Domain=example.com
```


 취약한 응용 프로그램을 하위 도메인에서 사용할 수 있는 경우, 세션 고정 공격에서 이 메커니즘을 남용할 수 있습니다. 사용자가 부모 도메인(또는 다른 하위 도메인)의 페이지를 방문하면, 애플리케이션은 사용자 쿠키에 전송된 기존 값을 신뢰할 수 있습니다. 이로 인해 공격자는 사용자가 로그인한 후 CSRF 보호를 우회하거나 세션을 하이재킹할 수 있습니다.
 또는 상위 도메인이 `includeSubdomains`가 설정된 HTTP Strict-Transport-Security를 사용하지 않는 경우, 활성 MitM(아마도 개방형 Wi-Fi 네트워크에 연결됨)의 대상이 되는 사용자는 존재하지 않는 하위 도메인의 Set-Cookie 헤더로 응답을 받을 수 있습니다. 최종 결과는 브라우저가 불법 쿠키를 저장하고 이를 example.com 아래의 다른 모든 페이지로 보내는 것과 거의 동일합니다.

세션 고정은 주로 사용자가 인증할 때 세션 쿠키 값을 다시 생성하고(쿠키가 이미 존재하는 경우에도) CSRF 토큰을 사용자에게 연결하는 것으로 완화해야 합니다.

### 세션 사이드재킹

### 브라우저 하이재킹 멀웨어