[WebGoat] (A1)-3. Missing Function Level Access Control

신지훈·2025년 5월 30일

WebGoat(웹 해킹)

목록 보기
3/8
post-thumbnail

1. Missing Function Level Access Control

이 취약점은 말 그래로 기능에 대한 액세스 제어 누락이다. 이는 IDOR취약점과 혼동할 수 있는데 IDOR은 다른 사용자의 데이터에 접근하는 것에 초점이 맞춰져 있다. 반면 Missing Function Level Access Control은 관리자만 사용할 수 있는 기능을 사용함으로써 취약점이 발생한다. 이 취약점은 백엔드에서 사용자의 접근 권한에 대한 검증을 제대로 수행하지 않았을 경우 발생하며 실습을 통해 살펴보자.

2. 모의 해킹 실습

1. 숨겨진 아이템 찾기

개발자가 자주하는 실수 중 하나가 사용권한이 없는 기능을 프런트엔드에서 잘 숨기면 충분하다고 생각하는 것이다. 이럴 경우 프런트엔드의 코드는 개발자 도구를 통해 모든 사용자들이 확인하고 수정할 수 있어 충분히 우회할 수 있다.

그럼 이렇게 프런트엔드의 코드의 html, css코드등을 살펴보고 숨겨진 기능을 찾아보자.

먼저 개발자 도구의 기능을 통해 네비게이션바에 대한 소스코드를 살펴보자 다음과 같이 버튼을 통해 원하는 곳의 코드를 확인할 수 있다.

네비게이션바에는 Account, Messages 2개의 항목이 있는데 코드를 보니 보이지 않던 하나의 기능이 있는 것을 확인할 수 있다. 이 블록의 css코드를 보니 오른쪽과 같이 visibility : hidden으로 hidden-menu-item 클래스에 적용되어 있는 것을 확인할 수 있따.

따라서 해당 클래스의 이름에서 hidden-mene-item를 삭제해주면 다음과 같이 Admin버튼을 볼 수 있다.

그리고 이 Admin기능에 숨겨져 있는 Users와 Config를 입력하면 첫 번째 단계를 통과할 수 있다.

2. 다른 사용자 정보 찾기

그럼 숨겨진 기능을 활용하여 다른 사용자의 정보를 찾아보자. 먼저 첫 번째 Users를 눌러보자.

그럼 페이지를 찾을 수 없다는 화면이 나오는데 brup suite를 통해 요청 기록들을 살펴보자. 자세히 보니 Users버튼을 눌러 요청을 제외하고는 앞에 /WebGoat가 붙어 있는 것을 확인할 수 있다.

그럼 Users를 통해 보낸 요청앞에도 /WebGoat를 붙여볼까? 라는 생각을 할 수 있고 이대로 요청을 보내면 이번엔 error page가 뜨는 것을 확인할 수 있다

이 에러의 원인은 WebGoat github에 가서 코드를 직접살펴보니 아래와 같은 코드가 있는 것을 확인할 수 있다. 이는 Content-Type : application/json이어야 한다는 것이다.

따라서 Reapeater를 이용해서 Content-Type 헤더를 추가해보자.

다음과 같이 적절한 헤더를 추가하고 요청을 보내면 모든 사용자의 정보를 확인하 수 있고, 여기서 Jerry라는 admin권한을 가진 사용자의 userHash를 정보를 정답칸에 입력하면 2번째 단계도 통과할 수 있다.

3. 긴급조치에서 사용자 정보 알아내기

이번에는 우리가 다른 사용자의 정보를 조회할 수 있다는 문제점을 발견하여 긴급조치를 하여 관리자가 아닌 일반사용자는 데이터를 조회할 수 없도록 막았다고 한다.

그 기능이 2번째에 있던 Users로 이전에 다른 사용자의 정보를 조회했던 것처럼 조회를 해보자.

이전과 같은 방법으로 조회했을 경우 긴급조치로 인해 기능이 forbidden되어 있는 것을 확인할 수 있다.

그럼 이제 관리자의 권한을 가진 경우에만 해당 기능을 조회할 수 있게 되었고 이젠 어떻게 정보를 조회할 수 있을까? 이전 문제를 해결하면서 실제로 로그인한 사용자의 정보는 없었다. 현재는 로그인한 정보가 없기 때문에 접근권한이 없어 조회가 되지 않았고 정보를 조회를 하기 위해서 접근 권한을 얻어야 하는데 어떻게 얻을 수 있을까?

바로 다음과 같이 Post로 새로운 사용자를 추가하는 것이다. 새로운 사용자 데이터는 이전에 다른 사용자의 정보를 조회했을 때 나왔던 형식을 빌려 그대로 작성하였고, 여기서 admin은 true설정하여 요청했을 때 정상적으로 처리되는 것을 확인할 수 있다.

그리고 다시 GET으로 조회하게 되면 다른 사용자의 데이터를 조회할 수 있게 된다.

왜 이렇게 새로운 데이터를 넣었을 때 다른 사용자의 정보를 조회할 수 있게 되는 것일까?

**왁벽히 이해되지 않아서 제가 이해한대로 작성했지만 잘못된 정보가 있다면 적극적으로 알려주세요**

POST로 새로운 사용자를 등록하게 되면 Cookie에 있는 JESSIONID를 이용하여 session에 사용자의 정보를 등록하게 된다.

그 후 다시 조회를 해보면 다음 코드에서처럼 JESSIONID에 맞는 Session에서 유저 정보를 조회해오고 실제로 admin권한을 가진 사용자를 등록했기 때문에 다른 사용자의 데이터가 조회되는 것 같다.

3. 정리

  1. 프론트에 hidden기능으로 버튼을 숨기는건 위험하다.

  2. 숨겨진 기능을 통해 사용자의 정보를 조회할 수 있었다.

  3. 위 취약점에 대한 긴급조치에서는 admin 권한을 가진 사용자를 만들면서 관리자 권한을 얻어 다른 사용자의 정보를 조회할 수 있었다.

이럴 경우 admin권한을 사용자를 만들 땐 admin권한을 가진 사용자만 만들 수 있도록 하는 등의 사용자의 접근 제어가 잘 이루어져야한다. 이처럼 각 기능에 대해서 사용자의 권한에 따른 접근 제어가 꼼꼼히 이루어져야 함을 느낄 수 있었다.

profile
주주주주니어 개발자

0개의 댓글