2 XSS
개요
XSS는 공격자가 악성 스크립트를 웹페이지에 주입하여 다른 사용자의 브라우저에서 실행되게 함으로써 세션 탈취, 정보 유출, CSRF 연쇄 공격 등의 피해를 유발할 수 있는 취약점
Context
- HTTP: 웹상의 요청/응답 프로토콜로, 상태가 없는(stateless) 특성이 있습니다.
- Cookie: 서버가 클라이언트에 저장하는 작은 데이터로 세션 유지 등에 사용됩니다. XSS 공격 시 쿠키가 탈취되면 세션 도용이 가능합니다.
XSS(크로스 사이트 스크립팅) 공격은 크게 저장형(Stored) XSS, 반사형(Reflected) XSS, DOM 기반(DOM-based) XSS 세 가지 유형으로 나뉩니다.
- 저장형 XSS 는 악성 스크립트를 웹사이트 데이터베이스에 저장시킨 후, 해당 페이지를 방문하는 사용자의 브라우저에서 스크립트가 실행되도록 하는 공격입니다.
- 반사형 XSS 는 공격자가 악성 스크립트가 포함된 URL을 사용자에게 보내고, 사용자가 해당 URL을 클릭하여 웹 서버에 요청하면 즉석에서 스크립트가 실행되어 공격이 이루어집니다.
- DOM 기반 XSS 는 서버와 통신 없이, 클라이언트 측 브라우저의 DOM(Document Object Model) 조작을 통해 스크립트가 실행되는 방식입니다.
Cookie (구성 예시)
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)
- 인터넷 도구 (개발자 도구) > console에서
시연 대상 예시
- 대학교 컴퓨터공학과 웹 게시판
- 대학교 메인 페이지의 입력폼 등
방어(관리자 권고)
- HttpOnly 속성 사용: 클라이언트 자바스크립트에서 쿠키 접근을 차단합니다.
HTTP Header에서 설정할 수 있습니다.HttpOnly속성은 보통 서버에서 설정합니다.- 관련글: https://blog.naver.com/pjt3591oo/223183982479
- 게시판/입력폼에서
.html사용 금지 또는 HTML 입력을 허용하지 않음. - 특수문자에 대한 정확한 필터링/이스케이프 적용.
- 중요한 정보(비밀번호 등)는 쿠키에 저장하지 않음.
- 입력으로 들어오는
javascript문자열은 예:x-javascript등으로 변환해 실행을 무효화. - 브라우저의 개인정보 등급(보안 설정)을 상향 조절해 쿠키 일부 제한을 권고.
특수문자 필터링 예시 (원문 함수 보존)
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
- http://tiger5net.egloos.com/5055050 (XSS 기법 및 예시)
- http://www.slideshare.net/crakrozy/xsssql-injection1
- http://blog.naver.com/max32767?Redirect=Log&logNo=110150552957