[Root Me] CSRF - 0 protection 웹 해킹
문제 설명
CSRF: 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점
-> XSS와 CSRF
공통점: 두 개의 취약점은 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도해야 한다. 스크립트를 웹 페이지에 작성해 공격한다는 점에서 매우 유사하다.
차이점: 두 개의 취약점은 공격에 있어 서로 다른 목적을 가짐. XSS는 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격이며, 공격할 사이트의 오리진에서 스크립트를 실행시킨다. CSRF는 공격자가 다른 사용자의 HTTP 요청을 위조하는 공격이고, 이를 이용하여 사용자의 권한으로 악성 작업을 수행함
문제 풀이
첫 화면은 이렇게 뜬다. 레지스터에서 계정을 만들고 로그인 해보겠다.
로그인하여 프로필 칸으로 왔더니 뭔가 status 를 눌러서 submit 하면 될 것 같아서 개발자 도구를 켰다.
html 요소에 들어가서 disabled 부분을 삭제 해주고 눌러보니 어드민이 아니라고 뜬다. 어드민이 되기 위해선 프로필이 아니라 콘택트 페이지에 들어가서 메일을 써야할 것 같다.
역시 글을 하나 써봤더니 어드민이 확인할 것이라는 문구가 뜬다.
근데 어떻게 스크립트를 짜야할지 모르겠어서 다시 프로필 페이지로 돌아가서 개발자 도구를 켜봤다.
username, status 두 개의 파라미터를 ?action=profile 로 보내는 형식이다.
그럼 이 파라미터를 전달해주는 코드를 짜보면 이렇게 나온다. (혼자서는 절대 못 짤듯..ㅎ 공부 좀 해야겟다)
<form id="autosubmit" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post">
<input type="text" name="username" value="가입할 때 사용한 아이디">
<input type="checkbox" name="status" checked>
</form>
<script>
document.getElementById("autosubmit").submit();
</script>
*document.getElementById("autosubmit").submit();는 HTML 문서에서 id가 "autosubmit"인 폼을 찾고, 해당 폼을 자동으로 제출하는 JavaScript 코드이다. <input type="checkbox" name="status" checked>에서 checked 속성을 준 이유는 체크된 체크박스만 폼에서 전달이 되기 때문이고 value를 따로 설정해두지 않았기에 기본값인 on이 전달된다.
이메일엔 아무거나 쓰고 username에 아까 가입한 ian을 적어서 서브밋 해주고 private 페이지로 가봤다.
플래그 발견 성공!
문제 해결