
1) 인증 / 인가
인증 (Authentocation) : 그 사람이 맞는지 확인하는 작업
인가 (Authentocation) : 특정 권한을 부여하는 것
2) 인증 / 인가 취약점
인증 취약점
인가 취약점
1) 클라이언트 측 정보로 인증을 수행하는 경우
| (1) 이용자의 아이디로 로그인 | |
|---|---|
![]() | ![]() |
| (2) 클라이언츠 측 정보(쿠키)를 통해 loginUser 판별 |
|---|
![]() |
| (3) 쿠키 값을 변조하여 인증 우회 |
|---|
![]() |
2) Process 건너뛰기
: 직접 접근이 가능한 경우
| (1) Fire 버튼 클릭 |
|---|
![]() |
| (2) 확인 버튼 클릭 |
|---|
![]() |
| (3) 관리자 인증 필요 |
|---|
![]() |
| (4) 웹 패킷을 분석해본 결과 step1 → step2 단계로 진행 |
|---|
![]() |
| (5) 다음 페이지 step3.php 추측 및 직접 접근 |
|---|
![]() |
| (6) Fire 버튼 클릭 |
|---|
![]() |
3) 파라미터 응답값 변조
| (1) 비밀번호를 모르는 상태에서 아이디를 admin으로 로그인 |
|---|
![]() |
| (2) Proxy를 통해 응답값 변조 | |
|---|---|
![]() | ![]() |
| (3) 로그인 성공 |
|---|
![]() |
id / password 를 입력받아 인증을 성공하면 session=admin 을 저장하는 것이 기본
그러나, session = admin을 먼저 수행하는 케이스이다.
▶ 모바일 앱에서 이런 케이스의 인증 취약점이 많다.
4) 인증 횟수의 제한이 없는 경우
→ Brute Force 공격 가능
| (1) 인증 횟수의 제한이 없는 Code 인증 페이지 |
|---|
![]() |
| (2) Brute Force 코드 작성 |
|---|
| import request URL = "해당 페이지 URL" for i in range (1000, 9999+1): res = requests.get(URL, params={"otpNum":str(i)} if (not "Fail" in res.text): print(i) break |
| (3) 코드 실행 및 optNum 확인 |
|---|
![]() |
▶ 인가 취약점은 파라미터 변조(직접 접근)가 메인 전략이다.
1) 주석으로 접근을 제한 하는 경우
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 유저 아이디로 로그인 |
|---|
![]() |
| (3) 관리자만 이용 가능 |
|---|
![]() |
| (4) 웹 패킷 분석 |
|---|
![]() |
| ○ 주석으로 유저에게는 보이지 않던 발사 버튼 확인 |
| (5) 발사 버튼의 href 링크로 직접 접근 |
|---|
![]() |
▶ CSS를 이용하여 "display:none" 으로 설정된 경우도 있다.
2) 인가 체크를 클라이언트 측에서 수행하는 경우
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 유저 아이디로 로그인 |
|---|
![]() |
| (3) Fire 버튼 클릭 |
|---|
![]() |
| (4) 권한 없음 |
|---|
![]() |
| (5) 웹 패킷 분석 |
|---|
![]() |
| ○ Fire 버튼을 누르면 goMenu() 스크립트가 실행 |
| ● 따라서, goMenu() 함수가 작성된 자바스크립트 탐색 |
| (6) user.js 스크립트 확인 |
|---|
![]() |
| ○ code가 1013일때 2가지 경우로 분기 |
| ● 1. userLevel이 admin일때 발사 페이지로 이동 |
| ○ 2. userLevel이 admin이 아니면, 권한 없음 메시지 출력 |
| (7) 스크립트에 적혀있는 발사 페이지로 직접 접근 |
|---|
![]() |
| + 다른방법 : Proxy를 통해 Fire버튼의 스크립트 값 수정 (UserLevel = admin) |
|---|
![]() |
| ○ 이후 Fire 버튼 클릭시, 발사 페이지로 이동 |
3) 스크립트가 난독화 되어있는 경우
▶ 동적 분석 수행
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 유저 아이디로 로그인 |
|---|
![]() |
| (3) Fire 버튼 클릭 |
|---|
![]() |
| (4) 권한 없음 |
|---|
![]() |
| (5) 웹 패킷 분석 |
|---|
![]() |
| ○ Fire버튼을 눌렀을 때 goMenu() 스크립트 실행 |
| ● 따라서, goMenu()가 함수가 작성된 자바스크립트 탐색 |
| (6) 자바스크립트에서 goMenu()함수 분석 |
|---|
![]() |
| ○ code가 9999일때, userLevel이 'admin'이면 특정 동작 수행 |
| (7) fire 버튼의 code=9999, userLevel=admin으로 설정 |
|---|
![]() |
| (8) fire 버튼 클릭 |
|---|
![]() |
| (9) 동적 분석 결과 |
|---|
![]() |
4) guessing 공격
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 로그인 → 공지사항 |
|---|
![]() |
| ○ 글 작성 버튼이 보이지 않는다. |
| (3) admin의 공지사항 클릭 |
|---|
![]() |
| ○ 글 목록 페이지는 notice_list.php |
| ● 글 읽기 페이지는 notice_read.php |
| (4) 글 작성 페이지 guessing 공격 수행 (notice_write.php) |
|---|
![]() |
| (5) 게시글 작성 |
|---|
![]() |
5) 파라미터 변조1
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 로그인 → 공지사항 |
|---|
![]() |
| (3) 관리자 공지글 클릭 |
|---|
![]() |
| ○ 관리자 게시글 읽기 페이지 접근 불가능 |
| ● 게시글 내용이 그대로 출력되는 곳 : 읽기 페이지 외에 수정 페이지도 존재 |
| (4) 게시글 작성 및 게시글 수정 페이지 이동 |
|---|
![]() |
| (5) id 파라미터를 관리자 게시글 번호로 변경하여 내용 확인 |
|---|
![]() |
6) 파라미터 변조2
| (1) 주어진 문제는 다음과 같다. |
|---|
![]() |
| (2) 로그인 → 마이페이지 |
|---|
![]() |
| (3) user 파라미터를 admin으로 변경 |
|---|
![]() |