IT/웹 보안

[Cross Site Request Forgery (CSRF)]

kykyky 2024. 6. 8. 08:38

CSRF는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 클라이언트 측 취약점이다.

 

 

웹 서비스 예시 소스 코드

이용자로부터 예금주와 금액을 입력받고 송금을 수행한다.

 

이때 계좌 비밀번호, OTP 등을 사용하지 않기 때문에,

로그인한 이용자는 추가 인증 정보 없이 해당 기능을 이용할 수 있다.

 

송금 요청이 담긴 request는 아래와 같다.

 

 

1.

attacker는 페이지에 악성 스크립트를 심고, 여기에 victim(정상 이용자)이 접속하도록 / 값을 입력하도록 유도한다.

 

eg) 악성 스크립트가 담긴 글을 게시판에 작성

 

악성 스크립트

: HTTP request를 보내는 코드

- HTML 또는 Javascript를 통해 작성할 수 있음

 

HTML을 통한 공격 코드 예시

태그를 사용해 HTTP 요청을 보내면, HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함된다.

 

정상적인 img 태그는 아래와 같이 작동한다.

 

이를 아래와 같이 변형한다. 

이미지의 크기를 0으로 줄여 숨겼음. 아주 음흉하다 

 

link 태그를 이용한 공격은 아래와 같다.

 

정상적인 form 태그는 아래와 같으며, 이역시도 변형할 수 있을 것이다.

 

Javascript 을 통한 공격 코드 예시

 

 

2.

victim은 해당 페이지에 접속하거나 값을 입력하여 악성 스크립트를 실행함으로써, 특정 웹사이트에 의도치 않은 request를 전송한다.

 

 

3.

만약 victim이 자동 로그인 등을 통해 브라우저에 세션 쿠키를 저장하고 있었다면, 이 request는 victim의 cookie를 가진다.

이때 victim의 cookie는 ㅡ 클라이언트에서 보내진 request가 victim으로부터 왔고 victim이 동의했음 ㅡ 을 의미하며,
웹 서비스는 cookie나 session을 사용해 이용자를 식별하고 그 request가 그 이용자의 권한을 갖게 하므로,

request는 victim의 권한으로 attacker가 지정한 임의 주소로 전송된다.

(임의 주소: 포털사이트, 은행 등)

 

결과적으로 attacker 계좌로의 송금, 비밀번호 변경과 계정 탈취, 관리자 계정 공격하여 공지사항 작성 등의 피해가 발생할 수 있다.