콘텐츠로 이동

XS: 6. 크로스사이트 스크립트

분류: Web Application(웹)

중요도: 상


점검 및 조치 사례

점검 방법

Step 1) 사용자 입력값을 전달받아 HTML 상에 렌더링되는 애플리케이션(게시판, 검색 등)에 스크립트 구문 삽입 후 실행되는지 확인

  • 게시글 작성 시 스크립트 구문을 삽입하여 글 열람 시 스크립트가 동작하는 경우(Stored XSS) Stored(저장형) XSS 취약점 점검

  • 입력값이 HTML 상에 렌더링되어 스크립트가 삽입된 URL 접근 시 스크립트가 동작하는 경우(Reflected XSS) Reflected(반사형) XSS 취약점 점검

조치 방법

  1. 크로스사이트 스크립팅 공격에 사용되는 특수문자에 대하여 입력값 검증 및 필터링(HTML 엔티티, 이스케이프 등)처리 로직을 서버 사이드에서 구현
  2. 부득이하게 HTML 코드를 사용해야 하는 경우 화이트리스트 방식을 적용하여 허용된 HTML 코드만 처리
  3. 웹 방화벽에서 웹 태그 및 스크립트 관련 특수문자 필터링 룰셋을 적용하여 추가적인 방어 확보
  4. 세션 탈취 방지를 위해 쿠키에 HttpOnly, Secure, SameSite 옵션을 설정하여 노출되지 않도록 보호

특수문자 필터링 예시

구분 필터링 예시
변경 전 < > " ( ) # &
변경 후 &lt; &gt; &quot; &#40; &#41; &#35; &amp;

Java

입력 문자열 내 특수 문자를 HTML Entity로 변환하는 예시 사용자 입력값 HTML Entity 처리 로직 예시

public static String sanitizeInput(String input) {
    if (input == null) return null;
    return input.replaceAll("&", "&amp;")
                .replaceAll("<", "&lt;")
                .replaceAll(">", "&gt;")
                .replaceAll("\"", "&quot;")
                .replaceAll("'", "&#39;");
    /* 필터링 문자 추가*/
}

ASP.NET

입력 문자열 내 특수 문자를 HTML Entity로 변환하는 예시 사용자 입력값 HTML Entity 처리 로직 예시

StringBuilder sb = new StringBuilder();
foreach (char c in input) {
    switch (c) {
        case '<': sb.Append("&lt;"); break;
        /* 필터링 문자 추가*/
        default: sb.Append(c); break;
    }
}
return sb.ToString();

PHP

입력 문자열 내 특수 문자를 HTML Entity로 변환하는 예시 사용자 입력값 HTML Entity 처리 로직 예시

function escapeHtml($input) {
    return htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
// 추가적인 문자열 필터링이 필요한 경우
function escapeHtmlExtended($input) {
    $escaped = htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
    $additionalEscapes = [
        '\\' => '&#92;',
        '(' => '&#40;',
        ')' => '&#41;',
        '#' => '&#35;'
    ];
    return strtr($escaped, $additionalEscapes);
}
  1. 크로스사이트 요청 위조(CSRF)

개요

점검 내용

웹 애플리케이션 내 사용자의 인증 세션을 악용하여 의도하지 않은 위조 요청 가능 여부 점검

점검 목적

사용자가 인증된 세션을 가진 상태에서 공격자가 의도한 위조 요청이 전송‧처리되지 않도록 하여 비정상적인 상태 변경을 방지하기 위함

보안 위협

CSRF 취약점이 존재할 경우, 공격자는 사용자가 로그인된 세션을 악용하여 인증정보 없이도 위조된 요청을 전송할 수 있음. 이로 인해 사용자의 의도와 무관하게 비밀번호 변경, 계좌 이체, 게시글 삭제, 개인정보 수정 등 권한 있는 사용자가 수행할 수 있는 행위가 공격자에 의해 실행될 수 있음

참고

CSRF(Cross Site Request Forgery)

사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격 유형으로, 사용자의 인증된 세션을 악용하여 비인가된 행위 수행 가능

소스코드 및 취약점 점검 필요

점검 대상 및 판단 기준

대상

웹 애플리케이션 소스코드, 웹 방화벽

판단 기준

✅ 양호: 중요한 요청(비밀번호 변경, 송금 등)에 대해 CSRF 방어 토큰이 적용되어 있으며, 토큰 검증이 정상적으로 수행되는 경우

❌ 취약: 중요한 요청에 대해 CSRF 토큰이 없거나, 토큰 검증을 수행하지 않아 인증된 사용자의 요청 위조가 가능한 경우

조치 방법

중요한 요청에는 CSRF 방어 토큰을 포함하고, 서버 측에서 해당 토큰의 유효성을 검증하도록 설정하며, Referer/Origin 헤더 검증 및 SameSite 쿠키 옵션을 활용하여 불필요한 외부 도메인 요청이 차단되도록 구성

조치 시 영향

일반적인 경우 영향 없음

점검 및 조치 사례

Step 1) 크로스사이트 스크립팅(XSS) 취약점 존재 여부 확인 후 데이터 수정 기능(게시글 등록, 비밀번호 변경 등)이 존재하는 요청(Request) 정보를 분석하여 임의의 명령을 수행하는 스크립트 삽입 후 해당 게시글을 타 사용자가 열람하였을 경우 타 사용자의 권한으로 해당 스크립트의 실행 유무 확인