Hacking_study/해킹과제

인증/인가 취약점

jin_li 2023. 6. 15. 23:38
인증 : 그 사람이 맞는 지 확인하는 작업(ex. 로그인 인증 / otp인증 / 2차 로그인 인증 등..)
인증 취약점 : 인증을 우회할 수 있는 취약점.

인가 : 허락된 사람에게 어떤 권한을 부여하는 것
인가 취약점 : 권한이 없는데 권한 있는 사람과 같은 일을 할 수 있는 부분(ex. 파라미터 변조 / 쿠키 변조)

 

출처 한국인터넷진흥원

 

 

 

 

실무에서 보일 수 있는 경우 8가지를 문제를 통해 확인하자.

 

 

 

 

 

1. 인증 우회

 

인증을 클라이언트 측에서 관리(자바스크립트로 구현)하는 경우, 쉽게 우회할 수 있다.

 

아래 문제를 보자.

 

 

위의 링크를 클릭하면 로그인페이지로 이동된다. 소스코드를 살펴보면,

위와 같이 auth1에서 location.href을 통해 로그인페이지로 이동되고 있음을 확인할 수 있다. 또한 사진에는 안 나왔지만 auth1의 응답코드를 살펴보면 이 페이지에 미사일 발사 버튼이 있음을 알 수 있다. 따라서, 인터셉트를 켜서 응답 코드의 location.href 스크립트를 삭제하고 보내면 된다.

 

응답 코드에서 해당 스크립트 주석 처리한 코드(좌)를 보냈을 때 화면(우). 미사일 발사 버튼이 나온다. 이 문제는 이러한 과정을 반복해서 풀이한다.

 

이와 같이 자바스크립트 코드로 로그인 페이지로 이동시키는 것은 해당 코드를 삭제하여 로그인을 우회할 수 있다.

따라서 클라이언트 측에서 로그인을 관리하는 것은 금물.

 

 

 

 

 

 

 

2. 인증 우회

 

권한 확인 소스코드를 주석처리 해놓은 경우, 주석만 해제해서 쉽게 우회할 수 있다.

 

아래 문제에서 mario / mariosuper로 로그인 했을 때 오른쪽과 같은 index페이지로 접속하게 된다.

 

 

관리자 계정이 아니지만, 해당 index페이지 소스코드를 살펴보면 미사일 발사 버튼이 주석처리 되어 있는 걸 볼 수 있다.

 

 

인터셉트를 켠 뒤 응답코드에서 이 주석을 해제한 뒤 보내면 발사 버튼이 아래와 같이 출력된다.

 

 

따라서 주석은 잘 살펴보고 주의해서 관리해야 한다.

 

 

 

 

 

 

 

3. 인증 우회

 

다음 문제를 보자.

주어진 계정으로 로그인한 뒤, fire 버튼을 클릭해도 권한이 없다는 알림이 뜬다.

 

 

인터셉트를 켜서 fire을 클릭해도 똑같이 알림이 뜨는걸로 봐서, 권한 확인을 서버에서 하는게 아닌 클라이언트 쪽에서 하고 있음을 알 수 있다.

 

 

현재 페이지의 소스코드를 살펴보면, 발사버튼을 클릭했을 때 goMenu 함수를 호출한다.

 

index.php 소스코드(좌) / js파일 소스코드(우)

 

소스코드 내에 goMenu함수가 정의되어 있지 않은데, 자바스크립트 파일을 살펴보면 위(우)와 같이 goMenu함수에 대해 알 수 있다.

 

goMenu 함수를 보면, 코드가 1018인 경우 userLevel 이 admin일 때 user_auth_check 함수에 의해 true가 출력되면서 ./fire_nuclear_Attack.php 로 이동시킨다. 이 주소로 직접 들어가보면 플래그가 나온다.

 

이와 같이 권한을 브라우저, 즉 클라이언트 측에서 확인하는 경우는 쉽게 우회할 수 있다.

 

 

 

 

 

 

 

4. 인증 우회

 

3번과 같은 경우인데, 자바스크립트를 난독화해놓은 경우이다.

문제 설명 및 사진은 생략하고, 해당 함수 파일을 보면 다음과 같다.

 

 

난독화 해제하는 방법에는 정적 해독과 동적 해독이 있다. 정적 해독은 난독화 해제 도구를 이용하는 것으로, 검색하면 많이 뜬다. 동적 해독은 코드를 직접 분석하는 것이다.

 

goMenu함수를 정확히 파악할 수는 없지만, 코드가 9999인 경우 userLevel이 admin일 때 알 수 없는 페이지로 리다이렉트 되고 있다. 따라서 userLevel의 값으로 admin을 주면 된다.

 

위와 같이 콘솔에서 goMenu('9999', 'admin');을 입력하면 /fire_computer_world.php로 리다이렉트되고, 플래그가 나온다.

 

 

 

 

 

 

 

5. 인가 우회

 

관리를 위해 페이지 이름을 규칙성 있게 쓰다보니 페이지 이름을 유추할 수 있게 되면서 생긴 취약점이다.

 

 

현재 공지사항 페이지에 "글쓰기" 버튼이 없다. 관리자 계정인 admin에게만 출력되는 듯 하다. 이 페이지의 주소가 notice_list.php이니 글쓰기 페이지의 이름은 notice_write로 작성했을 가능성이 높다.

실제로 notice_write.php 를 직접 들어가보면, 아래와 같이 글을 쓸 수 있게 된다.

 

이 취약점은 인증을 건너뛰거나 한 게 아니니 인증 우회 취약점이 아니다. 관리자의 권한이 없는데도 관리자와 같은 일을 할 수 있으니 인가 취약점이다.

 

 

 

 

 

 

 

6. 인가 우회

 

5번과 같은 취약점이다. 문제도 거의 똑같은데,

 

 

게시판의 글을 클릭하면 위의 오른쪽 사진과 같이 권한이 없다는 알림이 뜬다. 파일명을 유추하기 위해 게시글을 써보기도 하고 수정하기도 하다보면, 게시글 수정 페이지의 이름이 notice_update.php임을 알게 된다.

 

따라서 notice_update.php?id=42를 입력하는데, 또 권한이 없다는 알림창이 뜬다. 소스코드를 확인해 본 결과 스크립트 태그로 게시글 리스트 페이지로 이동시키고 있다. 따라서 최종적으로 인터셉트를 켠 뒤 notice_update.php?id=42의 응답코드에서 아래와 같이 스크립트를 삭제하고 보내면 게시글을 읽을 수 있다.

 

 

 

 

 

 

 

7. 인가 우회

 

아래 문제에서, 현재 내가 로그인한 계정은 sfUser이므로 마이페이지주소의 user 파라미터에 sfUser이 붙어있음을 확인할 수 있다. 따라서 이 파라미터에 admin을 입력하면 admin계정의 마이페이지를 확인할 수 있다. 

 

 

위와 같이 파라미터로 인증할 값으로 받아오는 것은 취약점이 생기는 원인이 될 수 있다.

 

 

 

 

 

 

 

8. 인가 우회

 

7번과 같은 문제. 마이페이지의 user 파라미터 값과 쿠키의 user 값으로 admin을 입력하면 admin의 마이페이지를 볼 수 있는 문제였다. 7과 마찬가지로 인가 취약점이다. 생략.

 

 

 

 

 

 

 

 

대응방안

 

서버에서 세션을 통한 검증을 해야한다. 앞서 문제들에서 봤듯, 자바스크립트로 권한 확인하고 검증하고 하는 것은 금물. 자바스크립트는 클라이언트 측에서 편의기능 구현할 때만 사용하도록 하자.  또한 접근제어가 필요한 모든 페이지에 서버측에서 권한을 검증하는 로직을 구현해야 한다.

'Hacking_study > 해킹과제' 카테고리의 다른 글

SSRF  (0) 2023.06.07
파일 업로드 및 다운로드  (8) 2023.06.01
CSRF 수업 정리(9주차)  (0) 2023.05.25
CSRF 수업 정리(8주차)  (0) 2023.05.18
XSS (stored xss / reflected xss / 대응 방안)  (0) 2023.05.11