https://dreamhack.io/wargame/challenges/442
CSRF는 요청을 변조하여 클라이언트를 공격할 수 있는 취약점이다.
해당 문제에서 취약점이 발생하는 부분인데, CSRF를 방지하기 위해 토큰을 생성하는 코드에서 CSRF 토큰 생성 알고리즘이 키 값에 대해 고정된 CSRF 토큰을 생성하는 데에 문제가 있다. 예시를 들면, dolephine 계정으로 192.168.0.100에서 로그인 시, “dolephine192.168.0.100” 문자열을 MD5로 해싱한 값을 토큰으로 사용한다. 계정과 IP에 대해 고정된 값을 저장하니, 로그아웃하고 다시 로그인해도 동일한 값을 토큰으로 사용하는 것이다.

해당 문제는 웹 봇이 admin 계정과 127.0.0.1에서 접속을 하니 쉽게 토큰 값을 구할 수 있다. 아래는 웹 봇이 사용할 토큰 값을 구하는 코드이다.

플래그를 구하기 위해선 admin 계정에 로그인을 해야 하지만, 패스워드를 알 수 없으므로 CSRF 공격을 통해 admin의 패스워드를 변경해야 한다. 패스워드를 변경하는 /change_password 페이지를 보면 GET 메서드로 csrftoken을 검증하고, pw로 입력된 값으로 패스워드를 변경한다. 여기서 발생하는 요청을 변조하여 웹 봇이 해당 요청을 전송하면 admin의 패스워드는 내가 원하는 값으로 변경할 수 있다.

CSRF 공격을 수행하기 위한 취약한 페이지다. 자바스크립트를 막기 위해 필터링이 되어 있지만 HTML 태그들은 사용할 수 있으므로 공격이 가능하다.

공격을 위한 페이로드를 생성한다. 해당 페이로드는 <img> 태그에서 src 속성으로 지정된 URL을 자동으로 로드한다. 그리고 그 URL은 패스워드를 변경하는 요청이다. 즉, 웹 봇은 취약한 페이지에 접속하면 CSRF 코드가 담긴 이미지를 자동으로 로드하므로 /change_password 페이지에서 패스워드를 변경하는 요청을 보내게 되는 것이다. 해당 요청은 패스워드를 admin으로 변경한다.
<img src="http://127.0.0.1:8000/change_password?pw=admin&csrftoken=7505b9c72ab4aa94b1a4ed7b207b67fb">
이제 로그인을 username: admin && password: admin으로 하면 된다. 그러면 Home에서 플래그를 확인할 수 있다.
