약한 문자열 강도는 패스워드와 같이 중요한 문자열을 유추 가능한 문자열로 설정이 가능하여 만약, 약한 강도의 패스워드로 설정하였을 때 단순히 패스워드 추측만으로 계정이 탈취될 수 있습니다.
또한, 자동화 공격 취약점과 같이 발생할 경우에는 패스워드에 대해 무차별 대입 공격으로 패스워드를 탈취할 수도 있습니다.
점검 방법: 패스워드 생성 시 약한 강도의 패스워드 설정이 가능한지 확인합니다.
1. 약한 비밀번호 설정
1) 회원가입 페이지에 접속합니다.
2) 계정 생성 시 약한 강도의 비밀번호를 설정합니다.
비밀번호를 easy로 쉽게 설정하였습니다.
3) 약한 강도의 비밀번호가 사용가능한지 확인합니다.
계정이 생성되고 로그인도 정상적으로 할 수 있는 것을 확인했습니다.
아이디가 easy이기 때문에 비밀번호도 easy 일 것이라는 추측을 할 수 있습니다. 이렇게 약한 강도의 패스워드 설정이 가능하면 계정 탈취의 위험이 있습니다.
[대응 방안]
일단 주통기반에서는 해당 항목을 충족하는 것을 권고합니다.
Step 1) 다음 각 목의 문자 종류 중 2종류 이상을 조합하여 최소 10자리 이상 또는 3종류 이상을 조합하여 최소 8자리 이상의 길이로 구성
(1) 영문 대문자(26개)
(2) 영문 소문자(26개)
(3) 숫자(10개)
(4) 특수문자(32개)
Step 2) 연속적인 숫자나 생일, 전화번호 등 추측하기 쉬운 개인정보 및 아이디와 비슷한 비밀번호는 사용하지 않는 것을 권고
Step 3) 비밀번호에 유효기간을 설정하여 반기별 1회 이상 변경
Step 4) 최근 사용되었던 패스워드 재사용 금지
제가 직접 구현해볼 것은 1번을 적용하여 좀 더 강한 패스워드로 설정하도록 하겠습니다.
function passwordCheck($password) {
if (strlen($password) < 8 && strlen(($password) > 16)) {
return False;
}
$lowerString = 'abcdefghijkmnopqrstuvwxyz';
$upperString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$number = '0123456789';
$special = '!@#$%^&*()';
$lowerString = str_split($lowerString);
$upperString = str_split($upperString);
$number = str_split($number);
$special = str_split($special);
$count = 0;
foreach ($lowerString as $value) {
if (strpos($password, $value)) {
$count += 1;
break;
}
}
foreach ($upperString as $value) {
if (strpos($password, $value)) {
$count += 1;
break;
}
}
foreach ($number as $value) {
if (strpos($password, $value)) {
$count += 1;
break;
}
}
foreach ($special as $value) {
if (strpos($password, $value)) {
$count += 1;
break;
}
}
if ($count >= 3) {
return True;
} else return False;
}
위의 코드는 제가 임의로 그냥 만든 것입니다. 물론, 더 간편하고 빠른 로직을 구현하여 적용시키면 좋을 것 같습니다.
적용 후 어떻게 처리되는지 확인해 보겠습니다.
해당 필터링은 클라이언트측에서 조작하는 것이므로 이 부분은 쉽게 우회가 가능하기 때문에 위의 코드처럼 서버측에서도 한번더 문자열 점검이 필요합니다.
그렇기 때문에 이번 예시 뿐만 아니라 반드시 필터링을 구현할 경우에는 사용자의 임의 조작이 불가능한 서버측에 구현하여야 합니다.
사진처럼 간단한 조작만으로 우회가 가능합니다.
비밀번호를 easyeasy 로 글자 수를 맞춰 계정을 생성해보겠습니다.
응답으로 비밀번호 생성 규칙을 맞춰라는 문구가 포함된 것을 확인할 수 있습니다.
이번엔 두가지 문자를 사용한 easyeasy0으로 계정 생성해 보도록 하겠습니다.
이번에도 3가지가 충족되지 않아 비밀번호 생성에 실패한 것을 확인할 수 있습니다.
마지막으로 모든 조건을 충족한 easyPASSWORD0이라는 비밀번호로 계정 생성이 가능한지 확인해보겠습니다.
이번엔 비밀번호 조건이 충족되지 않았다는 문구가 없습니다.
계정이 정상적으로 생성되었는지도 확인해보겠습니다.
해당 계정으로 로그인을 하니 로그인에 성공했습니다. 계정이 올바르게 생성된 것 같습니다.
이렇게 비밀번호 강도를 올려 공격자로부터 추측공격을 할 수 없도록 서버측에서 비밀번호를 체크하는 로직을 구현하여야 합니다.
해당 비밀번호도 좀 취약해보이기는 하지만 그래도 전보다는 추측만으로 계정을 탈취하는 것은 어려울 것입니다.
나중에 취약점 점검하면서도 나오겠지만 해당 페이지에 자동화 공격이 가능하기 때문에 비밀번호 강도를 올려도 무차별 대입 공격을 통하면 탈취가 가능합니다.
'웹 해킹' 카테고리의 다른 글
[주통기반] 로컬 웹 서버 취약점 찾기 (CSRF) (1) | 2024.04.11 |
---|---|
[주통기반] 로컬 웹 서버 취약점 찾기 (불충분한 인증) (1) | 2024.04.07 |
[주통기반] 로컬 웹 서버 취약점 찾기 (크로스사이트 스크립팅) (0) | 2024.03.28 |
[주통기반] 로컬 웹 서버 취약점 찾기 (정보 누출) (0) | 2024.03.25 |
[주통기반] 로컬 웹 서버 취약점 찾기 (디렉터리 인덱싱) (0) | 2024.03.25 |