Portswigger-URL-based access control can be circumvented
풀이
admin 페이지에 /admin 경로로 접속할 수 있다. 하지만 프론트엔드 시스템이 해당 경로에 대한 외부 액세스를 차단하도록 구성되어있다. 하지만 백엔드 어플리케이션은 X-Original-URL 헤더를 지원하는 프레임워크 위에 만들어졌다. admin 페이지에 접근하여 carlos를 삭제하라.

접속하면 Admin Panel 메뉴가 있다.

그냥 접속하면 Access denied 에러를 반환한다.

로그인 버튼을 눌러 패킷을 생성하고, X-Original-URL 헤더에 /admin을 입력한다.

admin 페이지에 접근할 수 있다. 하지만 이 상태에서 화면에 보이는 Delete를 눌러 삭제 요청을 하면 Access denied 에러를 반환한다. 다시 X-Original-URL 헤더를 이용해 요청한다. Delete를 누르면 GET /admin/delete?username=carlos 요청을 보낸다. 정상적으로 접근 가능한 곳으로 향하는 패킷을 하나 생성하고, 이 URL을 X-Original-URL 헤더에 지정해 보낸다.

위와 같이 보내면 이렇게 Missing parameter 'username' 에러가 발생한다. GET 파라미터는 X-Original-URL로 전달이 안되는 것 같다.

요청 경로를 파라미터를 포함한 /login?username=carlos와 같은 경로로 지정한다. X-Original-URL에서는 파라미터를 삭제해도 괜찮다.

파라미터를 경로에 지정하면 해당 파라미터는 그대로 경로만 X-Original-URL로 재지정한다. 이렇게 carlos를 삭제하면 성공이다.
이 취약점은 앞단의 서버에서 URL에 대한 접근 제어는 하지만, 더 뒤에있는 서버에서 X-Original-URL로 경로를 재지정할 수 있어 이를 통해 우회할 수 있었기에 발생했다. 뒤에 있는 서버에서도 X-Original-URL를 처리한 후 접근 제어를 다시 해야했다.
tags: writeup, access control vulnerability, wstg-athz-02, wstg-athz-03, web hacking