csrf-2

1000|1000|1000


  • VM URL로 접속하면 로그인 페이지로 접근이 됩니다.
  • 접속 계정 정보를 모르기 때문에, 바로 소스 파일을 확인해보았습니다. 1000|1000|1000

  • guest / guest 계정정보가 있으므로, 이 계정으로 로그인 해보겠습니다.
    1000|1000|1000|1000

  • “너는 관리자가 아니야” 메시지가 출력되는 걸 확인했습니다.
  • 해당 문제의 토픽이 CSRF 이기 때문에, 일반 사용자의 권한을 관리자 권한으로 상승시키거나,
  • 관리자 계정의 탈취를 시도하는 문제로 보이네요.
    1000|1000|1000

  • 소스를 더 분석해보겠습니다.
  • app.py 파일에는 change_password()라는 함수가 있는데요.
  • /change_password 경로로 GET 요청이 들어올 때, 요청을 보낸 사용자의 세션 ID를 가져오고
  • 세션 ID와 맵핑되는 계정(유저)의 패스워드를 pw 파라미터 값으로 변경하고 있습니다.
    1000|1000|1000

  • flag() 함수에서는 /flag 경로로 POST 요청이 들어오면 admin 계정의 세션을 생성하고
  • POST 요청 시 함께 입력된 param 파라미터를 check_csrf 함수에 실어 보내고 있었습니다.
    1000|1000

  • 이후 구조는 이전에 풀이했던 xss-1, xss-2 문제들과 유사한데요. (관리자를 제하면 동일)
  • (POST /flag) 경로 요청 시 입력된 param 값이 /vuln 경로로 보내지고 관리자 권한으로 실행됩니다.
    1000 1000


Proof of Concept

  • 따라서, /flag 경로에서 param 값에 악성 페이로드를 담아 보내면 되겠습니다.
    • 여기서 페이로드는 관리자의 패스워드를 변경하도록 하는 코드를 담아야 합니다.
  • (공격 페이로드) param=%3Cimg%2Fsrc%3D%22%2Fchange_password%3Fpw%3Dhacked%22%3E
    • 응답 값으로 alert("good") 팝업이 발생하면 삽입한 코드가 문제없이 실행된 것입니다.

1000|1000|1000


  • 이후 변경된 패스워드로 관리자(admin) 계정 로그인을 하면 플래그 확인이 가능합니다.
    1000|1000|1000

🐛.. 🐛.. 🐛..