Reflected XSS 실습 및 대응 방안

실습 환경


claude code를 이용해 생성한 XSS 취약점 테스트용 Flask 서버를 구성한다.


실습


검색 기능을 하는 웹 애플리케이션이다.


URL 입력 창에 [http://192.168.0.100:5000/reflected?search=<img src=x onerror=”alert(‘Reflected XSS!!’)”>]을 입력하고 접속한다. 그러면 <img> 태그의 자바스크립트가 실행되어 알림창으로 “Reflected XSS!!” 메시지를 출력하게 된다.


취약점이 발생한 이유


클라이언트에서 서버로 전송한 입력 값에 대한 검증을 수행하지 않아 HTML 태그를 허용하고 있다. 그래서 서버는 입력 값으로 받은 <img> 태그를 그대로 동적 페이지를 구성 후, 클라이언트에게 응답하고 있다.

클라이언트는 악성 스크립트가 담긴 페이지를 응답받고, 브라우저에서 자바스크립트가 실행된다.


대응 방안


본 실습에서는 HTML Entity Encoding을 수행하여 대응할 것이다.

해당 취약점은 서버에서 검증을 하지 않고 동적 페이지를 구성하는데 문제가 있다. 그러므로 서버에서 HTML Entity Encoding을 수행해서 대응해야 한다.

app.py에서 입력받는 코드를 확인하면, GET 메서드를 통해 search 파라미터로 입력받고 search_query 변수에 저장한다. 그리고 reflected.html 파일에 입력 값을 저장한 search_query 값을 렌더링한다.


safe 설정으로 HTML Entity Encoding을 수행하지 않고 있으므로, 해당 설정을 삭제한다.


시큐어 코딩 후 실습


safe 설정이 존재할 때는 HTML Entity Encoding을 수행하지 않아, 악성 스크립트를 그대로 응답했지만, safe 설정을 삭제 후에는 HTML Entity Encoding을 수행하고 있다.

Published by