JJANG-JOON
article thumbnail
반응형

 

 

 

 

XSS(크로스사이트스크립팅) 기본 우회 방법 및 스킬업

 

 

 

 

 

XSS(크로스 사이트 스크립팅, Cross-Site Scripting)은 웹 어플리케이션의 보안 취약점 중 하나로, 공격자가 웹 사이트에 악성 스크립트를 주입하여 사용자의 브라우저에서 실행되게 만드는 공격 기법이다.

 

이를 통해 공격자는 사용자의 세션 쿠키, 토큰 등을 탈취하거나, 사용자를 대신하여 의도하지 않은 행동을 실행시킬 수 있다.

 

 

 

XSS 공격의 원리

XSS 공격의 기본 원리는 사용자로부터 입력 받은 데이터를 적절히 검증하거나 이스케이프 처리하지 않고 웹 페이지에 그대로 반영할 때 발생한다. 공격자는 이러한 취약점을 이용해 스크립트 코드를 웹 어플리케이션에 주입하고, 이 코드가 다른 사용자의 브라우저에서 실행되도록 한다. 실행된 스크립트는 공격자에게 사용자의 데이터를 전송하거나, 사용자를 속여 피싱 사이트로 유도하는 등 다양한 악의적 행위를 할 수 있다.

 

 

 

XSS 공격의 유형

  1. 저장된 XSS (Stored XSS): 악성 스크립트가 웹 어플리케이션 서버에 저장되어, 해당 페이지를 방문하는 모든 사용자에게 영향을 미치는 형태이다. 포럼 게시물, 댓글, 사용자 프로필 정보 등에 악성 스크립트를 삽입할 수 있다.
  2. 반사된 XSS (Reflected XSS): 사용자가 공격자가 조작한 링크를 클릭할 때, 서버로부터 악성 스크립트가 포함된 응답이 바로 반환되어 실행되는 형태이다. 검색 엔진, 메일, 메시지 등을 통해 공격 링크를 유포할 수 있다.
  3. DOM 기반 XSS (DOM-based XSS): 원래의 서버 응답은 변경하지 않고, 클라이언트 측에서 DOM(Document Object Model)을 조작하여 악성 스크립트를 실행시키는 형태이다. URL의 해시(#) 뒤에 있는 데이터를 이용하는 경우가 대표적이다.

 

 

XSS 공격 대응 방법

  • 입력 검증: 사용자 입력 데이터에 대한 검증을 철저히 수행하여, 스크립트 등의 실행 가능한 코드가 포함되어 있지 않도록 한다.
  • 출력 이스케이프 처리: 사용자 입력을 웹 페이지에 출력할 때, 스크립트와 같은 실행 가능한 코드가 브라우저에 의해 실행되지 않도록 HTML 엔티티 등으로 이스케이프 처리한다.
  • 콘텐츠 보안 정책 (CSP): CSP를 사용하여, 특정 도메인이나 방식으로만 스크립트를 실행할 수 있도록 제한함으로써, XSS 공격의 위험을 줄일 수 있다.
  • 쿠키에 HttpOnly와 Secure 플래그 설정: 이 플래그들을 설정함으로써, 스크립트를 통한 쿠키의 접근을 차단하고, HTTPS를 통해서만 쿠키를 전송하도록 한다.

 

 

반사된 XSS 공격 예시

사용자 입력 검증이 없는 검색 기능:

  1. 피해자 유인: 공격자는 악성 스크립트를 포함하는 URL을 생성하여 피해자에게 전송한다.
  2. URL 예시: https://example.com/search?query=<script>alert('XSS');</script>
  3. 피해자 피해: 피해자가 링크를 클릭하면, 브라우저에서 alert 창이 표시되고, 악성 스크립트가 실행될 수 있다.

XSS 취약점 실습

필요 준비물:

  • HTML 및 서버 사이드 언어 지식 (PHP, Node.js 등)
  • 웹 서버 환경

실습 단계:

 

 

1. 취약점 코드 작성:

  • HTML 폼과 서버 사이드 언어를 이용하여 간단한 검색 기능 구축
  • 취약점 존재: 사용자 입력을 검증하지 않고 출력
  • 예시 코드:
<form action="search.php" method="GET">
  <input type="text" name="query">
  <input type="submit" value="Search">
</form>

 

 

 

2. XSS 공격 시도:

  • 악성 스크립트를 포함하는 URL 생성
  • 예시: https://example.com/search?query=<script>alert('XSS');</script>
  • URL 실행 후 브라우저에서 alert 창 확인

 

 

3. XSS 대응 방법 실습:

사용자 입력 이스케이프 처리:

  • 특수 문자를 HTML 엔티티로 변환하여 스크립트 실행 방지
  • PHP 예시:
<?php
// search.php 수정
$query = htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8');
echo "검색 결과: " . $query;
?>

 

 

 

4. 이스케이프 처리 확인:

  • 이스케이프 처리 후 공격 시도, alert 창 표시되지 않음

주의 사항:

  • 다양한 이스케이프 처리 함수 존재 (각 언어마다 다름)
  • 사용되는 함수 및 옵션에 따라 처리 결과 차이 발생

 

XSS 우회 방법

 

 

HTML 엔티티 사용

웹 어플리케이션이 특정 태그를 필터링하는 경우, HTML 엔티티를 사용하여 필터를 우회할 수 있다.

  • 예시: < 대신 &lt; 또는 > 대신 &gt;를 사용할 수 있다.

이벤트 핸들러

일부 웹 어플리케이션은 <script> 태그를 필터링하지만, 다른 HTML 요소의 이벤트 핸들러 내에서 JavaScript 코드를 실행할 수 있는 것을 허용할 수 있다.

  • 예시: <img src=x onerror=alert(1)> - 이 코드는 이미지 로드에 실패했을 때 alert를 실행한다.

JavaScript URL 사용

<a> 태그의 href 속성이나 다른 네비게이션 목적의 속성에 JavaScript 코드를 삽입하여 필터를 우회할 수 있다.

  • 예시: <a href="javascript:alert(1)">클릭</a> - 이 링크를 클릭하면 JavaScript 코드가 실행된다.

문자열 분할

공격자는 필터링 시스템이 특정 문자열을 검출하는 것을 회피하기 위해 문자열을 분할할 수 있다.

  • 예시: JavaScript에서 eval 함수를 사용하여 분할된 문자열을 실행할 수 있다.
var payload = "al" + "ert(1)";
eval(payload);

 

CSS를 이용한 공격

일부 케이스에서는 CSS를 이용하여 XSS 공격을 시도할 수 있다. 예를 들어, CSS 내에서 expression 속성(현재는 대부분의 브라우저에서 사용 중지)을 사용하여 JavaScript 코드를 실행할 수 있었다.

  • 예시: <div style="width: expression(alert(1));"></div>

고급 인코딩 기법

공격자는 URL 인코딩, UTF-8 인코딩 또는 다른 인코딩 방식을 사용하여 필터링 메커니즘을 우회할 수 있다.

  • 예시: URL 인코딩을 사용하여 스크립트 태그를 인코딩할 수 있다.
%3Cscript%3Ealert(1)%3C/script%3E

 

데이터 URI 사용

데이터 URI 스킴을 사용하면, 외부 리소스를 로드하는 대신 URI 내에 직접 데이터를 포함시킬 수 있다. 이를 이용해 XSS 공격 코드를 포함시킬 수 있다.

(데이터 URI 스킴(data:)을 사용하는 XSS 공격은 웹 페이지가 외부 리소스를 로드할 때 발생할 수 있는 취약점을 이용)

( Data URI는 HTML 및 CSS에 이미지를 포함하거나 외부 파일을 인라인으로 넣기 위해 사용)

  • 예시: <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=">클릭</a> - Base64로 인코딩된 스크립트가 있는 데이터 URI이다. 
  • ( data:text/html,<script>alert('XSS');</script>)

https://www.hahwul.com/2022/03/05/data-uri-xss-v2/

 

Data URI(data:) XSS v2

제가 오래전에 Data URI XSS를 다루는 “Form action + data:를 이용한 XSS Filtering 우회 기법“란 글을 쓴 적이 있었는데요, 오늘은 조금 더 개선된 버전으로 글을 작성해볼까 합니다.

www.hahwul.com

SVG 이미지 이용

SVG(Scalable Vector Graphics) 파일 내에 JavaScript를 포함시킬 수 있으므로, SVG 이미지를 이용한 XSS 공격이 가능하다.

  • 예시: <svg/onload=alert('XSS')> - SVG 태그 내에 onload 이벤트를 사용하여 XSS 공격을 수행한다.

Polyglot XSS

Polyglot XSS 공격은 하나의 문자열이 여러 컨텍스트(HTML, JavaScript, URL 등)에서 유효한 코드로 해석될 수 있도록 작성되는 기법이다. 이는 다양한 파싱 방식을 가진 환경에서 유용하게 사용될 수 있다.

고급 JavaScript 우회 기법

JavaScript의 유연성을 이용하여, 문자열을 다양한 방식으로 조합하거나, 이스케이프 시퀀스를 사용하여 필터를 우회한다.

  • 예시: String.fromCharCode() 함수를 사용하여 각 문자의 아스키 코드를 이용해 스크립트를 조합할 수 있다.

타입 조작을 통한 우회

일부 애플리케이션은 특정 타입의 입력만을 허용할 수 있다. 이를 우회하기 위해 입력 타입을 조작할 수 있다.

  • 타입 변환을 이용한 우회: 문자열이 필터링되는 경우, 문자열을 다른 타입으로 변환하여 실행할 수 있다. 예를 들어, 문자열 대신 정수형이나 배열을 사용할 수 있다.

DOM 조작을 통한 공격 실습

 

웹 페이지가 사용자 입력을 URL의 일부로 사용하는 경우, URL을 조작하여 XSS 공격을 시도할 수 있다.

 

<script>
function displayInput() {
  var userInput = document.getElementById('userInput').value;
  document.getElementById('display').innerHTML = userInput;
}
</script>
<input type="text" id="userInput">
<button onclick="displayInput()">Display</button>
<div id="display"></div>

전체 코드 document.getElementById('display').innerHTML는 페이지에서 ID가 'display'인 요소를 찾고, 그 요소의 내부 HTML 콘텐츠를 가져오거나 변경하는 데 사용된다. 예를 들어, 이 코드 뒤에 = '<p>Hello, World!</p>'를 추가하면, ID가 'display'인 요소 내부에 <p>Hello, World!</p>라는 HTML 마크업을 삽입할 수 있다. 이를 통해 웹 페이지의 특정 부분을 동적으로 업데이트하는 데 자주 사용된다.

 

 

 

 


 

 

 

 

 

 

 

반응형
profile

JJANG-JOON

@JJANG-JOON

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...