IDOR: 무엇이며 하나의 URL 변경이 모든 사용자의 데이터를 어떻게 노출시키는가?
Source: Dev.to
IDOR란 무엇이며 하나의 URL 변경으로 모든 사용자의 데이터를 노출시킬 수 있는 이유
IDOR(Insecure Direct Object Reference, 불안전한 직접 객체 참조)은 웹 애플리케이션에서 가장 흔하고 놓치기 쉬운 접근 제어 결함 중 하나입니다. 서버가 URL에 포함된 숫자와 같은 사용자의 값을 그대로 사용해 레코드를 조회하면서, 해당 사용자가 그 레코드를 볼 권한이 있는지 확인하지 않을 때 발생합니다. 별도의 도구가 필요 없으며, 주소창의 숫자를 바꾸기만 하면 됩니다.
예를 들어 프로필이 다음과 같은 URL로 로드될 때:
http:///profile?user_id=51
서버는 user_id 값을 받아 해당 레코드를 반환합니다. 문제는 서버가 소유권 검사를 건너뛰고, 로그인한 사용자가 실제로 레코드 51의 소유자인지 확인하지 않을 때 발생합니다. user_id를 1로 바꾸었을 때 다른 사람의 프로필이 반환된다면, 이것이 바로 IDOR입니다.
영향은 단순히 데이터를 보는 것에 그치지 않습니다. 엔드포인트에 따라 공격자는 자신에게 속하지 않은 레코드를 수정하거나 삭제할 수도 있습니다.
여기에 소개된 기술은 허가된 테스트를 위해서만 사용해야 합니다. 소유하지 않거나 사전 허가를 받지 않은 시스템에 대해 이러한 테스트를 수행하는 것은 대부분의 국가에서 불법이며 컴퓨터 사기법을 위반합니다. 테스트를 진행하기 전에 반드시 적절한 권한을 얻고, 정의된 범위 내에서 작업하며, 발견된 데이터를 신중히 다루세요. TryHackMe나 HackTheBox와 같은 실험실 환경을 활용하면 안전하게 연습할 수 있습니다.
로그인 후 프로필 페이지는 URL에 포함된 ID 파라미터를 기반으로 사용자 데이터를 로드합니다. 이것이 접근 제어 테스트의 시작점이 됩니다.
페이지는 현재 사용자의 정보를 보여줍니다. 다음 단계는 서버가 데이터를 반환하기 전에 소유권을 검증하는지 확인하는 것입니다.
IDOR을 테스트하려면 URL의 user_id 값을 순차적인 숫자로 바꿔보세요. 서버가 별도의 인증 절차 없이 다른 사용자의 데이터를 반환한다면 취약점이 확인된 것입니다.
GET /profile?user_id=51 # 원본 사용자
GET /profile?user_id=1 # 다른 사용자의 ID로 변경
서버 측에 소유권 검사가 전혀 없습니다. 애플리케이션은 전달된 ID에 해당하는 레코드를 그대로 반환합니다.
user_id를 다양한 값으로 바꾸면 각기 다른 사용자의 전체 프로필이 반환되며, 각각의 상세 정보가 모두 노출됩니다.
각 요청마다 다른 사용자의 전체 프로필이 반환됩니다. 오류도, 리다이렉션도, 접근 거부도 없이 단순히 데이터만 반환됩니다. 이는 서버가 ID 값만을 기준으로 레코드를 제공하고, 요청자를 확인하지 않음을 확인시켜 줍니다.
이 취약점을 해결하려면:
- 서버 측 소유권 검사를 추가하세요: 데이터를 반환하기 전에 요청한 사용자가 레코드 소유자인지 확인합니다.
- 간접 참조를 사용하세요. 매핑 테이블 등을 활용해 내부 ID가 요청에 직접 노출되지 않도록 합니다.
- 모든 엔드포인트에 최소 권한 원칙을 적용합니다.
- 코드 리뷰와 보안 평가에 접근 제어 테스트를 포함시킵니다.
간단한 서버 측 검사는 다음과 같이 구현할 수 있습니다(예시/시뮬레이션):
# 예시: 서버 측 소유권 검사
if current_user.id != requested_user_id:
return 403 # Forbidden
위와 같은 한 줄 검사는 위에서 보여준 전체 공격을 차단합니다.
IDOR은 심각한 영향을 미치는 직관적인 결함입니다. URL의 숫자 하나만 바꾸면 시스템 내 모든 사용자의 데이터를 열람할 수 있습니다. 근본 원인은 서버가 사용자 입력을 신뢰하고 소유권 검사를 생략한다는 점입니다. 이를 해결하려면 사용자‑특정 데이터를 제공하는 모든 엔드포인트에 접근 제어 검증을 추가해야 합니다. IDOR이 어떻게 동작하는지, 인코딩·해시된 변형까지 이해한다면 보안 리뷰 과정에서 이를 찾아내고 수정할 수 있는 기반을 갖추게 됩니다.
이 글이 도움이 되었다면 좋아요를 눌러주시고, 보안 학습 중인 사람과 공유해주세요. 질문이 있거나, 직접 실험실에서 다른 상황을 겪었거나, 결과를 공유하고 싶다면 아래 댓글을 남겨주세요. 언제든 보안, 리콘 기법, 혹은 AppSec 전반에 대해 이야기 나누고 싶습니다.
LinkedIn에서 연결하기
보안, 개발, 혹은 양쪽 모두에 관심 있는 분들과 언제든 연결하고 싶습니다. 무언가를 만들든, 부수든, 혹은 이제 막 시작했든, 편하게 연락 주세요.