-
모의해킹의 여섯 번째 CSRF 공격웹 해킹 2021. 3. 16. 13:27
CSRF는 Cross Site Request Forgery의 약자로, 크로스 사이트 요청 변조라고 한다.
CSRF 취약점의 공격 방법은 공격자가 피싱을 이용하여 공격 대상이 되는 사용자에게 악성 링크를 누르게 하고, 링크를 클릭하면 사용자 모르게 사용자가 로그인되어 있는 웹사이트의 어떤 기능을 실해하는 것이다. 패스워드가 변경된다는 것이 하나의 예이다.
CSRF 취약점은 크로스 사이트와 동일하고 두 공격 모두 공격 과정에서 피싱을 이용하는 특성이 있다.
패스워드 변경의 예로 CSRF 공격 순서를 보면,
- 사용자가 웹사이트에 정상적으로 접속하여 로그인한다.
- 웹사이트에 로그인되어 있는 동안, 공격자가 이메일을 보내 악성 코드를 포함하는 링크를 클릭하도록 피싱을 한다.
- 사용자가 링크를 클릭하면, 공격자가 지저안 패스워드로 변경하는 요청이 자신이 이전에 로그인되어 있는던 웹사이트로 전송된다. 그 결과, 사용자가 모르는 사이에 패스워드가 변경된다.
- 공격자는 변경된 패스워드를 이용하여 사용자의 계정으로 로그인할 수 있게 된다.
요즘 웹 브라우저들을 보면 로그인한 상태로 그대로 둔채 작업을 할 수 있다. CSRF 공격은 로그인 조건이 만족시켜야 가능한다는 전제가 있는데 이런 경우라면 CSRF 취약점이 발생하게 된다. CSRF 공격을 예방하려면, 모르는 사용자가 보낸 이메일을 읽지 않고, 링크를 누르기 전에 URL을 확인하는 습관을 갖는 것이 좋다.
CSRF 실습을 해보겠다.
우선 보안 레벨을 low로 설정한다.
위 그림에서 보는 것처럼 GET 방식으로 요청이 전송되며, password_new, password_conf 파라미터에 입력한 패스워드가 전달되고, Change 파라미터에는 Change라는 값이 전달된다. 그리고 쿠키의 헤더에는 PHPSESSID 쿠키와 보안 레벨의 관련된 쿠키가 전달되고 있다.
이 요청에는 PHPSESSID 쿠키만 랜덤 값이고 나머지 파라미터 들은 지정된 값이다. 따라서 공격자는 PHPSESSID 값만 알거나 전달시킬 수 있으면 패스워드를 변경할 수 있다. 이 중에서 쿠키를 전달시키기 위한 방법으로 CSRF 공격을 사용한다.
한편 사용자가 로그인되어 있을 때에는 웹 페이지를 요청할 때마다 쿠키가 웹 브라우저에 의해 자동으로 전달된다. 따라서 공격자가 피싱 공격이나 다른 사회 공학 기법을 이용하여 사용자로 하여금 로그인된 웹사이트의 링크를 누르게 만들면 쿠키를 전달시킬 수 있다. 이러한 이유로 CSRF 공격의 필수 조건은 사용자가 로그인되어 있어야한다는 것이다.
POC 코드를 다운받고 실습을 해보겠다.
poc() 함수에서 요청 URL과 파라미터를 똑같이 구성하고, 패스워드를 hacker로 지정한다. 만약 CSRF 공격이 성공하면 패스워드는 hacker로 변경될 것이다.
코드를 더 보면, XMLHttpRequest()를 사용한 AJAX 기법을 이용하여 poc() 함수를 호출하고, withCredentials 속성을 true로 설정하여 요청이 전송될 때 웹 브라우저가 쿠키를 자동으로 같이 전송하도록 만든다.
이렇게 공격이 성공하여 패스워드가 바뀐 것을 볼 수 있다.
CSRF 공격을 대응하기 위해서 두 가지 방법이 있다.
1. 요청 메세지의 Referer 헤더를 검사하여, 웹 메일이나 타 사이트에서 피싱을 당해 전송되는 요청을 실행하지 않는다. Referer 헤더는 해당 요청을 링크하고 있던 이전 웹 페이지의 주소를 알려주는 헤더이다.
2. CSRF 토큰을 사용한다. 쿠키 외에 공격자가 추측할 수 없는 값이 요청 메세지의 파라미터 등에 포함되어 있다면 CSRF 공격을 성공시키기 어려워진다. CSRF 공격 대응을 위해 포함시키는 랜덤 값을 CSRF 토큰이라고 한다.
CSRF 토큰을 이용한 대응 방식
- 웹 애플리케이션이 CSRF 토큰을 매 응답마다 랜덤하게 생성하여 클라이언트로 보낸다.
- 클라이언트는 이전 응답 메세지에 포함된 토큰 값을 다응 요청 시 포함시켜 전송한다.
- 웹 어플리케이션이 CSRF 토큰 값을 검사하고 확인한다.
70번째 줄에서 user_token이 표시된다. 이 값의 value가 CSRF 토큰 역할을 한다. 이제 패스워트 변경 요청을 보내면 CSRF 토큰이 user_token 파라미터를 통해 전달하게 된다.
이 방법을 통해 CSRF 공격을 대응할 수 있다.
하지만 AJAX를 이용해 자동으로 토큰을 가져올 수 있다.
req1 함수는 토큰을 알아내기 위한 함수이고, req2는 req1을 분석하여 토큰을 분석한다.
이 파일을 사용하여 크로스 사이트 스크립팅으로 파일을 읽게 만들고, 토큰을 알아낼 수 있다.
CSRF 공격을 막으려면 위 그림처럼 현재 패스워드를 입력받도록 한다. 공격자는 기존 패스워드를 알 수 없기 때문에 CSRF 공격을 할 수 없다.
위 글은 화이트 해커를 위한 웹 해킹의 기술을 참고했습니다.
'웹 해킹' 카테고리의 다른 글
모의해킹의 여덟 번째 민감한 데이터 노출 (0) 2021.03.18 모의해킹의 일곱 번째 파일 공격 (0) 2021.03.17 모의해킹의 다섯 번째 XSS 공격 (0) 2021.03.15 모의해킹의 네 번째 커맨드 인젝션 공격 (0) 2021.03.14 모의해킹의 세 번째 SQL 인젝션 공격 (0) 2021.03.13