Skip to main content

2 XSS


개요

XSS는 공격자가 악성 스크립트를 웹페이지에 주입하여 다른 사용자의 브라우저에서 실행되게 함으로써 세션 탈취, 정보 유출, CSRF 연쇄 공격 등의 피해를 유발할 수 있는 취약점


Context

  • HTTP: 웹상의 요청/응답 프로토콜로, 상태가 없는(stateless) 특성이 있습니다.
  • Cookie: 서버가 클라이언트에 저장하는 작은 데이터로 세션 유지 등에 사용됩니다. XSS 공격 시 쿠키가 탈취되면 세션 도용이 가능합니다.

XSS(크로스 사이트 스크립팅) 공격은 크게 저장형(Stored) XSS, 반사형(Reflected) XSS, DOM 기반(DOM-based) XSS 세 가지 유형으로 나뉩니다.

  1. 저장형 XSS 는 악성 스크립트를 웹사이트 데이터베이스에 저장시킨 후, 해당 페이지를 방문하는 사용자의 브라우저에서 스크립트가 실행되도록 하는 공격입니다.
  2. 반사형 XSS 는 공격자가 악성 스크립트가 포함된 URL을 사용자에게 보내고, 사용자가 해당 URL을 클릭하여 웹 서버에 요청하면 즉석에서 스크립트가 실행되어 공격이 이루어집니다.
  3. DOM 기반 XSS 는 서버와 통신 없이, 클라이언트 측 브라우저의 DOM(Document Object Model) 조작을 통해 스크립트가 실행되는 방식입니다.

Set-Cookie : Name = Vaule;  // 이름 = 값
Expires = Date; // 만기날짜
Path = PATH; // 경로
Domain = DOMAIN_NAME; // 도메인이름

ex) www.naver.com
Secure
  • 4kb의 텍스트 파일.
  • Fields: HttpOnly, Secure, SameSite, Cross Site, Name, Value, Domain, Priority, Path, Expires, Size, Partition Key

XSS 공격 예시 (요약)

  • 동작 환경: PHP 등 서버 사이드 언어 기반 웹 애플리케이션
  • 공격 흐름 (단순화): 공격자 → 악성 스크립트 포함 URL/게시글 업로드 → 피해자 클릭 → 스크립트 실행 → 쿠키/세션 탈취 또는 페이지 변조
  • 도구 예시: Paros, Cooxie 등 프록시/테스팅 툴

공격 분석 (시나리오 요약)

  • 공격자는 피해자를 속여 링크나 게시글을 클릭하게 하고, 브라우저에서 실행된 스크립트피해자의 쿠키를 탈취합니다.
  • 탈취한 쿠키로 피해자 계정에 로그인하여 데이터 유출, 변조, 삭제 등 다양한 악성 행위를 수행할 수 있습니다.
  • 실습(시연) 장면에서는 Paros 같은 프록시를 통해 cookie sniffing 과정이 관찰됩니다.

XSS 태그/기법 예시

  • script 태그 삽입
  • iframe을 통한 외부 스크립트 로드
  • 인코딩/디코딩 기법(문자열을 인코딩해 필터를 우회)
    • 인터넷 도구 (개발자 도구) > console에서 encodeURIComponent() / decodeURIComponent() 를 사용할 수 있습니다. (WEB API)

시연 대상 예시

  • 대학교 컴퓨터공학과 웹 게시판
  • 대학교 메인 페이지의 입력폼 등

방어(관리자 권고)

  1. HttpOnly 속성 사용: 클라이언트 자바스크립트에서 쿠키 접근을 차단합니다.
  2. 게시판/입력폼에서 .html 사용 금지 또는 HTML 입력을 허용하지 않음.
  3. 특수문자에 대한 정확한 필터링/이스케이프 적용.
  4. 중요한 정보(비밀번호 등)는 쿠키에 저장하지 않음.
  5. 입력으로 들어오는 javascript 문자열은 예: x-javascript 등으로 변환해 실행을 무효화.
  6. 브라우저의 개인정보 등급(보안 설정)을 상향 조절해 쿠키 일부 제한을 권고.

특수문자 필터링 예시 (원문 함수 보존)

Function RemoveBad(InStr){
InStr = Instr.replace(/\</g,””);
InStr = Instr.replace(/\>/g,””);
InStr = Instr.replace(/\”/g,””);
InStr = Instr.replace(/\’/g,””);
InStr = Instr.replace(/\%/g,””);
InStr = Instr.replace(/\;/g,””);
return InStr;
}

위 함수는 원문에서 제공된 예시를 그대로 보존했습니다. 실제 적용 시에는 각 언어별 표준 이스케이프/라이브러리를 사용하는 것이 안전합니다.


개인정보 등급 및 브라우저 설정

  • Internet Explorer 9 예시, Google Chrome 등 브라우저별로 개인정보/보안 설정을 통해 쿠키 접근을 제한할 수 있습니다.
  • 운영체제/브라우저 버전별 차이를 고려해 방어 정책을 수립하세요.

See also