
최소 권한 또는 기본적으로 거부의 원칙을 위반하여 특정 기능, 역할 또는 사용자에게만 액세스 권한을 부여해야 하지만 누구에게나 액세스가 가능합니다.
URL(매개변수 변조 또는 강제 탐색), 내부 애플리케이션 상태 또는 HTML 페이지를 수정하거나 공격 도구를 사용하여 API 요청을 수정하여 액세스 제어 검사를 우회합니다.
고유 식별자(안전하지 않은 직접 객체 참조)를 제공하여 다른 사람의 계정을 보거나 편집할 수 있도록 허용
POST, PUT, DELETE에 대한 액세스 제어가 누락되어 API에 액세스합니다.
권한 상승. 로그인하지 않고 사용자로 행동하거나 사용자로 로그인한 경우 관리자로 행동합니다.
JSON 웹 토큰(JWT) 액세스 제어 토큰을 재생하거나 변조하는 것과 같은 메타데이터 조작, 권한을 상승시키거나 JWT 무효화를 남용하기 위해 조작된 쿠키나 숨겨진 필드.
CORS 구성 오류로 인해 승인되지 않은/신뢰할 수 없는 출처에서 API에 액세스할 수 있습니다.
인증되지 않은 사용자로는 인증된 페이지를 강제로 탐색하거나, 표준 사용자로는 권한이 있는 페이지를 강제로 탐색합니다.
공격 시나리오:
1.인증되지 않은 사용자가 권한이 있는 자원에 접근:
/admin/dashboard로 접속해서 일반 사용자가 관리자 페이지에 접근
2.수정 가능한 URL 또는 파라미터:
공격자가 URL, 쿠키 또는 숨겨진 필드에서 식별자(ID)를 조작해 다른 사용자의 데이터를 접근하는 경우.
/users/1234/orders에서 사용자 ID를 1235로 변경하여 다른 사용자의 주문 기록을 접근.
3.메소드 수준의 권한 부여 실패:
중요한 기능(예: 삭제, 수정)이 적절하게 보호되지 않은 경우.
예를 들어, 사용자는 UI에서 버튼이 숨겨져 있지만, API나 직접적인 URL 접근을 통해 중요한 작업을 수행할 수 있습니다.
1. CWE-23: Relative Path Traversal
: (상대 경로 탐색)은 입력된 파일 경로를 제대로 검증하지 않아 발생하는 보안 취약점이다. 공격자가 애플리케이션에서 허용되지 않은 디렉토리나 파일에 접근할 수 있도록 하여, 민감한 정보에 접근하거나 시스템을 손상시킬 수 있다.
`String filename = request.getParameter("filename");
File file = new File("/app/data/" + filename);
BufferedReader reader = new BufferedReader(new FileReader(file));
위의 코드에서는 사용자가 입력한 filename을 검증하지 않고
그대로 경로에 포함시킵니다. 이를 통해 공격자는 경로 탐색 공격을 시도할 수 있습니다.`
2. CWE-59: Improper Link Resolution Before File Access ('Link Following')
: 이 취약점은 파일이나 디렉토리 접근 전에 심볼릭 링크를 제대로 검증하지 않아서, 공격자가 의도치 않은 파일로 리다이렉션하여 민감한 정보에 접근하거나 시스템을 손상시킬 수 있는 상황을 만드는 것이다.
심볼릭 링크란?
심볼릭 링크는 파일 시스템에서 하나의 파일이나 디렉토리를 다른 파일이나 디렉토리에 대한 참조로 연결하는 특수한 파일이다. 즉, 심볼릭 링크는 일종의 "가명"으로, 실제 파일이 아닌 다른 파일의 위치를 가리키는 포인터 역할을 한다. 예를 들어, /tmp/symlink라는 심볼릭 링크는 실제로는 /etc/passwd 파일을 가리킬 수 있다. 심볼릭 링크가 제대로 검증되지 않으면 애플리케이션이 symlink를 통해 민감한 파일에 접근하게 될 수 있는 것이다.
char *filename = "/tmp/userfile";
int fd = open(filename, O_RDWR);
위의 코드에서는 /tmp 디렉토리에서 파일을 열기 전에 심볼릭 링크 여부를 확인하지 않습니다. 공격자는 /tmp/userfile을 심볼릭 링크로 만들어 다른 파일에 접근하게 할 수 있습니다.
3. CWE-359: Exposure of Private Personal Information to an Unauthorized Actor
: 소프트웨어에서 민감한 개인 정보를 권한이 없는 사용자에게 노출하는 취약점을 설명하는 보안 약점이다. 이는 개인 식별 정보(PII: Personally Identifiable Information)나 다른 민감한 데이터를 비의도적으로 유출할 때 발생하며, 개인정보 보호법을 위반하거나 심각한 보안 사고로 이어질 수 있다.
// 사용자의 신용카드 정보를 로그에 기록하는 경우
System.out.println("User Credit Card Info: " + creditCardNumber);
이 코드는 신용카드 정보를 로그에 기록하는 취약한 코드입니다. 로그 파일을 통해 민감한 정보가 유출될 수 있습니다.
4. CWE-425: Direct Request ('Forced Browsing')
: 애플리케이션의 특정 자원(페이지, 파일, 기능 등)에 대한 접근을 제대로 제한하지 않아, 공격자가 URL을 직접 입력하여 권한이 없는 자원에 접근할 수 있는 취약점을 나타낸다. 이 문제는 서버가 인증 또는 권한을 확인하지 않고 클라이언트 요청을 처리하는 경우 발생할 수 있다.
Forced Browsing(강제 탐색)이란?
Forced Browsing은 공격자가 웹 애플리케이션의 URL을 직접 입력하거나 추측하여 권한이 없는 자원에 접근하는 기법입니다. 일반적으로 URL 패턴을 추측하거나 순차적으로 요청을 보내는 방식으로 이루어집니다. 이 취약점을 통해 공격자는 민감한 정보에 접근하거나, 관리자 권한으로 시스템을 조작할 수 있습니다.
// 인증 또는 권한 확인이 없는 경우
if (request.getParameter("page").equals("admin"))
{
showAdminPage();
} else {
showUserPage();
}
위의 코드는 URL 파라미터를 통해 관리 페이지에 접근할 수 있게 하여, 인증 없이 ?page=admin을 입력하면 누구나 관리 페이지에 접근할 수 있다.
5. CWE-639: Authorization Bypass Through User-Controlled Key
:사용자가 직접 제어할 수 있는 키나 매개변수를 통해 인증 또는 권한 부여를 우회할 수 있는 취약점이다. 이는 애플리케이션이 사용자로부터 제공된 키(예: ID, 토큰, 세션 값 등)를 제대로 검증하지 않거나, 키를 신뢰하여 권한이 없는 사용자가 임의로 다른 리소스에 접근할 수 있도록 허용할 때 발생한다.
사용자 제어 키: 애플리케이션에서 특정 자원(예: 프로필 정보, 문서 등)에 접근할 때, 사용자의 요청에 포함된 매개변수(예: ID, 세션 토큰)를 사용하여 자원에 접근하는 방식.
권한 검증 실패: 애플리케이션이 제공된 키에 대해 충분한 검증을 수행하지 않아, 공격자가 키를 조작하여 권한 없는 자원에 접근할 수 있는 경우.
// 사용자가 자신의 프로필 ID를 전달하여 정보를 조회하는 취약한 코드
String userId = request.getParameter("id");
Profile profile = getProfileById(userId);
displayProfile(profile);
이 코드는 사용자가 전달한 id 값을 검증하지 않고, 해당 ID로 사용자의 프로필 정보를 조회하는 방식입니다. 공격자는 다른 사용자의 ID를 입력하여 권한 없이 다른 사람의 프로필 정보를 볼 수 있습니다.