[Portswigger] Access Control
접근제어 기술은 접근할 권한을 판단하여 제약조건을 다르게 적용하는 기술입니다.
인증 : 사용자가 자신이 누구인지 확인
세션관리 : 동일한 사용자가 어떤 후속 HTTP 요청을 하는지 식별
접근제어 : 사용자가 수행하려는 작업을 수핼할 수 있는지 여부를 결정
수직적 권한 상승
사용자가 접근이 허용되지 않는 기능에 접근할 수 있는 경우 수직적 권한 상승입니다. 예를들면 관리자가 아닌 사용자가 사용자 계정을 삭제할 수 있는 관리자 페이지에 접근할 수 있는 경우 이는 수직적 권한 상승으로 볼 수 있습니다.
가장 기본적인 수직적 권한 상승은 애플리케이션이 민감한 기능에 대해서 보호를 시행하지 않는 경우에 발생합니다. 예를 들어 관리자 페이지의 URL을 알 수 있다면 URL을 찾아서 관리자 기능에 접근할 수 있습니다.
예시) 개인 구현 게시판 - 일반적인 페이지에서 URL을 이용한 관리자 페이지 접근
관리자 URL에 접근하면 별다른 인증 없이 관리자 페이지에 접근할 수 있습니다.
해당 위치는 https://example.com/robots.txt 파일과 같은 곳에 공개될 수 있습니다.
해당 개념을 이해하기 위해서 직접 실습해보겠습니다.
실습 페이지에 접근하면 아래와 같은 페이지를 확인할 수 있습니다.
우선 실습의 경우 관리자 페이지가 노출되는지 확인하는 예제이기 때문에 관리자 페이지를 직접 맞추거나 알아내는 방법 밖에 없습니다. 따라서 기존에 힌트인 robots.txt를 이용해서 관리자 페이지를 알아내려고 합니다.
이 단서를 바탕으로 관리자 페이지의 경로를 알 수 있었고 URL을 이용한 직접 접근을 시도합니다.
해당 페이지에 접근하면 문제가 해결되는 것을 확인할 수 있습니다.
위의 문제는 robots.txt를 이용해서 관리자 페이지에 대한 단서를 얻은 경우이지만 또 다른 방법으로 단서를 얻을 수 있습니다. html요소 혹은 JS를 통해서도 관리자 페이지의 URL을 확인할 수 있습니다.
해당 사례를 익히기 위해서 실습페이지에 접근하였습니다. 이후 개발자 도구를 이용해서 html 요소를 확인하였습니다.
해당 방법을 통해서 관리자 페이지의 위치를 확인해보겠습니다.
확인 결과 관리자 페이지의 위치는
/admin-9zl86x 인 것을 확인하였습니다. 실제로 맞는지 확인해봅니다.
실제로 경로가 맞았고, Users에 있는 계정들을 삭제했을 때 문제가 해결되는 것을 확인할 수 있었습니다.
세번째로 얻을 수 있는 정보는 파라미터(매개변수)를 통한 정보 획득입니다.
https://insecure-website.com/login/home.jsp?admin=true
https://insecure-website.com/login/home.jsp?role=1
해당 링크는 실제로 매개 변수를 통해서 정보를 얻을 수 있는 예제입니다.
해당 방법에 대해서도 실습 페이지에서 확인해보겠습니다. 우선 파라미터가 전달되는 페이지가 어디인지 확인하였는데, 이는 로그인 페이지입니다. 따라서 이 부분이 관련이 있다고 생각해였습니다. 계정은 받은 정보를 이용하여 wiener:peter를 입력합니다.
id는 파라미터를 통해 받는것을 확인할 수 있었고, 해당 아이디는 쿠키를 통해서 확인해보면 관리자 페이지에 대한 접근권한이 없는 것을 확인할 수 있었습니다.
접근 권한이 false로 되어있기 때문에 임의로 true로 수정한 후 관리자 페이지에 접근을 시도하면 정상적으로 접근되는 것을 확인할 수 있습니다.
이후 해당 계정을 삭제하면 문제가 해결되는것을 확인할 수 있습니다.
이번에는 수평적 권한 상승입니다.
수평적 권한상승이란 서로 사용자인데 파라미터 조작을 이용하여 서로의 게시글에 대한 수정 및 삭제권한을 갖는 경우 수평적 권한상승이라 할 수 있습니다.
https://insecure-website.com/myaccount?id=123
대표적인 예시로는 자신의 게시글을 수정할 때 id값을 조작하여 다른 사람의 게시글에 조작하는 사례입니다.
예시) 개인 구현 게시판 - 파라미터 조작을 이용하여 타 사용자의 게시글 수정
해당 권한 상승에 대해서 예제를 확인하겠습니다.
이번 문제는 carlos 계정으로 API키를 제출하는 문제입니다. carlos의 게시글을 확인합니다.
이후 카를로스 게시글을 확인할 때 웹 프록시 도구를 이용하여 해당 계정의 GUID를 알아냅니다.
이후 wiener로 로그인 하여 GUID를 확인하고 carlos의 GUID로 변경해줍니다.
이후 확인해보면 username이 carlos로 변경된 것을 확인할 수 있고 API키를 입력하면 문제가 해결됩니다.
이후 API키를 제출하면 아래와같이 문제가 해결된 것을 확인할 수 있습니다.
마지막으로 수평에서 수직적 권한상승입니다.
수평적 권한상승을 이용하여 관리자 계정 페이지에 대한 접근 제어를 우회할 수 있습니다.
주어진 계정정보를 이용하여 로그인 후 관리자 계정인 admin administrator등을 프록시 도구로 시도하였습니다. 웹 프록시 도구를 이용하여 wiener를 administrator로 변조 후 정보를 확인합니다.
이후 응답을 확인하면 비밀번호를 알아낼 수 있습니다.
다시 계정 접속으로 돌아와서 접속 후 Admin panel에 접속하면 문제를 해결할 수 있습니다.
요약
접근제어 기술은 접근할 권한을 판단하여 제약조건을 다르게 적용하는 기술입니다.
인증 : 사용자가 자신이 누구인지 확인
세션관리 : 동일한 사용자가 어떤 후속 HTTP 요청을 하는지 식별
접근제어 : 사용자가 수행하려는 작업을 수핼할 수 있는지 여부를 결정
해당 문제들을 요약해보면
수직적 권한상승
- URL을 이용한 접근
- 자바스크립트와 같은 요소를 이용한 접근
- 파라미터를 이용한 접근
수평적 권한상승
- 파라미터를 이용한 접근
수평적 수직적 권한상승
- 파라미터를 이용한 접근