2024 SWLUG/클라우드

Reflected XSS

un_plugged 2024. 9. 30. 21:58

XSS 공격

웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 이를 통해  사용자의 정보(쿠키, 세션 등)를 탈취하거나 웹사이트 변조, 피싱 공격 등을 할 수 있다. 

 

Reflected XSS(반사 XSS)

사용자가 입력한 URL 이나 Parameter , Cookie 등을 기반으로 스크립트가 실행되도록 하는 공격이다.

  • 한 번의 HTTP 요청과 응답에서 행해지는 XSS로 어떠한 정보도 저장되지 않음
  • 어떤 공격 페이로드나 검색어를 이용하든 각 경우마다 새로운 결과 페이지를 생성

-> 결과적으로 공격자가 생성해 놓은 링크를 피해자가 클릭하게 유도하는 방식!

 

<공격 방식>

기본적으로 URL의 CGI 인자에 Script Code를 삽입하는 것이다.

※CGI(Common Gateway Interface): 웹 서버 상에서 사용자 프로그램을 동작시키기 위해, 데이터를 주고받는 방식 또는 규약

 

1. 공격자가 이메일을 이용해 어떤 웹페이지 링크를 보내고 사용자가 링크를 클릭하면 그 링크의 웹페이지가 나옴

2. 이때 웹페이지 링크 URL에 삽입된 스크립트 코드가 실행되면서 웹페이지 내용이 변조됨

 

 

 

Reflected XSS 공격 실습

먼저 DVWA에 접속한다. (접속 방식은 실습 환경 구성 참고)

이렇게 접속하면 좌측 메뉴 중 XSS (Reflected) 를 클릭한다.

클릭하면 위와 같이 나오는데 "What's your name?" 입력 칸에 숫자 admin을 입력한 후 조회를 위해 Submit 버튼을 클릭한다. 

이렇게 'Hello admin(입력값)"이라고 나오는데 입력 받은 값을 제대로 검증하거나 필터링하지 않고 그대로 HTML 콘텐츠에 삽입된 것을 알 수 있다. 

 

이제 동일한 화면에서 "What's your name?" 입력 칸에 아래의 XSS 코드를 입력한 후 Submit 버튼을 클릭한다. 

<script>alert(document.cookie)</script>

※위의 자바스크립트 코드는 웹 페이지에서 실행되면 사용자의 브라우저에 저장된 쿠키 정보를 경고창(alert)에 표시한다.

 

  • document.cookie: 현재 웹 페이지에 저장된 쿠키 데이터를 가져옴
  • alert(): 경고창을 띄우는 함수로, 여기서는 쿠키 정보를 경고창에 출력

-> XSS 공격에 자주 사용되는 예시로, 악의적인 사용자가 웹 페이지에 삽입하면 다른 사용자의 쿠키를 쉽게 탈취할 수 있다. 

 

 

위와 같이 공격이 성공하여 접속한 도메인 정보, 사용자의 쿠키 정보를 포함한 알람창이 공격자가 입력한 코드에 의해 나타나는 것을 확인할 수 있다. 

※만약 알림창이 뜨지 않는다면 Security level을 low로 했는지 확인!

 

 

 

Reflected XSS 공격 방어 실습 - 사용자 정의 규칙

DemoACL에 접속하여 Rules 탭을 선택한 후 Add my own rules and rule groups 를 클릭한다.

※custom_denied를 생성한 DemoACL에 규칙을 생성해야한다!

규칙 생성 화면에서 Rule Type 에서는 Rule Builder 가 선택된 상태를 유지하고, 규칙 이름에는 Reflected_XSS 를 입력한 후 Type  Regular Rule 을 선택한다.

If a request 의 Pull Down 메뉴에서는 matches the statement 를 선택하고, Inspect  Query String, Match Type  Contains XSS Injection Attacks 를 선택한다. Text Transformation 에 대해서는 Compress White Space  URL decode Unicode 를 추가한다.

규칙에 매칭되는 요청을 처리하는 액션은 Block 을 선택한다. 하단의 Custom response 옵션의 체크 박스를 체크한다.다Response Code 에는 200 을 입력하고 "2.2 Web ACL 생성단계"에서 생성한 custom_denied 페이지를 선택한다.

※실습 환경 구성과는 다른 자료로 실습을 하게 되어서 이 자료의 안내에 따라 "2.2 Web ACL 생성단계"에서 custom_denied페이지를 생성해야 한다!

 

위에 따라 모든 설정이 완료되었다면 Add Rule 버튼을 클릭한다.

그 다음으로 나오는 Priority 설정하는 화면에서 Save 버튼을 클릭을 하면 아래와 같이 Reflected_XSS 규칙이 생성된다. 

이제 Reflected XSS 공격 실습과 마찬가지로 DVWA 의 XSS(Reflected) 메뉴의 What's your name? 입력칸에 아래와 같은 Reflected XSS 코드를 입력한 후 Submit 버튼을 클릭한다.

<script>alert(document.cookie)</script>

이렇게 사용자의 요청이 사용자 정의 차단 페이지와 함께 차단되는 것을 확인할 수 있다. 

 

 

 

Reflected XSS 대응 방안

1. 입력값 제한

브라우저에서 사용자 입력 시 특수 문자를 제한한다. 

-> 정규식을 활용하여 “한글”, “영어”, “숫자”, “공백”만 허용하여 스크립트가 입력되지 않을 수 있도록 제한한다.

 

2. 입력값 치환

악성 스크립트를 만들 수 있는 특수 문자들을 치환한다. 모든 요청에 대해 치환을 적용할 수 있도록 필터를 만들어 적용한다. 

악성 스크립트를 만들 수 있는 특수 문자

3. 직접 출력 금지

사용자의 입력을 그대로 출력하는 일은 위험하므로 라이브러리의 출력 함수를 사용한다. 

EX) JSTL의 <c:out />