Cross Site Request Forgery
인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정한 웹사이트에
request 하도록 만드는 공격 기법을 의미한다. (여기서 행위란 modify, delete, register 등..)
주로 해커들이 많이 사용하는 공격 기법으로, 유저의 권한을 도용해 특정 기능을 실행하도록 하는데, 대표적인 예가 해커(attacker)가 사용자(victim)의 SNS 계정으로 광고성 글을 올리는 것이다.
덧붙이자면, CSRF는 해커가 사용자의 컴퓨터를 감염시키거나, 서버를 해킹해서 이뤄지는 것이 아닌 다음 조건을 만족할 때 공격이 성공적으로 이루어진다.
- 사용자가 해커가 만든 피싱 사이트에 접속한 경우
- 위조 요청을 전송하는 서비스에 사용자가 로그인 한 상황
일반적으로, 자동 로그인을 해두고 피싱 사이트에 접속하게 되면서 피해를 입는 경우가 많다.
또한 해커가 XSS 공격을 성공시킨 사이트라면 피싱 사이트가 아니더라도 CSRF 공격이 이루어질 수 있다.
대표적으로 두가지 방어 기법이 존재한다.
Referer(리퍼러) 검증
Back-end 단에서 request의 referer를 확인하여 도메인이 일치하는지 검증하는 기법
Security Token 사용
사용자의 세션에 임의의 난수 값을 저장하고, 사용자가 request를 보낼 때, 해당 값을 포함하여 전송시킨 뒤,
Back-end 단에서는 세션에 저장된 토큰값과 request 파라미터로 전달받는 토큰 값이
일치하는지 검증하도록 하는 기법
하지만 두 방법 모두, XSS에 취약점이 있다면 공격을 받을 수도 있다고 한다.
Cross Site Scription
관리자(admin)가 아닌 사용자가 웹 사이트에 스크립트를 삽입하는 공격 기법이다.
해커가 게시물 같은 곳에 악의적인 스크립트를 삽입하고, 이를 열람한 로그인된 사용자의 쿠키를 탈취한다. 해커는 이 탈취한 쿠키에 담긴 세션 ID로 사용자의 계정에 로그인할 수 있게 된다.
XSS의 공격 종류로는 Persistent(stored)
, Reflected
, DOM based XSS
등이 있다.
1. Persistent(지속성)
말 그대로, 지속적으로 피해를 입히는 유형으로, XSS 취약점이 존재하는 웹 어플리케이션에 악성 스크립트를 삽입하여 열람한 사용자의 쿠키를 탈취하거나 리다이렉션 시키는 공격을 한다.
이때 삽입된 스크립트를 데이터베이스에 저장시켜 지속적으로 공격을 하기 때문에 Persistent XSS라고 불린다.
2. Reflected(반사형)
사용자에게 입력 받은 값을 서버에서 되돌려 주는 지점에서 발생하는 공격인데, 공격자는 악성 스크립트가 포함된 URL을 사용자에게 누르도록 유도하고, 이것을 누른 사용자의 브라우저에서 이 스크립트가 실행되어 공격을 당하게 되는 유형이다.
3. Dom based XSS
악성 스크립트가 포함된 URL을 사용자가 요청하게 되면서 브라우저를 해석하는 단계에서 발생하는 공격이다. 이 스크립트로 인해 클라이언트 측 코드가 원래 의도와 다르게 실행된다. 이는 다른 XSS 공격과는 달리 서버 측에서 탐지가 어렵다.
- 입출력 값 검증
XSS Cheat Sheet에 대한 필터 목록을 만들어, 모든 Chreat Sheet에 대한 대응을 가능하도록 사전에 대비한다. XSS 필터링을 적용 후 스크립트가 실행되는지 직접 테스트 과정을 거쳐볼 수도 있다.
- XSS 방어 라이브러리, 확장 앱
Anti XSS 라이브러리를 제공해주는 회사들이 많은데, 이 라이브러리를 Back-end단에서 추가할 수 있으며, 사용자들은 각자의 브라우저에서 악성 스크립트가 실행되지 않도록 확장 앱을 설치하여 방해할 수 있다.
- 웹 방화벽
웹 방화벽은 웹 공격에 특화된 것으로, 다양한 Injection을 한꺼번에 방어할 수 있는 장점이 있다.
- CORS, SOP 설정
CORS(Cross-Origin-Resource-Sharing)
, SOP(Same-Origin-Policy)
를 통해 리소스의 Source를 제한하는 것이 효과적인 방어 방법이 될 수 있다.
웹 서비스 상 취약한 벡터에 공격 스크립트를 삽입할 경우, 치명적인 공격을 하기 위해 스크립트를 작성하면 입력값 제한이나 기타 요인 때문에 공격 성공이 어려우나,
공격자의 서버에 위치한 스크립트를 불러 올 수 있다면 이는 상대적으로 쉬워진다.
이를 막기 위해 CORS, SOP를 활용하여 사전에 지정된 도메인이나 범위가 아니라면 리소스를 가져올 수 없도록 제한해야 한다.