XSS와 CSRF는 웹의 보안상 취약점을 찾아서 공격하는 공격방법입니다. 이전에 CORS를 찾아보다가 많이 나온 키워드가 XSS와 CSRF여서 한번 찾아봤습니다. 이번엔 어떤 공식 출처나 위키등을 찾기가 힘들어 블로그, 유튜브 강의를 많이 참고하였습니다. 영어로 된 글이 참 많았는데 다 읽을 수가 없었네요.. 제 영어실력의 한계를 느꼈습니다. 영어공부도 해야겠습니다.
아주 유명하지만 위험하고 많이 사용되는 공격이라고 한다.
외부/내부 사용자 모두 공격이 가능하고, 사용자 입력이 가능한 곳에서는 모두 공격시도가 가능하고 굉장히 다양한 방법으로 공격을 할 수 있기 때문에 모두 처리하기가 까다롭다.
공격을 당하게 된다면 쿠키/세션 탈취, 악의적인 사이트로 요청 등이 일어날 수 있다.
이름에서 알 수 있듯이 스크립트를 사용헤 다른 사이트를 공격하게 되는데 공격 방법에는 크게 세가지 분류가 있다.
iframe 태그를 사용한 공격은 유니코드 등을 사용해 간접적으로 변환되어 공격이 일어날 수 있어 처리가 까다롭다고 한다. 아래는 간단하게 iframe 내에 script를 삽입해 alert가 일어나도록 해보았다.
가장 기본적인 방법은 위험할 수 있는 부분을 스크립트로 읽지 않고 문자로만 볼 수 있게 처리해주는 것이다.
이때 사용하는 것이 HTML entity인데 HTML의 문자들을 치환하여 보여주는 것이다. 만약 내가 <를 입력하고싶다면 <
로 입력하면 된다.
HTML entity로 태그를 감싸는 <>를 <
, >
로 나타낸다면 스크립트가아닌 문자열로 읽을 수 있엉 안전할것이다. 이것을 XSS 공격이 일어날 수 있는 곳에 처리해주면 된다. 하지만 다양한 방식의 XSS공격이 있고 일어날 수 있는 위협도 많으므로 모두 처리하기는 힘들다.
이러한 것을 대신 해주는 다양한 라이브러리가 있으니 잘 사용하면 될 것 같다. 자바 프레임워크인 스프링에도 다양한 라이브러리가 있고 직접 filter 등을 이용해 처리할 수도 있다. npm에서도 오픈소스 모듈인 xss를 사용할 수 있다.
인터넷 사용자가 자신의 의자와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 만드는 공격이다.
하지만 CSRF는 직접 사용자의 컴퓨터를 감염시키거나 서버를 공격해서 이뤄지는 공격이 아니다. 특정 조건이 필요한데
이러한 조건은 생각보다 흔히 일어나는데 보통 PC환경에서 매일 사용하는 SNS나 구글,네이버등의 계정은 자동 로그인을 유지하는 경우가 많고 그 상태에서 메일이나 다른 사이트 이용 중 피싱 사이트에 접속된다면 공격받을 수 있는것이다. 또한 직접 공격자가 만든 피싱사이트를 통하지 않더라도 XSS공격이 성공한 사이트를 통해 CSRF공격이 일어날 수도 있다.
가상 시나리오를 예로 들자면, 페이스북에 로그인 된 상태로 어떤 피싱 사이트의 글을 클릭하여 들어가게 되면, 그 피싱 사이트에 포함된 코드에서 페이스북 사이트에 어떤 글을 올리도록 하는 코드가 실행되게 되어 나도 모르는 사이에 내 계정으로 글이 작성되는 것이다.
CSRF의 공격 방어에는 대표적으로 Referrer 검증과 Secruity Token(CSRF Token) 사용이 있다.
HTTP referer는 웹브라우저를 사용할 때 하이퍼링크를 통해 사이트 방문시 남는 흔적으로, 어떤 사이트를 통해서 요청을 했는지 알 수 있다. 예를들어 A 사이트의 웹 페이지에서 하이퍼링크로 B 사이트로 갔다면 referer에는 A사이트의 정보가 담겨있고 B사이트에서는 A사이트를 통해 요청이 왔다는 것을 알 수 있다.
이렇게 request의 referer를 백엔드 서버에서 확인하여 도메인이 일치하는지 검증을 하면 CSRF를 막을 수 있다. 보통 이 referer 검증을 통해 대부분 방어가 가능하지만 페이지 내에 XSS 취약점이 있다면 또다시 CSRF의 공격에 취약해진다. domain단위 검증에서 좀 더 세밀하게 페이지 단위를 검증한다면 XSS취약점도 어느정도 보완할 수 있다.
Referer 검증이 힘들다면 대신 사용 할 수 있다. 사용자의 세션에 임의의 난수 값을 저장하여 사용자의 요청마다 이 값을 포함시켜 전송한다. 이후 백엔드 서버에서 요청을 받을 때마다 세션의 토큰 값과 요청파라미터의 토큰 값이 일치하는지 검증한다. 이 경우도 XSS취약점이 있다면 CSRF공격에도 취약해진다.
이해하기가 어렵지만 이러한 공격이 있다는것을 알아서 좋네요. XSS가 간단하지만 굉장히 많이 쓰이는 공격이네요. XSS취약점이 있다면 다른 공격들에도 더 많이 노출되는 모양이니 XSS를 많이 신경써야할것같네요!