불충분한 인가는 주어진 권한을 초과하여 페이지에 접근이 가능한 취약점으로 만약 중요한 페이지에 접근할 수 있다면 정보를 열람, 변조할 수 있습니다. 즉, 사용자에게 주어진 권한 외에 다른 행동이 가능한 경우 위험이 있을 수 있습니다.
점검 방법 : 접근제어가 필요한 중요 페이지의 통제수단이 적절한지 판단하며 접근이 여부 확인
1. 게시글 수정
1) 게시글 수정 페이지에 접속합니다.
2) 게시글 수정 후 수정 요청을 잡아 확인합니다.
게시글 수정 시 수정할 정보와 boardId의 값으로 수정을 진행하고 있습니다.
boardId 값만 변경한다면 원하는 게시글을 수정할 수 있습니다.
3) 수정할 게시글 번호 확인합니다.
admin 계정이 작성한 게시글의 번호를 확인했습니다.
4) 파라미터값을 변조하여 게시글 수정 요청합니다.
5) 게시글이 수정되었는지 확인합니다.
admin 계정이 작성한 게시글을 수정한 것을 확인할 수 있습니다.
만약 관리자가 중요한 게시글을 공지사항으로 올렸다면 게시글 수정을 할 수 있게 되는 것입니다.
2. 게시글 삭제
1) 게시글 삭제하기 버튼을 통해 게시글을 삭제합니다.
2) 게시글 삭제 요청을 확인합니다.
게시글 삭제 시에도 boardId를 통해서 삭제가 바로 이루어집니다.
3) 삭제를 원하는 게시글 번호 확인합니다.
4) 파라미터값을 변조하여 게시글 삭제 요청을 합니다.
5) 게시글이 삭제되었는지 확인합니다.
전체 게시글 리스트나 특정 게시글 확인하는 페이지에서 admin 계정이 작성한 게시글이 삭제된 것을 확인할 수 있습니다.
3. 계정 삭제
1) 마이페이지에 접속하여 회원 탈퇴를 통해 계정을 삭제합니다.
test계정은 계속 뒤에 쓸 것이라서 저번에 만든 easy계정으로 진행했습니다.
2) 회원 탈퇴 후 요청을 확인합니다.
단순히 id값만 받아 계정 탈퇴를 진행하고 있습니다.
물론, 앞의 경우도 마찬가지로 제가 만든 웹 서비스여서 다른 추가 인증이 이루어지지 않는 다는 것을 알지만, 실제로 이것만 보고 추가 인증여부를 확인할 수 없기때문에 파라미터 값을 바꿔서 진행을 해보아야 알 수 있습니다.
3) 파라미터 값을 수정하여 요청합니다.
4) 계정이 삭제되었는지 확인합니다.
제가 guest 계정이 있다는 것을 사진으로 남겨놓는 것을 까먹었습니다.
다행히 계정 삭제 전 데이터베이스에 계정 정보 확인한 것이 있어서 대체했습니다.
위의 실수처럼 어떤 일이 일어날지 모르기 때문에 실무에서는 매 순간마다 증거 사진을 남겨놓는 것이 좋습니다.
test계정에게 주어진 권한이외에 다른 계정의 게시글 수정 및 삭제, 회원 탈퇴까지도 가능했습니다.
해당 경우들은 요청을 처리하는 과정에서 제대로된 인증이 이루어지지 않았다고도 생각할 수 있습니다.
그렇기 때문에 취약점을 잡을 시 불충분한 인증 취약점으로 분류해도 될 것 같습니다.
결론은 제대로된 접근제어가 이루어지지 않을 경우 이렇게 권한이외의 행동을 수행할 수 있다는 것입니다.
[대응 방안]
해당 취약점도 접근 권한에 대한 검증 로직을 구현하여 비인가자의 악의적인 접근을 차단합니다.
요청에 대한 권한이 있는 지 확인 후 처리한다면 비인가자는 당연히 해당 요청을 해도 처리되지 않을 것입니다.
$userId = getCookie($_COOKIE);
if (!$userId) {
echo "<script>alert('먼저 로그인 해주세요.'); window.location.href='/login.php';</script>";
exit;
} else if ($userId != $board['writer']) {
echo "<script> alert('게시글 수정에 오류가 발생했습니다.'); window.history.back(); </script>";
exit;
}
저는 간단하게 세션에 저장된 아이디와 게시글에 저장된 작성자가 일치하는지 확인한 후에 요청을 처리하도록 추가 로직을 작성하였습니다.
1. 게시글 수정
1) 수정할 게시글 확인
게시글 번호가 28인 것을 확인했습니다.
2) test계정의 정상적인 수정을 위한 페이지에 접속합니다.
3) 파라미터값을 변조하여 요청합니다.
게시글 수정 요청 시 오류가 발생하였다고 경고창이 뜨는 것을 확인할 수 있습니다.
4) 게시글 수정 여부를 확인합니다.
게시글 수정이 되지 않는 것을 확인할 수 있습니다.
2. 게시글 삭제
1) 삭제할 게시글을 확인합니다.
게시글 번호가 37인 것을 확인할 수 있습니다.
2) test계정의 정상적인 게시글을 삭제하여 요청을 확인합니다.
3) 파라미터를 변조하여 삭제 권한이 없는 게시글을 삭제합니다.
응답으로 게시글 삭제 요청에 오류가 발생한 것을 확인할 수 있습니다.
4) 게시글 삭제 여부를 확인합니다.
admin 계정이 작성한 37번 게시글은 권한이 없어 삭제에 실패한 것을 확인할 수 있습니다.
3. 회원 탈퇴
$requestUserId = $_GET['id'];
$userId = getCookie($_COOKIE);
if ($userId == $requestUserId) {
User::removeUser($userId);
session_start();
session_destroy();
header('location: index.php');
} else {
echo "<script>alert('회원 탈퇴 중 오류가 발생했습니다.'); window.history.back();</script>";
}
위와 같이 세션 아이디의 계정과 요청된 값이 일치하는 지 확인하여 처리하였습니다.
회원탈퇴의 경우 중요한 요청이기도 하기 때문에 이렇게 구현하는 것보다는 추가적인 인증정보 요청을 받아 인증정보가 일치하면 요청을 처리하는 방식으로 구현하는 것이 더 좋을 것 같긴 하지만 일단 간단하게 구현해보았습니다.
1) 파라미터 값을 변조하여 계정삭제 요청합니다.
2) 요청 시 오류가 발생한 것을 확인합니다.
3) 계정이 혹시 삭제되었는지 확인합니다.
admin계정이 삭제되지 않은 것을 확인할 수 있습니다.
불충분한 인가는 사용자에게 없어야 하는 권한이 파라미터값 변조 등 이상행동을 수행하여 권한을 넘어서는 행동을 하는 것 입니다.
그렇기 때문에 관리자 페이지 등 중요한 페이지 접속에 대해 권한 확인하는 로직을 추가로 구현하여 접근을 막아야 합니다.
'웹 해킹' 카테고리의 다른 글
[주통기반] 로컬 웹 서버 취약점 찾기 (자동화 공격) (0) | 2024.05.01 |
---|---|
[주통기반] 로컬 웹 서버 취약점 찾기 (세션 고정) (0) | 2024.04.21 |
[주통기반] 로컬 웹 서버 취약점 찾기 (CSRF) (1) | 2024.04.11 |
[주통기반] 로컬 웹 서버 취약점 찾기 (불충분한 인증) (1) | 2024.04.07 |
[주통기반] 로컬 웹 서버 취약점 찾기 (약한 문자열 강도) (0) | 2024.04.02 |