CSRF Token
CSRF 공격을 막기 위한 방법 중 하나인 CSRF Token은 CSRF Token을 발행하고 Token을 세션에 저장하여 요청을 할 때 토큰을 전송하고 전송된 토큰 값과 세션의 토큰 값을 비교하여 정상적인 요청인지 조작된 요청인지 확인하는 방어 기법이다.
다만 효과적인 방어 방법이냐!! 라고 한다면 그건 좀 아쉬울 수 있는데 XSS 취약점이 존재한다면 토큰 값을 굉장히 복잡하게 설정한다고 하더라도 탈취될 수 있기 때문이다. 그래도 구현하기 많이 어렵지 않다는 점과 1차적인 방어 역할을 해준다는 점 때문에 활용하기는 편하다.
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
csrf token을 생성하는 구문이다. random_bytes 함수로 32개의 무작위 아스키 코드 문자열을 생성한다. 그리고 bin2hex 함수로 아스키 문자열을 16진수 값으로 바꿔준다.
글씨가 너무 조그마한가.. 지송!!
위의 토큰은 bin2hex를 적용하지 않은 경우, 아래 토큰은 bin2hex를 적용해 16진수 값으로 나온 경우이다. bin2hex 적용 안하면 토큰 비교가 제대로 안되어 오류남.
이제 토큰을 어떤 식으로 구현하는지 간략하게 살펴보았고, 제대로 적용된 csrf_token을 이용하여 토큰이 없었던 때의 공격을 있을 때 시도하여 공격이 막히는지! 왜 막히는지(는 사실 위에서 설명)도 살펴봐요 우리
CSRF
Cross Site Request Forgery(CSRF)는 공격자가 스크립트 구문을 사용해서 다른 정상적인 사용자가 조작된 요청을 전송하도록 하는 공격을 말한다. XSS와 헷갈릴 수 있는데 XSS는 악의적인 스크립트가 희생
ragdo11.tistory.com
아무런 방어 대책이 없는 페이지에서 했던 공격을 csrf token 방어 대책이 적용을 한 후 그대로 시행해보자!
그 때의 코드 그대로이다. 방어 대책이 없었을 때는 비밀번호가 그대로 변경되었는데
csrf token을 적용하고 나니 비밀번호가 변경되지 않고 잘못된 CSRF Token이라는 경고창이 뜬다. 비밀번호 변경을 할 때 csrf token을 요구하는데 공격 페이로드에서는 csrf token을 전송해주지 않고 있기 때문에 검증 단에서 막히게 된다.
검증을 우회하기 위해서는 요청 때마다 새롭게 바뀌는 무작위의 토큰 값을 공격자가 정확히 알아내어 전송해주어야 하는데 사실상 불가능해 보인다. 하지만 사이트에 XSS 취약점이 존재한다면 취약점을 이용하여 토큰 값을 탈취해낼 수 있고, 탈취해낸 토큰 값을 이용해 그대로 CSRF 공격에 활용할 수 있다.
iframe이 로드되었을 때 자동으로 bypass 함수를 실행시키도록 되어있고, bypass 함수는 csrf_token 값을 받아와 비밀번호 변경 페이지에 바꿀 비밀번호와 토큰 값을 넘겨주는 과정을 수행한다. 마지막엔 자동으로 submit하게 되어 있다.
작성된 페이로드가 담겨 있는 CSRF Token bypass 글을 클릭해보면
변경할 패스워드와 csrt 토큰이 변경 페이지에 전송됨을 확인할 수 있고
비밀번호가 변경되었음을 확인할 수 있다.