Cross-site scripting이란?
Cross-site scripting(XSS) : 웹 페이지에 악성 스크립트를 삽입하여 해당 스크립트가 다른 사용자들에게 실행되도록 하는 공격, 주로 사용자의 입력값을 웹 페이지에 동적으로 표시할 때 발생한다.
공격 방식은 크게 stored 공격 방식과 reflected 공격 방식으로 나누어진다.
악의적인 사용자는 입력 필드나 URL 매개변수 등을 통해 스크립트를 삽입하고, 이 스크립트는 다른 사용자들의 브라우저에서 실행된다. 이러한 스크립트는 사용자의 쿠키 정보, 세션 데이터, 민감한 개인 정보 등을 탈취하거나 수정할 수 있다.
Stored 공격 방식
Stored XSS : 악의적인 스크립트가 서버에 저장되어 다른 사용자에게 계속해서 전달되는 방식의 XSS 공격
주로 사용자가 게시글, 댓글, 메시지 등을 입력하고 서버에 저장할 때 발생한다.
이 입력 데이터는 서버에 저장되고, 다른 사용자가 해당 페이지를 방문할 때마다 악의적인 스크립트가 실행된다.
Stored 공격 방식 예시
https://ctrl-shit-esc.tistory.com/109
[BWAPP] Cross-site scripting – Stored(Blog)
난이도 : low Quest. 다음 화면과 같이 경고창을 띄워봅시다. 텍스트란에 글을 적고 submit 버튼을 누르면 글이 작성되는 구조이다. 여기에 를 작성해 보았다. 그랬더니 success 경고창을 띄울 수 있었
ctrl-shit-esc.tistory.com
Reflected 공격 방식
Reflected XSS는 악의적인 스크립트가 사용자의 입력값을 통해 웹 애플리케이션으로 전달되고, 해당 입력값이 동적으로 웹 페이지에 반사되어 스크립트가 실행되는 방식의 XSS 공격
주로 검색어나 URL 매개변수 등을 통해 사용자의 입력이 반사되는 곳에서 발생한다.
악의적인 사용자가 검색어에 스크립트를 삽입하면, 해당 검색어가 서버로 전달되고, 서버에서는 입력값을 동적으로 웹 페이지에 반사시킨다. 그 결과, 다른 사용자가 해당 페이지를 방문할 때 스크립트가 실행될 수 있다.
Reflected XSS는 한 번의 요청과 응답 사이에 공격이 발생하므로, 공격 효과가 Stored XSS에 비해 일시적이다.
Reflected 공격 방식 예시
https://ctrl-shit-esc.tistory.com/107
[BWAPP] Cross-site scripting – Reflected (GET)
Quest. xss 취약점이 있는지 알아봅시다. 다음 화면을 띄워보세요. 경고창을 누른 후 화면 (Welcome success 출력) 난이도 low first name에 si, last name에 ss를 넣으니 사진과 같게 출력되었다. alert()를 입력해
ctrl-shit-esc.tistory.com
https://ctrl-shit-esc.tistory.com/108
[BWAPP] Cross-site scripting – Reflected (POST)
Quest. GET방식과 POST방식의 차이에 대해 간단히 정리해봅시다. GET 방식 : Header에 정보(변수)를 포함시켜 주소창(URL)에 서버로 넘어가는 정보가 보인다. POST 방식 : body에 정보(변수)를 포함시켜 주소
ctrl-shit-esc.tistory.com
점검 방법
XSS에 취약한 페이지 유형
1. HTML을 지원하는 게시판
2. Search Page
3. Join Form Page
4. Referrer를 이용하는 Page
5. 그 외 사용자로부터 입력받아 화면에 출력하는 모든 페이지
XSS를 유발할 수 있는 스크립트
<script> … </script>
<img src=“javascript:…..”>
<div style=“background-image:url(javascript…)”></div>
<embed>…</embed>
<iframe></iframe>
보안 설정 방법
웹 사이트에 사용자 입력 값이 저장되는 페이지는 공격자가 웹 브라우저를 통해 실행되는 스크립트 언어(HTML, Javascript, VBScript 등)를 사용하여 공격하므로 해당되는 태그 사용을 사전에 제한하고, 사용자 입력 값에 대한 필터링 작업이 필요하다.
게시물의 본문뿐만 아니라 제목, 댓글, 검색어 입력 창, 그 외 사용자 측에서 넘어오는 값을 신뢰하는 모든 form과 파라미터 값에 대해서 필터링을 수행한다.
입력 값에 대한 필터링 로직 구현 시 공백 문자를 제거하는 trim, replace 함수를 사용한다.
URLDecoder 클래스에 존재하는 decode 메소드를 통해 URL 인코딩이 적용된 사용자 입력 값을 디코딩함으로써 우회 공격을 차단한다.
웹 방화벽에 모든 사용자 입력 폼(회원정보 변경, 게시판, 댓글, 자료실, 검색, URL 등)을 대상으로 특수문자, 특수 구문을 필터링하도록 룰셋을 적용한다.