📌인가 (Authorization)

DATE : 2024/2/22

What is Authorization?

인가란, 사용자마다 그 사람에게 알맞은 특정 권한을 부여하는 걸 의미한다.

흔한 커뮤니티 사이트에 새싹, 가지, 열매, 나무 라는 등급이 있다고 상상해보자.

각 등급 간에는 특정 게시판에 글을 작성할 수 있는 권한 유무가 다르다고 한다.

만약 A의 등급이 새싹이라면 일반 게시판에서만 활동을 할 수 있어야 하고

B의 등급이 나무라면 모든 게시판에서 활동이 자유자재일 것이다.

그.런.데

A가 만약 나무 등급인 사용자만 접근 가능한 게시판에 글을 작성하거나 수정하거나 삭제할 수 있다면..?!

이는 새싹 등급인 사용자가 나무 등급의 권한으로 실행할 수 있는 기능을 수행한 것이기 때문에

이런 경우를 인가 취약점이라고 말한다.

이처럼 원래는 하지 못해야 하는 걸 할 수 있게 되는 경우인가 취약점으로 정의한다.

앞서 살펴봤던 인증과 마찬가지로 대표적인 인가 취약점 사례를 살펴보자.

1) 주석으로 접근을 제한하는 경우

주석이나 CSS(display: none)를 활용해 특정 사용자에게만 특정 요소가 보이도록 처리하는 경우,

이는 주석 또는 속성을 제거하기만 해도 숨겨진 내용이 화면에 출력된다..!

2) 인가를 Client 측에서 하고 있는 경우

권한을 확인하고 검사하고 검증하는 Client 측에서 할 게 아니라 서버 측에서 처리해야 하는 업무이다.

하지만 Front-end에서 뭐라도 더 해보겠다고 JS로 인가 여부를 확인하는 등의 처리를 해버리면 문제가

생길 수 있다.

"인가를 서버가 처리하는 게 아니다"라는 건 Client 측 어딘가에 인가 여부를 판단하는 코드가

작성되어 있다는 뜻이다. 따라서 실행되는 코드를 찾아내게 되면 분석을 통해 의도하지 않았던 권한을

얻을 수도 있다..! (물론 실행되는 코드를 찾아낼 수 있어야 한다!)

3) Guessing 공격

눈에 보이는 게 전부는 아니기 때문에 숨겨진 directory나 element(ex. button)를 찾아내기 위해서

대게 사용하는 directory 이름이나 URL에 나와 있는 파라미터를 보고

"이런 경로가 있나? 이런 파일이 있나? 이런 파라미터를 보내면 어떻게 동작하지??"와 같이

예측을 통해 부여되지 않은 거처럼 보였던 기능(권한)을 얻게 되는 케이스이다.

4) Parameter 변조

인가 취약점을 다룰 때 자주 사용되는 기법으로

예를 들어 관리자가 관리하는 게시물이 있다고 할 때, 일반 사용자가 자신의 계정을 글을 쓴 다음

post_update.php?postId=1019

=> post_update.php?postId=1018

수정 페이지로 접속하는 과정에서 postId를 관리자 게시물의 아이디로 변조하는 식이다.

관리자 게시물에 들어가는 건 제한되는 상황일지라도 이렇게 자신의 게시물을 수정하는 경로를 통해

id로 관리자 게시물 내용을 불러오게 되면 관리자 게시물 내용을 읽거나 수정할 수 있게 된다.

이렇게 해서 인가에 관한 내용을 간단하게 정리해보았다.

인가와 관련된 예시도 추가적으로 살펴볼 예정이다! 인가 취약점 예시

인증과 인가 취약점은 같이 일어나는 경우도 있고 개념 자체가 크게 동떨어져 있지 않다 보니

어떤 취약점을 찾았을 때, "이걸 인증 취약점으로 다룰 것인가! 인가 취약점으로 다룰 것인가!" 하는

고민이 생길 수도 있다!!

굳이 굳이 칼같이 이건 인증! 이건 인가!로 구분할 필요는 없지만

(왜 해당 취약점으로 잡아냈는지 설명만 할 수 있다면!)

그럴 때는 어떤 경우를 인가 & 인증 취약점으로 정의 했는지 보거나 대응 방안에 초점을 두고 보면

조금은 구분이 쉬워질 것이다. 🤗

Last updated