Featured image of post ZAP HTTP Sessions를 통해 간편하게 세션 기반 테스팅하기

ZAP HTTP Sessions를 통해 간편하게 세션 기반 테스팅하기

ZAP에는 HTTP Sessions라는 기능이 있습니다. 이름과 옵션에 있는 내용을 보고 세션 처리 관련된 기능이구나 생각만 했지 실제로 한번도 사용해보지 않았던 기능입니다. 오늘 놓친 기능이 있을까 싶어서 메뉴를 돌아다니던 중 발견하여 테스트해봤는데 생각보다 테스팅의 불편함을 줄여줄 수 있는 부분으로 보여서 글로 소개해드리려고 합니다 :D

HTTP Sessions

HTTP Session는 이름 그래도 HTTP에서 사용하는 Session을 ZAP이 자동으로 인지하고, 이를 기반으로 다른 액션에서 사용할 수 있도록 제공하는 기능입니다. 단순히 말로만 설명하면 감이 잘 안올텐데요, 아래 순서로 한번 어떤식으로 사용하는지 보면서 이야기해보죠.

Add Session Token

먼저 HTTP Sessions에는 기본적으로 sessionid, sid, jsessionid 등 웹 서버에서 사용하는 알려진 세션 토큰 포맷은 이미 등록되어 있습니다. 여기에 또 추가로 토큰 이름을 추가할 수 있으며 추가 시 Cookie나 Header 등에서 이 포맷을 사용하는 값이 발견되면 세션으로 인지하고 처리하게 됩니다.

Options > HTTP Sessions

저는 testphp 페이지에서 테스트를 진행했고, 이 서비스에서 사용하는 login 이란 쿠키 값을 토큰 이름으로 사용했습니다 😊

HTTP Sessions Tab

자 이제 페이지를 돌아다니거나 Spidering 하면 쿠키나 헤더에 HTTP Sessions에 명시된 패턴이 있는 경우 HTTP Sessions Tab에서 도메인 선택 후 New Session를 눌러 세션 값을 얻어올 수 있습니다.

각 Record에선 우클릭으로 해당 값이 사용되는 페이지도 바로 조회할 수 있습니다.

Make User in Context

HTTP Sessions의 진가는 여기서 나타납니다. ZAP의 Context(Scope)에선 User와 Authentication, Authorization 등을 미리 등록해 Access Control 등의 테스팅을 진행할 수 있습니다.

Access Control 테스팅에 대한 내용은 지난번에 작성한 글을 참고해주세요

여기서 Users를 통해 User를 등록할 때 아까 만든 HTTP Session을 그대로 사용할 수 있습니다. HTTP Sessions를 사용하지 않았다면 쿠키기반 인증인지, 헤더기반 인증인지 또는 스크립팅으로 별도 인증 처리를 만든 후 ZAP이 자동으로 인식하도록 저장해야하는데, 이러한 과정이 모두 생략되고 아까 HTTP Sessions에 추가한 토큰 이름을 기반으로 자동으로 인식하여 사용하게 됩니다.

Next Step

Access Control Testing

이렇게 HTTP Sessions로 Context에서 Users를 등록한 경우 권한 검증 테스팅에서 잘 사용할 수 있습니다.

Authentication Spidering

ZAP에선 Authentication Spidering이라고 하여 등록한 Users를 기반으로 Spidering을 진행할 수 있습니다. 기본적으로 Login 메소드에 따라서 자동으로 로그인하고 Spidering 하지만, Users에 세션을 포함한 User가 등록된 경우 이 User의 세션을 이용해서 Spidering하게 됩니다. 결국 각 세션별로 어떤 페이지까지 접근할 수 있는지 나눠서 Spindering이 가능합니다.

https://www.hahwul.com/2021/09/07/authentication-spidering-in-zap/

ActiveScan via User

위에 Authentication Spidering과 유사하게 세션을 적용하여 Active Scan을 진행할 수 있습니다.

More

이외에도 User를 사용하는 모든 기능에서 사용이 가능합니다.

API

당연히 API로도 지원됩니다 😍

Type Name API
View activeSession (site* ) GET /httpSessions/view/activeSession/
View defaultSessionTokens GET /httpSessions/view/defaultSessionTokens/
View sessionTokens (site* ) GET /httpSessions/view/sessionTokens/
View sessions (site* session ) GET /httpSessions/view/sessions/
View sites GET /httpSessions/view/sites/
Action addDefaultSessionToken (sessionToken* tokenEnabled ) GET /httpSessions/action/addDefaultSessionToken/
Action addSessionToken (site* sessionToken* ) GET /httpSessions/action/addSessionToken/
Action createEmptySession (site* session ) GET /httpSessions/action/createEmptySession/
Action removeDefaultSessionToken (sessionToken* ) GET /httpSessions/action/removeDefaultSessionToken/
Action removeSession (site* session* ) GET /httpSessions/action/removeSession/
Action removeSessionToken (site* sessionToken* ) GET /httpSessions/action/removeSessionToken/
Action renameSession (site* oldSessionName* newSessionName* ) GET /httpSessions/action/renameSession/
Action setActiveSession (site* session* ) GET /httpSessions/action/setActiveSession/
Action setDefaultSessionTokenEnabled (sessionToken* tokenEnabled* ) GET /httpSessions/action/setDefaultSessionTokenEnabled/
Action setSessionTokenValue (site* session* sessionToken* tokenValue* ) GET /httpSessions/action/setSessionTokenValue/
Action unsetActiveSession (site* ) GET /httpSessions/action/unsetActiveSession/

Conclusion

자 HTTP Sessions에 여러분들이 테스팅하시는 서비스의 주요 쿠키나 세션 값을 미리 등록해두면 User 기반의 테스팅에서 이 값을 자동으로 불러와서 테스트할 수 있게됩니다. 불편한 작업이 많이 줄겠죠.

그리고 API나 CLI Flag 등을 이용해서 DAST 등 자동화 테스팅 환경에서 이를 기반으로 처리할 수 있도록 만들 수 있습니다. 앞단의 적당한 코드만 구성해준다면 알려진 세션을 기반으로 자동 테스팅을 수행하는데 큰 도움이 될 수 있겠네요 :D

References