CERT

CSRF 모의해킹

뭉크테크 2024. 6. 15. 20:30

목차

  • CSRF 이론
  • CSRF 실습
  • CSRF 대응방안

 

CSRF 이론

  • 이는 사 전에 웹 서버에 인증된 사용자를 대상으로 하는 공격으로, 사용자가 의도하지 않은 요청을 웹 서버로 전송 하는 방법이다.
  • 이 악의적인 요청은 사용자의 브라우저를 통해 웹 서버로 전송되기 때문에 웹 서버애서는 정상적인 사용자의 요청과 구별할 수 없다.
  • 웹 서버와 인증을 수행하지 않은 상태에서 인증된 사용자의 권한을 이용하여 웹 서버로 사용자 브라우저를 통해 웹 서버로 전송되기 때문이다.

 

XSS와의 차이

  XSS CSRF
방법 악성스크립트가 클라이언트에서 실행 권한을 도용당한 클라이언트가 가짜 요청을 보냄
원인 사용자가 특정 사이트를 신뢰 사이트가 사용자를 신뢰
대상 사용자 서버
목적 쿠키 및 세션 탈취, 피싱 사이트 유도 등 쿠키 도용

 

CSRF 실습

    • 사용자의 권한을 이용하여 password를 변경할 수 있는 csrf 로그인 폼 실습 페이지이다.

  • 패스워드 변경 요청이 어떤 형식으로 서버에 전달되어 패스워드가 변경되는 것인지 확인하기 위해 일반적인 패스워드 변경 요청을 서버에 전송하여 패스워드를 변경한 모습이다.
  • 위 그림의 URL에 보이는 것과 같이 URL에 지정된, password 파라미터에 변경할 패스워드 값이 저장되고 이를 서버에 전송하여 패스워드를 변경한다는 것을 확인할 수 있다.

 

시나리오 

  • 사용자에게 임의로 지정한 password가 포함된 password 변경 URL을 전달하여 사용자의 권한으로 사용자 본인의 의지와는 무관하게 password를 변경하여 계정 탈취를 시도하도록 한다.

  • 사용자에게 보낼 공격 이메일을 만들었다.(실습에 맞게 나 자신에게 보내는 메일이다.)
  • http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=2222&password_conf=2222&Change=Change#
    • password 변경 페이지 + 변경할 password

  • 전송한 링크를 클릭하여 해당 페이지로 이동하였지만, 비밀번호가 변경되지 않아 실패하였다.
  • 안되는 원인을 찾고자 일단, 정상적으로 로그인하여 비밀번호 변경 요청을 했을 때 서버에게 보내는 패킷을 살펴보았다. 앞에서 보낸 패킷과 지금 다시 정상적으로 보내는 패킷을 비교해봄으로써 추가 및 변동 사항을 사용자에게 보낼 URL 링크에 반영시키기 위함이다.

 

악성스크립트가 포함된 URL을 클릭하였을 때 패킷
정상적인 로그인 과정을 거쳐 변경 요청을 한 패킷

 

  • 위 두 사진을 비교해보면, 정상적인 로그인을 거쳐서 패스워드 변경 요청을 한 패킷에만 Referer 헤더가 추가되어있음을 확인하였다. 
  • referer header: 이 페이지를 요청한 이전 페이지가 무엇인지를 알려주는 정보이다. 클라이언트가 정상적인 로그인을 거쳐 들어온 페이지에서 요청한 패킷이 맞는지 확인하기위해 해당 헤더를 추가한 것으로 보인다.
  • 그래서 referer 헤더만 추가가 되면, 공격이 성공한다는 것을 알았기에 아래와 같은 방법을 생각했다
    • referer header가 추가될 수 있도록 중간에 본 서버 페이지를 한 번 거쳐야한다고 생각했다.
    • 즉, 구글 이메일 페이지 > 대상 서버의 다른 페이지 > 패드워드 변경 페이지(CSRF 실습 페이지) 이런 식으로 대상 서버의 타 페이지로 우회해서 보내도록한다.
    • 그럴러면, 대상 서버의 다른 페이지에서 자동으로 대상 서버의 패드워드 변경 페이지에 패스워드 변경 요청 패킷을 전송해야한다.
    • 그 방법 중 하나로 이미지 태그를 이용하였다. 물론 그 외 다른 방법도 많을 것이다.

 

  • 일단, 중간 페이지는 XSS 실습 페이지를 선정하였다. 그런 다음, 해당 페이지의 입력칸에
  • <img src="http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=4444&password_conf=4444&Change=Change#"/> 를 기입한 뒤, Submit를 클릭하였더니, password가 변경되어 해당 스크립트가 정상작동한다는 것을 알 수 있었다.
  • 사용자에게 파란색 박스안에 있는, 전체 url을 전달해주면 된다. 해당 url은 아래와 같다.
  • http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=%3Cimg+src%3D%22http%3A%2F%2F127.0.0.1%2FDVWA%2Fvulnerabilities%2Fcsrf%2F%3Fpassword_new%3D4444%26password_conf%3D4444%26Change%3DChange%23%22%2F%3E#
    • xss 실습 페이지에 패스워드 변경 url이 있는 이미지 태그를 name 파라미터로 삽입하여 get 메소드를 보내면, 서버가 이에 대한 응답으로 해당 이미지 태그가 삽입된 문서를 사용자에게 보낸다. 이때, 사용자 브라우저에서 해당 html 문서를 랜더링 처리하는 과정에서 이미지 태그 안에 있는 악성 스크립트 즉, 패스워드 변경 url이 실행된다. 

 

이메일 > 본서버의 xss 실습 페이지

 

본서버의 xss 실습 페이지 > csrf 실습 페이지

  • 그 결과, 패킷을 살펴보면 패스워드 변경 요청이 서버로 전송되는 것을 확인할 수 있고, 이때 Referer 필드에 설정된 값도 DVWA 의 URL로 설정된 것을 확인할 수 있다.

 

  • 그 결과, 변경된 비밀번호로 로그인 시도하였더니 성공하였다.

 

CSRF 대응 방안

    • Security Token(CSRF Token)을 사용하여 세션에 저장된 토큰값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증한다.

  • 다른 요청을 위조할 경우에는 HTTP 헤더의 Referrer가 현재 같은 도메인에서 오는 요청인지 검증하여 다른 도메인에서의 요청은 차단한다.

크롬 브라우저 쿠키 설정 탭

Secure, SameSite 속성 등을 활용한다.

  • SameSite 
    • Strict: CSRF 공격자가 타사이트에서 CSRF 요청을 공격 대상 서버로 보내더라도 사용자의 쿠키가 타사이트로 전송되지 않도록 한다.
    • Lax: 일부의 경우(http get method)에 한하여 전송 가능하도록 한다.
  • Secure
    • https 통신일 경우에만, 클라이언트가 서버로 트래픽을 전송하도록 설정한다.