Held-Hintergrund ohne Trennlinie
Richtlinie

인젝션 - XSS

XSS라고도 하는 크로스 사이트 스크립팅은 다른 사용자의 브라우저에서 공격자가 제어하는 스크립트를 평가하게 하는 또 다른 유형의 인젝션 취약점입니다.XSS는 HTML/자바스크립트 삽입 취약점으로 간주될 수도 있습니다.

XSS 취약점의 영향은 취약점이 존재하는 상황에 따라 크게 달라집니다.여기에는 스크립트가 실행되는 페이지에서 정보를 추출할 수 있는 기능, 페이지에서 피해자로서 작업을 수행하도록 페이지 상태를 편집할 수 있는 기능 등이 포함됩니다.

만날 수 있는 XSS 유형을 살펴보겠습니다.

XSS 유형

XSS를 몇 개의 버킷으로 나누어 구분할 수 있습니다.페이로드가 전달되는 방식과 진입점이 어디인지에 따라 분류됩니다.

페이로드 전달 벡터 (저장 vs. 반사)

공격자가 XSS 페이로드를 전달할 수 있는 두 가지 방법이 있습니다.

  • 저장된 XSS: 예를 들어 데이터가 다른 사용자에게 렌더링되는 데이터베이스에 저장된 사용자 제어 데이터를 통해
  • 반사형 XSS: 사용자가 탐색한 URL/쿼리 문자열을 통해 전달된 사용자 제공 페이로드를 통해

중요한 차이점은 Replyted XSS는 일반적으로 사용자 상호 작용에 의존하며 악성 페이로드로 링크를 여는 사용자에게만 영향을 미친다는 것입니다.하지만 페이로드를 렌더링하는 일부 페이지를 열기만 하면 한 명 이상의 사용자에 대해 Storred XSS를 실행할 수 있습니다.

페이로드 위치 (DOM과 DOM이 아닌 위치)

페이로드가 주입되는 위치에 따라 취약점을 “DOM” 취약점으로 분류할지 여부가 결정됩니다.이는 페이로드가 렌더링되는 위치를 구분하는 것을 나타냅니다.

  • DOM이 아닌 XSS: 페이로드는 태그 내부이든 속성 내부이든 관계없이 HTML 내에서 렌더링됩니다.
  • 돔 XSS: 페이로드는 <script>``태그나 `onclick=""`과 같은 이벤트 핸들러와 같이 자바스크립트 내에서 렌더링됩니다.

XSS - 디펜스 프리미티브

이 섹션에서는 XSS 방어의 기초가 되는 프리미티브의 원칙을 살펴보겠습니다.이에 대한 기본 사항을 이해하는 것도 중요하지만 실제로는 XSS에 대한 99% 의 보호를 위해 템플릿 라이브러리에 의존해야 합니다.

브라우저에서 실행되는 마크업이나 코드에 렌더링되는 템플릿을 작성할 때 XSS로부터 보호하는 핵심은 *인코딩*입니다.이 컨텍스트에서 인코딩이란 일련의 문자를 가져와 인터프리터가 특정 방식으로 처리하는 형식으로 변경하는 것을 의미합니다.

그러나 사용할 인코딩 유형은 데이터가 사용될 위치나 컨텍스트에 따라 달라집니다.

  • 태그 내부 (예: '<div>여기에 사용자 입력</div>'): **HTML 인코딩**
  • <input placeholder="User input here"></input>``와 같은 속성 내부: **속성 인코딩**
  • 자바스크립트 내부 (예: `<script>x = “여기에 사용자 입력”;</script>`: **자바스크립트 인코딩**

일부 프레임워크는 인코딩을 기본 방어 수단으로 사용하지 않고 대신 위생 처리를 활용하여 위험할 수 있는 콘텐츠에서 값을 제거합니다.이 프로세스는 훨씬 더 복잡하며, 여러 가지 예외 사례를 고려해야 합니다.자체 위생 관리 루틴을 시행하는 것은 권장되지 않습니다.

예시

다양한 언어로 작성된 몇 가지 예를 살펴보고 실제로 어떻게 보이는지 살펴보겠습니다.

C# - 인시큐어: 레이저

`IHTMLContent` 객체 앞에 `@`가 붙으면 인코딩 없이 값이 템플릿에 직접 배치됩니다.

<!--- UNSAFE: The htmlSnippet will get interpreted without any escaping --->
@Html .Raw (HTML 스니펫)

C# - 시큐어: 레이저

기본적으로 '@' 접두사가 붙은 모든 '문자열'은 Razor 템플릿에서 HTML로 이스케이프됩니다.

<!--- SAFE: The htmlSnippet will get HTML escaped --->
@htmlSnippet

자바 - 시큐어: JSP

`c:out'을 사용하면 기본적으로 XML 이스케이프가 실행되며 (`EscapeXML` 프로퍼티로 변경 가능), HTML 컨텍스트에서는 XSS로부터 보호하지만 다른 컨텍스트에서는 그렇지 않습니다.

<div><c:out value="<%= author %>" /></div>

자바 - 보안: (fnxml)

위와 마찬가지로 'Fn:EscapeXML'을 직접 호출할 수도 있습니다. 그러면 주어진 입력을 XML 이스케이프할 수 있습니다.또한 이는 HTML 컨텍스트에서만 보호 기능을 제공합니다.

<div>$ {fn:이스케이프 XML (작성자)}</div>

자바스크립트 - 안전하지 않음: 앵귤러 이너 HTML

이름에서 알 수 있듯이 `InnerHTML` 속성을 지정하면 출력 인코딩 비활성화로 인한 XSS의 위험에 노출됩니다.

<!--- UNSAFE: The htmlSnippet will get interpreted without any encoding --->
<p [innerHTML] ="htmlSnippet"></p>

자바스크립트 - 시큐어: 앵귤러 보간

Angular가 이중 중괄호 (`{{` 및 `}}`) 를 사용하여 텍스트를 보간하면 HTML이 출력을 이스케이프하여 XSS로부터 보호합니다.

<!--- SAFE: The htmlSnippet will get encoded and then interpreted --->
<p>{{HTMLSnippet}}</p>

자바스크립트 - 안전하지 않음: 위험한 내부 HTML에 반응하세요

이름에서 알 수 있듯이 `DangerouslySetInnerHTML` 속성을 지정하면 출력 인코딩 비활성화로 인한 XSS의 위험에 노출됩니다.

<!--- UNSAFE: As the name suggests, the dangerouslySetInnerHTML attribute is dangerous as it does not escape the output --->
<div dangerouslySetInnerHTML= {{__html: htmlSnippet}} />;

자바스크립트 - 시큐어: 리액트 인터폴레이티드

React에서 중괄호 (`{` 및 `}`) 를 사용하여 텍스트를 보간하면 HTML이 출력을 피하여 XSS로부터 보호합니다.

<!--- SAFE: The htmlSnippet will get encoded and then interpreted --->
<div>{HTML 스니펫}</div>

파이썬 - 인시큐어: 장고

Django 템플릿에서 `safe` 필터를 사용하면 출력의 자동 이스케이프가 비활성화되므로 XSS로부터 보호되지 않습니다.

<!--- UNSAFE: The htmlSnippet will not get HTML encoded --->
<div>{{HTMLSnippet | 안전}}</div>

파이썬 - 시큐어: 장고

Django에서 이중 중괄호 (`{{` 및 `}}`) 를 사용하여 텍스트를 보간하면 HTML이 출력을 이스케이프하여 XSS로부터 보호합니다.

<!--- SAFE: The htmlSnippet will HTML encoded --->
<div>{{이름}}</div>