XSS/CSRF 공격 보안 대책 중, HTTP Only Flag 설정이 있다.
[애플리케이션] 외부로 부터 입력되는 모든 문자열에 대해 특수문자 필터링 적용
[애플리케이션] 외부로부터 입력되는 모든 문자열에 대해 키워드 필터링 적용
[애플리케이션] 오픈소스 XSS 필터링 라이브러리 적용 (Lucy-Filter, Anti-Samy)
[네트워크] 보안 장비 내 XSS 필터링 정책 활용 (WAF)
[브라우저] HTTP Only Flag 설정 / CSP (Contents Security Policy)
이게 뭘까?
portswigger Lab: Reflected XSS into a JavaScript string with single quote and backslash escaped 솔루션은 아래와 같다.
</script><script>alert(1)</script> => alert 경고창에서 1 출력
</script><script>alert(documnet.cookie)</script> => alert 경고창 메시지 없이 출력
=> [브라우저] HTTP Only Flag 설정 / CSP (Contents Security Policy) 때문이다.
브라우저에서 해당 스크립트를 실행하면서, DOM 객체를 읽어오지 않게 보안 설정이 되어 있기 때문이다.
웹 서버에서 Response 전송 시, set-cookie 에서 documnet.cookie value를 설정하고, HTTP Only Flag 설정한다.
챗 GPT에게 물어보니 OPEN AI 페이지에서도 해당 값이 설정되어 있다고 한다.
웹 브라우저의 응답 값을 확인해보니 위 사진과 같이 HTTP Only Flag 설정을 확인 가능했다.
</script><script>alert(documnet.cookie)</script>
HTTP Only Flag 설정으로 인해 위 스크립트를 웹 브라우저에서 실행 하려고 할 때 alert 경고창이 나타나더라도, 메시지 내용이 없이 출력된다.
아래 방법대로 조회 가능하다.
크롬 웹 브라우저 기준 : 개발자도구(F12) - Application - Storage - Cookies -...
즉, 위 사진에 있는 Cookie value가 document.cookie 라는 DOM 객체가 값을 가져오는 것이다.
SK shieldus Rookies 16기 (클라우드 보안 기술 #07) 에서 해당 설정을 끄고, 세션을 탈취하는 실습을 진행했다.
XSS 취약점 보호를 목적으로 쿠키값 HTTP Only Flag 설정이 존재한다는 것을 알았다.
쿠키가 클라이언트로 도착하면, HTTP Only Flag 설정으로 클라이언트도, 웹 서버도 해당 쿠키 값을 Javascript로 호출 불가능하다. (documnet.cookie가 결과 가져올 수 없다.)
따라서 Cookie value에 중요 정보를 저장하거나 사용하면 안 된다.
그러나 이는 이미 HTTP Only Flag 설정 전 쿠키에 저장된 정보가 있다면, documnet.cookie 실행 가능성이 있다고 생각해본다.