Cross Site Request Forgery
웹 어플리케이션 취약점 중 하나로, 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위 (modify, delete, register 등)를 특정한 웹사이트에 request하도록 만드는 공격을 말한다.
주로 해커들이 많이 이용하는 것으로, 유저의 권한을 도용해 중요한 기능을 실행하도록 한다.
우리가 실생활에서 CSRF 공격을 볼 수 있는 건, 해커가 사용자의 SNS 계정으로 광고성 글을 올리는 것이다.
정확히 말하면, CSRF는 해커가 사용자 컴퓨터를 감염시거나 서버를 해킹해서 공격하는 것이 아니다. CSRF 공격은 아래와 같은 조건이 만족할 때 실행된다.
보통 자동 로그인을 해둔 경우에 이런 피싱 사이트에 접속하게 되면서 피해를 입는 경우가 많다. 또한, 해커가 XSS 공격을 성공시킨 사이트라면, 피싱 사이트가 아니더라도 CSRF 공격이 이루어질 수 있다.
예시
상황 가정
사용자는 공격을 시도하는, 제 3의 사이트에 로그인이 되어있다,
공격자는 다음과 같은 코드를 피싱 사이트에 삽입했다.
=> width와 height가 0 이기때문에 사용자는 인지할 수 없다.<img src="사용자 비밀번호 가져오기" width="0" height="0" />
기본적으로
<img>
태그는 GET 요청으로 수행된다.
만약 src의 값이 사용자 비밀번호를 가져오는 url 이었다면, 개인정보를 털렸을 것이다.
백엔드 단에서 Refferer 검증을 통해 승인된 도메인으로 요청시에만 처리하도록 한다.
Request Header에 포함된 Referer는 현재 요청된 페이지의 링크 이전의 웹 페이지 주소를 포함한다.
요청을 받는 서버는 CSRF를 막기위해 정해준 Referer만 허용해주는 유효성 검사 로직을 추가하는 조치를 취한다.이후에 피싱페이지에서 의도하지 않은 행위를 한다면,
이전에 작성한 Referer 값 유효성 검사에서 걸러질 것이다.
즉, 해당 요청이 요청될 수 있는 위치가 아닌 곳은 예외를 발생시켜서 막을 수 있다.그러나, 오히려 내가 설정해준 위치에서
XSS 취약점
이 발견된다면,
이를 통해서 CSRF가 수행될 수 있다는 단점이 있다.
사용자의 세션에 임의의 난수 값을 저장하고, 사용자의 요청시 해당 값을 포함하여 전송시킨다. 백엔드 단에서는 요청을 받을 때 세션에 저장된 토큰값과 요청 파라미터로 전달받는 토큰 값이 일치하는 지 검증 과정을 거치는 방법이다.
하지만, XSS에 취약점이 있다면 공격을 받을 수도 있다.
Cross Site Scription
CSRF와 같이 웹 어플리케이션 취약점 중 하나로, 관리자가 아닌 권한이 없는 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법을 말한다.
악의적으로 스크립트를 삽입하여 이를 열람한 사용자의 쿠키가 해커에게 전송시키며, 이 탈취한 쿠키를 통해 세션 하이재킹 공격을 한다. 해커는 세션ID를 가진 쿠키로 사용자의 계정에 로그인이 가능해지는 것이다.
공격 종류로는 지속성, 반사형, DOM 기반 XSS 등이 있다.
XSS Cheat Sheet에 대한 필터 목록을 만들어 모든 Cheat Sheet에 대한 대응을 가능하도록 사전에 대비한다. XSS 필터링을 적용 후 스크립트가 실행되는지 직접 테스트 과정을 거쳐볼 수도 있다,
Anti XSS 라이브러리를 제공해주는 회사들이 많다. 이 라이브러리는 서버단에서 추가하며, 사용자들은 각자 브라우저에서 악성 스크립트가 실행되지 않도록 확장앱을 설치하여 방어할 수 있다.
웹 방화벽은 웹 공격에 특화된 것으로, 다양한 Injection을 한꺼번에 방어할 수 있는 장점이 있다.
CORS(Cross-Origin Resource Sharing), SOP(Same-Origin-Policy)를 통해 리소스의 Source를 제한 하는것이 효과적인 방어 방법이 될 수 있다. 웹 서비스상 취약한 벡터에 공격 스크립트를 삽입 할 경우, 치명적인 공격을 하기 위해 스크립트를 작성하면 입력값 제한이나 기타 요인 때문에 공격 성공이 어렵다. 그러나 공격자의 서버에 위치한 스크립트를 불러 올 수 있다면 이는 상대적으로 쉬워진다. 그렇기 떄문에 CORS, SOP를 활용 하여 사전에 지정된 도메인이나 범위가 아니라면 리소스를 가져올 수 없게 제한해야 한다.