여러분들은 세션에 대한 접근 권한, Authorization에 대한 부분들을 점검하실 때 어떤 형태로 테스트하시나요?
저는 보통 ZAP의 ZEST Script를 사용하거나, BurpSuite 의 Authz 확장 기능을 이용하여 테스트 하곤 합니다.
사실 ZAP에는 Access Control이란 기능이 있어서 이런 것들을 쉽게 테스트할 수 있도록 제공해주는 기능이 있는데요, 개인적으론 설정의 복잡함으로 인해 잘 사용하지 않았었던 기능입니다.
막상 사용해보니 다수의 권한을 체크하는데 있어서는 정말 좋은 도구로 보여서 오늘 정리하여 소개드릴까 합니다.
Session in ZAP
Access-Control을 알아보기 전에 ZAP의 Session에 대해 간단하게 정리하고 가는게 좋을 것 같습니다. ZAP에서의 Session은 크게 2가지 의미를 가지는 동음이의어인데요, 첫번째는 Context(Scope)를 포함한 현재 ZAP의 세션을 의미하고 두번째는 ZAP의 Context(Scope)에서 세션을 식별하고 관리하는 방법, 즉 HTTP Session을 의미합니다.
이 이야기를 하는 이유는 오늘 우리가 사용할 Access Control 기능이 첫번째 의미의 Session에 포함되는 기능이기 때문입니다. 모든 설정은 Session Properties에서 세팅할 수 있으니 아래 버튼을 통해 Session Properties 창을 열어줍시다.
여기서 Contexts의 하위 Context에서 진행하게 되며, 이는 일반적으로 Scope를 추가 하듯이 Context를 먼저 추가하고 해당 Context에서 대한 세션 설정을 진행 하셔도 됩니다.
Access Control Testing
ZAP의 Access Control은 각 세션의 Context 내 Authentication, Authorization 등을 이용하여 User를 생성한 후 해당 User의 정보를 기반으로 자동화 테스팅(Access Control Testing)을 진행할 수 있습니다.
Process of Access Control Testing
Access Control Testing은 크게 4개의 플로우로 구성됩니다.
1) Context 내 사용자와 인증방법 정의 2) Context 내 Authorized/Unauthorized 정의 3) 페이지 탐색 (Manual Explore, Spider, Ajax spider, etc…) 4) Access Control Tab을 통해 테스트
1,2 과정은 위에서 이야기한 Session Properties에서 진행되니 하나하나 설정해봅시다.
Settings
Authentication
의미 그대로 인증 방법을 의미합니다. Authentication Method는 5개로 정의되어 있으며 아래와 같습니다.
Method | Description |
---|---|
Manual Authentication | 자동으로 인증을 수행하지 않아요. |
Form-base Authentication | Login URL, Form 정보를 이용하여 인증을 수행합니다. |
HTTP, NTLM Authentication | HTTP Auth를 이용해 인증을 수행합니다. |
Script-base Authentication | 스크립트를 이용해 인증을 수행합니다. (ZAP Script) |
JSON-base Authentication | Form과 비슷합니다. 다만 Body가 JSON 😁 |
그리고 Authentication Verification을 아래 정보들을 기반으로 지정할 수 있는데, 이를 이용해서 주기적으로 로그인 되었는지, 로그아웃 되었는지 체크합니다.
- Verification Strategy (언제 체크할지)
- Regex pattern used to identify Logged in messages (로그인 메시지 정규식)
- Regex pattern used to identify Logged out messages (로그아웃 메시지 정규식)
- Poll Frequency (URL/DATA 등 HTTP Request를 위한 정보)
Authorization
동일하게 뜻 그대로 인가를 의미하고, authorized/unauthorized 요청을 식별하기 위해 설정 값을 넣어주면 인가된 요청과 비인가된 요청을 자동으로 매치해서 식별할 수 있습니다.
- HTTP Status Code (HTTP 코드, e.g 200 403 404 등..)
- Header contains regex (헤더 정규식)
- Body contains regex (Body 정규식)
Users
위 Authentication과 Authorization을 기반으로 사용자 정보를 생성하고 관리합니다. 추가 시 Authentication 정보를 넣어줘서 자동으로 인증을 수행하게 할 수 있고, 실제로 인가되었는지 Authorization의 정보를 이용해서 확인합니다.
Access Control
위 입력한 정보를 바탕으로 계정 별 인증 방법을 통해 페이지에 접근 시 Authorized / Unauthorized 될 URL(이 때 해당 URL은 Context에 추가된 URL만 가능하니 대상 도메인의 Scope를 추가해줍시다)을 미리 지정할 수 있습니다. 여기서 Unauthorized(실제 인증을 사용하지 않는 케이스)와 각 계정 별 접근 정책을 따로 설정해줘야합니다. 그리고 여기에 설정한 내용이 이후 Access Control Testing 에서 사용됩니다.
이 때 지정할 수 있는 정책의 Type은 3가지가 있는데 아래와 같습니다.
- Allowed: 접근할 수 있음
- Denied: 접근할 수 없음
- Unknown: 정보 없음
페이지 탐색
Manual Explore, Spider, Ajax Spider 등을 통해 ZAP에 URL을 수집해줍시다. 보통 Proxy를 연결한 상태로 분석을 하니 아마 많이 쌓여있겠죠? 😊
그리고 User를 추가했다면 Authentication Spidering을 진행할 수 있습니다. 자세한 내용은 아래 글을 참고해주세요 :D
Authentication Spidering in ZAP
Automation testing
이제 하단 탭에서 Access Control을 열어줍시다.
이제 자동으로 스캐닝을 진행할껀데, Context를 지정해주시고(저는 그냥 default에다가 추가해둬서 default로 진행합니다) 화살표를 눌러 Access Control scan options
를 열어줍시다.
화면에 제가 만든 User들이 노출되는데요, 여기서 테스팅할 부분들만 체크한 후 Start를 눌러 스캔을 진행해주시면 됩니다.
아래 Raise alerts for identified issues
는 아까 Session Properties 의 Access Control에서 지정한 예상되는 결과와 다른 경우 ZAP의 alert 탭으로 보내주는 역할을 하며, 아래 Risk level for raised alerts
은 alert 탭으로 보낼때의 risk 등급을 의미합니다.
진행 시 각 계정 정보를 기반으로 요청 시 어떤 Response가 도착했고, 예상되는 결과와 다른지 확인 후 사용자에게 알려줍니다. Access Control에서 예상되는 결과를 명확하게 지정 하셨다면 Result 컬럼만 보셔도 정확합니다. 😎
Conclusion
잘 안썼던 기능인데 주중에 이것저것 테스트하다가 괜찮아 보여서 어제/오늘 한번 열심히 테스트해봤는데요. 생각보다 좋은 기능인 것 같습니다. 지금까지 왜 잘 안썼는지 후회되기도 하네요. 어쨌던 단순히 세션간의 보안 취약점을 식별하기 위한 테스팅 목적으로도 쓸 수 있지만 컴플라이언스 대응을 위해서 간혹 다수의 계정 별로 권한 테스트가 필요한 경우들이 있는데 이 때 정말 유용하게 사용될 것 같습니다.
앞으로도 ZAP에서 기존 기능들 또는 새로운 기능들 중 쓸만 하다고 판단되면 바로바로 블로그 통해서 공유드릴게요 :D
References
- https://www.zaproxy.org/docs/desktop/addons/access-control-testing/
- https://www.zaproxy.org/docs/desktop/start/features/authmethods/