모의해킹&웹취약점진단/주•통기반 웹 취약점 점검

13. 불충분한 인증 취약점

sheow13 2023. 12. 4. 13:02
728x90

개요

- 중요정보 페이지에 대한 인증 절차가 불충분하여 권한이 없는 사용자가 중요정보 페이지에 접근하여 정보를 유출하거나 변조 등을 할 수 있는 취약점

- 이를 통해 디페이스(Deface) 공격, 상품 결제 금액 조작, 관리자 권한 악용 등을 할 수 있다.

- OWASP TOP 10 2021에서는 A07(Identification and Authentication Failures)에 해당

- 주요정보통신기반시설 취약점 진단 기준으로 13. 불충분한 인증 해당

 

불충분한 인증 시나리오

- 다른 사용자 게시물 수정 및 삭제 등이 가능한가?

- 다른 사용자 개인정보 수정 페이지에 접근 가능한가?

- 클라이언트에서 동작하는 자바스크립트를 우회하여 현재 권한으로 할 수 없는 업무를 수행할 수 있는가?

- 쇼핑몰의 경우, 상품 결제 금액을 조작하여 구매할 수 있는가?

 

사전 지식

불충분한 인가, 불충분한 인증 차이

 ① 불충분한 인증

- 불충분한 인증은 회원 가입 우회 또는 다른 사용자가 작성한 게시글 등을 변조/삭제 등이 가능한 취약점

  Ex) 다른 사용자가 작성한 게시글을 파라미터 변조 등을 통해 수정/삭제 가능

 

불충분한 인가

- 불충분한 인가는 잘못된 권한을 부여하여 인가받지 못한 사용자가 접근이 가능한 취약점

  Ex) 인가받지 못한 사용자가 관리자 페이지에 접근

 

 

불충분한 인증 실습 환경

- Kali Linux

- GMShop[보안 프로젝트 교육에서 제공]

조정원 대표님이 만든 보안 프로젝트 교육에서 제공해주고 있으며, 다양한 실습환경 및 많은 교육자료들을 제공.

 

 

 불충분한 인증 실습1[파라미터를 변조하여 타인이 작성한 게시글 수정]

Step 1) 희생자가 자료게시판에 글 작성 및 게시글 비밀번호 설정

[희생자가 자유게시판에 게시글 작성 및 비밀번호 설정]

 

[게시글 등록 확인]

 

 

Step 2) 공격자가 희생자 게시글을 수정하려고 시도해보지만, 게시글 비밀번호를 알지 못하여 수정 불가 확인.

[게시글 비밀번호를 알지 못하여 타인이 작성한 게시글 수정 불가능]

 

 

Step 3) 웹 프록시를 사용하여 게시글 수정 시 사용하는 모듈을 확인 후, Victim이 작성한 게시글 ID(idx=147)로 파라미터 변조 진행 시, Victim이 설정한 비밀번호를 알지 못해도 게시글 작성 가능 확인

  

[희생자가 작성한 게시글 ID 확인]

 

[공격자 계정으로 게시글 작성 후 수정 버튼 클릭]

 

[웹 프록시를 사용하여 게시글 ID를 희생자가 작성한 ID로 변경]

 

[희생자가 작성한 게시글 수정 가능 확인]

 

 불충분한 인증 실습2[자바스크립트를 우회하여 회원가입 진행]

 

Step 1) 회원가입 과정에서 필수 항목을 기입하지 않고 가입 진행 시, 회원가입이 불가능함을 확인

[필수항목을 기입하지 않고 회원가입 진행 불가능함을 확인]

 

 

Step 2) 회원가입하는 과정에서 응답값 내 자바스크립트 중에서 이름을 공백으로 기재했는지 체크하는 조건문을 삭제 후 forwarding 진행. 이름을 제외하고 진행 시 정상적으로 회원가입이 됨을 확인

[회원가입 과정에서 이름을 공백으로 기재했는지 체크하는 조건문을 삭제후 forwarding 진행]

 

[필수입력값인 이름을 기재하지 않고 회원가입 시도]

 

[정상적으로 회원가입됨을 확인]

 

 

 

 불충분한 인증 점검 방법

수동 점검

- 웹 프록시 도구를 통해 파라미터를 변조하여 관리자만 수정 및 삭제 가능한 페이지가 변경이 되는지 확인

 

대응 방안

1. RBAC(Role Based Access Control, 역할기반 접근제어)모델 도입하여 사용자 역할을 기반으로 권한 부여하도록 개발

[RBAC 예시]

 

2. 시큐어 코딩을 통해 다른 사용자 게시물 수정 가능 제한

<?
include "head.php";
$dataArr = Decode64($data);
$view_row = $MySQL->fetch_array("select *from bbs_data where idx=$dataArr[idx] limit 1");


if($_SESSION['SITE_USERID']!=$view_row[userid])
{
OnlyMsgView("잘못된 접근입니다.");
ReFresh("board_view.php");
exit;
}
?>