TeamH4C

[빡공팟 5기] W6 : DVWA 실습 - CSRF (medium)

이유갬 2022. 10. 30. 23:18

[  실습 목표  ]

our task is to make the current user change their own password, without them knowing about their actions, using a CSRF attack.

이번 실습의 목표는 사용자가 자신의 행동을 알지 못하는 상태에서 CSRF 공격으로 자신의 암호를 변경하도록 만드는 것이다.


[  실습 화면  ]

- 위의 사진은 초기화면이다.

- 개발자 도구를 이용하여 html 코드를 확인해보았다.

- GET 메소드를 이용한다. -> 파라미터에 집중해보자.

- 버프 스위트를 통해 패킷을 잡아보자!

- 쿠키는 PHPSESSID 와 security 로 셋팅되어 있다.

- 그리고 파라미터를 통해 password_new, password_conf, Change 를 전달한다.

- Low 레벨과 마찬가지로 기존 비밀번호 확인도 없고 최근 유저의 쿠키를 이용하여 비밀번호를 변경한다.

- 그러나 Low와 다른 점은 Referer 라는 항목이 추가되어 있다.

Referer :
요청 헤더는 현재 요청을 보낸 페이지의 절대 혹은 부분 주소를 포함한다.
링크를 타고 들어왔다면 해당 링크를 포함하고 있는 페이지의 주소가,
다른 도메인에 리소스 요청을 보내는 경우라면 해당 리소스를 사용하는 페이지의 주소가 이 헤더에 포함된다.

- Referer 는 요청이 현재 페이지에서 오는지 확인하는 기능을 하는 것으로 볼 수 있다. -> 외부에서 URL 을 눌러 발생하는 공격을 막기 위한 조치로 보인다.

- 이제 소스 코드를 확인해보자!

- 소스 코드를 확인해보니 stripos 를 통해서 HTTP_REFERER 와 SERVER_NAME 을 비교하고 비밀번호 변경을 하는 것으로 보인다.

- stripos() 함수에 대해 검색해보았다.

- SERVER_NAME 과 HTTP_REFERER 를 비교하는데 같은 문자열이 나오면 시작 인덱스를 리턴하는 함수이다.

- 만약 같은 문자열이 존재하지 않으면 false 를 리턴하는데 그래서 소스코드에 !== false 가 존재하는 것 같다.

- 이 함수는 그저 같은 문자열만 나오면 통과이기 때문에 이것도 취약점의 이유 중 하나라고 생각한다.

- 같은 문자열이 나오지 않으면 <pre>That request didn't look correct.</pre> 의 문구가 출력된다.

- 리퍼러 부분을 어떻게 조작할 수 있을까?

- 패킷을 잡고 조작하기에는 CSRF 공격은 악성 페이지나 URL 을 사용자가 누르게 해놓기 때문에 실시간으로 패킷을 잡아서 조작할 수가 없다.

- 리퍼러 정책에 대해 더 자세히 알 필요가 있는 것 같다.

- 악의적인 HTML 을 생성하고 비밀번호를 변경할 사이트의 주소를 삽입만 하면 되는 줄 알았는데 리퍼러 정책이 생기면서 URL의 뒤의 내용이 다 잘리게 된다고 한다. 하지만 HTML 의 Referrer-policy 를 이용하여 옵션을 줄 수 있다.

- unsafe-url 의 옵션을 주어 모든 URL 정보를 전송해버린다.

- 이제 악의적인 웹 페이지를 만들어 비밀번호를 변경해보자.

- 위와 같이 웹 페이지를 생성하고 필자의 웹 사이트에 올려보고 접속해보았다.

- 오잉 실패했다.

- 문법에 오류가 있나 싶어 확인해보았다.

- 리퍼러가 맞지 않아서 That request didn't look correct. 문구가 출력되었다.

- 왜 되지 않는지 한번 패킷을 잡아보았더니 리퍼러가 현재 필자의 사이트로 되어있다.

- URL 이 잘리지 않는 것에만 집중하다보니 리퍼러 변경을 까먹고 있었다.

- 악의적인 웹 페이지의 이름에 Host IP 를 넣으면 된다.

- 파일명에 해당 호스트 아이피 주소를 삽입했다.

- 패스워드 변경에 성공했다!

- 이번 실습은 리퍼러 정책을 알고 옵션을 주는 것과 그저 같은 문자열만 나오면 되는 취약한 함수를 이용하여 파일 이름에 Host IP 만 삽입하면 되는 실습이였다!