서명과 관련된 범죄는 서명을 날조하거나, 서명된 문서를 위조하는 것 등이 있다. 이러한 범죄는 웹 해킹의 공격 기법들과도 대응된다. 전자는 쿠키를 탈취하는 XSS 공격과, 그리고 후자는 CSRF와 비슷하다. 서명된 문서를 위조하는 것은, 이미 서명된 문서의 내용을 조작하는 것을 말한다.
CSRF는 이와 비슷하게 이용자를 속여서 의도치 않은 요청에 동의하게 하는 공격을 말한다. 그럴듯한 웹 페이지를 만들어서 이용자의 입력을 유도하고, 이용자가 값을 입력하면 이를 은행이나 중요 포털 사이트 등으로 전송하여 마치 이용자가 동의한 것 같은 요청을 발생하시킨다. 만약 이용자가 “자동 로그인” 등의 기능을 사용하여 브라우저에 세션 쿠키를 저장하고 있었다면, 실제로 계좌 이체가 발생하거나 비밀번호 초기화가 이루어질 수 있다.
1) CSRF 이해하기
교차 사이트 요청 위조(Cross Site Request Forgery, CSRF)는 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점이다. 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있다. 예를 들어, 이용자의 계정으로 임의 금액을 송금해 금전적인 이득을 취하거나 비밀번호를 변경해 계정을 탈취하고, 관리자 계정을 공격해 공지사항 작성 등으로 혼란을 야기할 수 있다.
2) CSRF 동작
CSRF 공격 스크립트는 HTML 또는 javascript를 통해 작성할 수 있는데 이미지를 불러오는 img 태그를 사용하거나 웹 페이지에 입력된 양식을 전송하는 form 태그를 사용하는 방법이 있다. 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookies에 이용자의 인증 정보가 포함된다.
HTML img 태그 공격 코드 예시
<img src='<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>' width=0px height=0px>
Javascript 공격 코드 예시
/* 새 창 띄우기 */
window.open('<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>');
/* 현재 창 주소 옮기기 */
location.href = '<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>';
location.replace('<http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337>');
XSS와 CSRF는 스크립트를 웹 페이지에 작성해 공격한다는 점에서 매우 유사하다. 그렇다면 두 취약점의 공통점과 차이점을 알아보도록 하자.
1) 공통점