pathtraversal


  • 홈페이지 접속 후 guest를 입력한 상태로 View 버튼을 누르면 아래와 같은 텍스트가 출력 됩니다.


  • /get_info 경로로 접근(GET)할 때 응답 값을 확인해보면, 아래와 같은 결과를 확인할 수 있습니다.
    • 입력 폼을 채운 후 View 버튼을 누르면, users() 함수가 호출
    • users() 함수는 get_info 경로로 POST 요청을 보내는데, 이 때 userid 파라미터가 함께 전달
    • userid 파라미터는 입력 폼에 입력된 값에 따라 0 혹은 1 값으로 설정
      • guest : 0 / admin : 1


  • admin 입력 후 View 버튼 누르면 서버로부터 아래와 같은 응답이 옵니다.


  • 문제에서 /api/flag 경로로 접근하면 플래그를 확인할 수 있다고 하였으므로, 이 경로로 접근을 해보았는데요.
    • POST 요청은 허용되지 않은 메소드로 확인 되었고,
    • 이전에 get_info POST 요청으로 획득한 정보를 활용해 보아도 401 비인가 응답이 떨어졌습니다.


  • 음.. 소스코드를 뜯어서 분석을 해보겠습니다.
  • 42라인의 get_info() 함수를 보면 POST 메소드로 요청을 보낼 때 /api/user/{userid} API를 호출하고 있습니다.
    • 이 때 userid 파라미터 값은 사용자 측에서 입력(조작)이 가능한 값입니다.
  • 추가로, flag() 함수는 /api/flag 경로로 API를 호출해서 플래그 값을 가져오는 용도로 사용됩니다.
    • 사용자가 직접 /api/flag API를 호출하는 것은 불가(401)하지만 get_info로 POST 요청은 가능합니다.
    • 따라서, POST 요청 시에 userid 값을 변조하면 서버 측에서 flag 함수를 호출해 볼 수 있겠네요.


  • POST 메소드로 get_info 경로로 요청을 보낼 때, userid 값을 아래와 같이 변조하면 플래그 획득이 가능합니다.
    • (원본) {API_HOST}/api/user/{userid}
    • (변조) {API_HOST}/api/user/{../flag}


🐛.. 🐛.. 🐛..