XSS (Cross-Site Scripting)

Kkd·2025년 1월 7일
0

매일메일 개념정리

목록 보기
60/93

XSS (Cross-Site Scripting)

XSS는 웹 애플리케이션에서 사용자 입력값을 제대로 검증하지 않아 악성 스크립트가 삽입되고 실행되는 취약점을 말합니다. 공격자가 이를 악용해 사용자 브라우저에서 악성 코드가 실행되도록 하여 개인 정보 탈취, 세션 하이재킹, 악성 사이트로 리다이렉트 등을 수행할 수 있습니다.


XSS 공격 유형

  1. Stored XSS (저장형 XSS)

    • 공격자가 악성 스크립트를 서버에 저장하고, 다른 사용자가 해당 데이터를 조회할 때 스크립트가 실행됩니다.
    • 예: 게시판에 악성 스크립트를 포함한 댓글 작성.
  2. Reflected XSS (반사형 XSS)

    • 악성 스크립트가 URL이나 입력값에 포함되어 서버를 통해 응답으로 반사됩니다.
    • 예: 검색 입력값을 화면에 그대로 표시하는 경우.
  3. DOM-based XSS

    • 서버와 상관없이 클라이언트의 DOM 조작 과정에서 발생하는 XSS.
    • 예: JavaScript 코드에서 사용자 입력값을 DOM에 직접 삽입.

XSS 공격 예시

  1. Stored XSS

    • 공격자가 게시판 댓글로 악성 스크립트를 삽입:

      <script>alert('XSS 공격!');</script>
    • 다른 사용자가 댓글 페이지를 조회할 때 브라우저가 스크립트를 실행.

  2. Reflected XSS

    • URL에 악성 스크립트를 포함:

      http://example.com/search?q=<script>alert('XSS!');</script>
    • 서버가 q 파라미터 값을 그대로 응답에 포함하면 스크립트가 실행.

  3. DOM-based XSS

    • JavaScript에서 사용자 입력값을 DOM에 삽입:
      var userInput = location.search.split('=')[1];
      document.body.innerHTML = `<p>${userInput}</p>`;
    • URL: http://example.com/?name=<script>alert('XSS');</script>

XSS 방어 방법

  1. 입력값 검증

    • 모든 사용자 입력값을 신뢰하지 말고 검증합니다.
    • 허용된 값만 허용하는 화이트리스트(allowlist) 기반의 검증을 사용.
  2. 출력값 인코딩

    • 사용자 입력값을 HTML, JavaScript, CSS 등 출력 위치에 맞게 적절히 인코딩합니다.
    • 예: HTML 엔티티 인코딩 (<&lt;, >&gt;).
    // Java 예제: Apache Commons Text 사용
    String safeOutput = StringEscapeUtils.escapeHtml4(userInput);
  3. HTTP 응답 헤더 설정

    • Content Security Policy (CSP): 허용된 스크립트 소스만 실행되도록 설정.
    • X-Content-Type-Options: MIME 타입 스니핑 방지.
    • X-XSS-Protection: 브라우저의 XSS 필터 활성화.
  4. 라이브러리 사용

    • 검증과 인코딩을 위해 검증된 라이브러리를 사용합니다.
  5. DOM 조작 시 조심

    • JavaScript에서 사용자 입력값을 DOM에 직접 삽입하지 않도록 주의.
    • 대신 안전한 API를 사용:
      var safeElement = document.createElement('div');
      safeElement.textContent = userInput; // 안전하게 텍스트로 처리
      document.body.appendChild(safeElement);
  6. 라이브러리와 프레임워크의 보안 기능 활용

    • Spring Security: CSRF 보호 및 XSS 방지 필터 제공.
    • Angular/React/Vue: 기본적으로 XSS 방지 기능 내장.

예제: Spring Boot에서 XSS 방어

@Controller
public class ExampleController {

    @PostMapping("/submit")
    public String submit(@RequestParam("userInput") String userInput, Model model) {
        // XSS 방지를 위해 HTML 엔티티 인코딩
        String safeInput = StringEscapeUtils.escapeHtml4(userInput);
        model.addAttribute("userInput", safeInput);
        return "result";
    }
}

result.html (Thymeleaf 템플릿):

<p>사용자 입력: [[${userInput}]]</p>

결론

XSS는 사용자 입력값을 제대로 검증하지 않거나 적절히 처리하지 않을 때 발생하는 주요 취약점입니다. 올바른 검증, 출력값 인코딩, CSP 적용 등 방어 전략을 통해 XSS 공격을 방지할 수 있습니다.

추가 학습 자료

profile
🌱

0개의 댓글