XSS와 CSRF

이지훈·2021년 1월 24일
0

공부한것들

목록 보기
2/15

XSS와 CSRF

XSS와 CSRF는 웹의 보안상 취약점을 찾아서 공격하는 공격방법입니다. 이전에 CORS를 찾아보다가 많이 나온 키워드가 XSS와 CSRF여서 한번 찾아봤습니다. 이번엔 어떤 공식 출처나 위키등을 찾기가 힘들어 블로그, 유튜브 강의를 많이 참고하였습니다. 영어로 된 글이 참 많았는데 다 읽을 수가 없었네요.. 제 영어실력의 한계를 느꼈습니다. 영어공부도 해야겠습니다.

XSS (Cross-Site Scripting)

아주 유명하지만 위험하고 많이 사용되는 공격이라고 한다.
외부/내부 사용자 모두 공격이 가능하고, 사용자 입력이 가능한 곳에서는 모두 공격시도가 가능하고 굉장히 다양한 방법으로 공격을 할 수 있기 때문에 모두 처리하기가 까다롭다.
공격을 당하게 된다면 쿠키/세션 탈취, 악의적인 사이트로 요청 등이 일어날 수 있다.

이름에서 알 수 있듯이 스크립트를 사용헤 다른 사이트를 공격하게 되는데 공격 방법에는 크게 세가지 분류가 있다.

  1. 저장된 XSS
    -게시판처럼 사용자가 정보를 서버에 업로드하는 곳에 XSS공격이 담긴 데이터를 삽입하여 저장하는 방법. 해당 게시글을 피해자가 조회시에 XSS 스크립트를 문자열이 아닌 하나의 스크립트 언어로 인식하여 공격이 동작하게 된다.
  2. 반사 XSS
    -웹페이지 URL에 존재하는 파라미터에 악의적인 스크립트 코드를 입력하여 피해자가 클릭하게 되면 피해자는 전달 받은 URL을 서버에 요청하고 응답 페이지에는 악성 스크립트가 포함된 채 다시 피해자에게 전달되어 피해자의 브라우저에서 응답 페이지 내의 악성 악성 스크립트 코드가 실행되게 하는 공격이다.
    피싱 공격에 자주 사용되며, 메일이나 게시글로 사용자의 클릭을 유도하는 방식으로 많이 사용된다.
  3. DOM 기반의 XSS
    -반사XSS와 비슷하게 악성 스크립트가 포함된 URL을 피해자에게 전달한다. 서버의 응답에서는 악성 스크립트가 없지만 피해자의 브라우저에서 피해자에게 보이진 않지만 DOM에 그려지는 innerHTML과 같은 요소에 악성 스크립트가 주입되어 실행되게 된다.

iframe 태그를 사용한 공격은 유니코드 등을 사용해 간접적으로 변환되어 공격이 일어날 수 있어 처리가 까다롭다고 한다. 아래는 간단하게 iframe 내에 script를 삽입해 alert가 일어나도록 해보았다.

XSS의 방어

가장 기본적인 방법은 위험할 수 있는 부분을 스크립트로 읽지 않고 문자로만 볼 수 있게 처리해주는 것이다.
이때 사용하는 것이 HTML entity인데 HTML의 문자들을 치환하여 보여주는 것이다. 만약 내가 <를 입력하고싶다면 &lt로 입력하면 된다.
HTML entity로 태그를 감싸는 <>를 &lt, &gt로 나타낸다면 스크립트가아닌 문자열로 읽을 수 있엉 안전할것이다. 이것을 XSS 공격이 일어날 수 있는 곳에 처리해주면 된다. 하지만 다양한 방식의 XSS공격이 있고 일어날 수 있는 위협도 많으므로 모두 처리하기는 힘들다.
이러한 것을 대신 해주는 다양한 라이브러리가 있으니 잘 사용하면 될 것 같다. 자바 프레임워크인 스프링에도 다양한 라이브러리가 있고 직접 filter 등을 이용해 처리할 수도 있다. npm에서도 오픈소스 모듈인 xss를 사용할 수 있다.

CSRF (Cross Site Request Forgery)

인터넷 사용자가 자신의 의자와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 만드는 공격이다.
하지만 CSRF는 직접 사용자의 컴퓨터를 감염시키거나 서버를 공격해서 이뤄지는 공격이 아니다. 특정 조건이 필요한데

  • 위조 요청을 전송하는 서비스에 피해자가 로그인한 상태
  • 피해자가 공격자가 만든 피싱 사이트에 접속

이러한 조건은 생각보다 흔히 일어나는데 보통 PC환경에서 매일 사용하는 SNS나 구글,네이버등의 계정은 자동 로그인을 유지하는 경우가 많고 그 상태에서 메일이나 다른 사이트 이용 중 피싱 사이트에 접속된다면 공격받을 수 있는것이다. 또한 직접 공격자가 만든 피싱사이트를 통하지 않더라도 XSS공격이 성공한 사이트를 통해 CSRF공격이 일어날 수도 있다.

가상 시나리오를 예로 들자면, 페이스북에 로그인 된 상태로 어떤 피싱 사이트의 글을 클릭하여 들어가게 되면, 그 피싱 사이트에 포함된 코드에서 페이스북 사이트에 어떤 글을 올리도록 하는 코드가 실행되게 되어 나도 모르는 사이에 내 계정으로 글이 작성되는 것이다.

CSRF의 방어

CSRF의 공격 방어에는 대표적으로 Referrer 검증과 Secruity Token(CSRF Token) 사용이 있다.

Referer 검증

HTTP referer는 웹브라우저를 사용할 때 하이퍼링크를 통해 사이트 방문시 남는 흔적으로, 어떤 사이트를 통해서 요청을 했는지 알 수 있다. 예를들어 A 사이트의 웹 페이지에서 하이퍼링크로 B 사이트로 갔다면 referer에는 A사이트의 정보가 담겨있고 B사이트에서는 A사이트를 통해 요청이 왔다는 것을 알 수 있다.
이렇게 request의 referer를 백엔드 서버에서 확인하여 도메인이 일치하는지 검증을 하면 CSRF를 막을 수 있다. 보통 이 referer 검증을 통해 대부분 방어가 가능하지만 페이지 내에 XSS 취약점이 있다면 또다시 CSRF의 공격에 취약해진다. domain단위 검증에서 좀 더 세밀하게 페이지 단위를 검증한다면 XSS취약점도 어느정도 보완할 수 있다.

Security Token (CSRF Token)

Referer 검증이 힘들다면 대신 사용 할 수 있다. 사용자의 세션에 임의의 난수 값을 저장하여 사용자의 요청마다 이 값을 포함시켜 전송한다. 이후 백엔드 서버에서 요청을 받을 때마다 세션의 토큰 값과 요청파라미터의 토큰 값이 일치하는지 검증한다. 이 경우도 XSS취약점이 있다면 CSRF공격에도 취약해진다.

마치며

이해하기가 어렵지만 이러한 공격이 있다는것을 알아서 좋네요. XSS가 간단하지만 굉장히 많이 쓰이는 공격이네요. XSS취약점이 있다면 다른 공격들에도 더 많이 노출되는 모양이니 XSS를 많이 신경써야할것같네요!

출처:
-TwolceFish 블로그
-https://itstory.tk
-유튜브 생활코딩
-유튜브 동빈나

profile
안녕하세요! 대학교 졸업한 이지훈입니다.

0개의 댓글