본문 바로가기
보안

🔓 BOLA 공격(Broken Object Level Authorization): 인증 취약점을 악용한 데이터 탈취 🚨

by IT 분석가 2025. 2. 20.
반응형

BOLA 공격

 

📌 목차

  1. BOLA(Broken Object Level Authorization)란?
  2. BOLA 공격의 원리
  3. 주요 공격 기법
  4. 보안 위협과 실제 사례
  5. 방어 방법 및 대응 방안

🔍 BOLA(Broken Object Level Authorization)란?

BOLA(Broken Object Level Authorization, 객체 수준 권한 부여 취약점)
사용자가 자신의 데이터만 접근해야 함에도 불구하고 다른 사용자의 데이터를 조회, 수정, 삭제할 수 있는 보안 취약점이다.

API가 사용자 인증만 확인하고, 개별 객체에 대한 접근 권한을 제대로 검증하지 않는 경우 발생한다.
이 취약점은 OWASP API Security Top 10에서 1위로 선정될 만큼 심각한 보안 이슈로 평가받고 있다.


⚙️ BOLA 공격의 원리

BOLA 취약점은 주로 REST API, GraphQL API에서 발생하며,
URL의 매개변수나 요청 본문에 있는 사용자 ID 값을 변경하는 방식으로 공격이 이루어진다.

 

취약한 API 요청 예제

GET /api/user/12345/profile
Authorization: Bearer token123
 

🚨 공격자가 사용자 ID를 변경하면?

GET /api/user/67890/profile
Authorization: Bearer token123
 

✔️ 만약 서버가 67890에 대한 접근을 차단하지 않으면,
✔️ 공격자는 다른 사용자의 개인정보를 불법적으로 조회 가능


🚨 주요 BOLA 공격 기법

1️⃣ ID 변경을 통한 불법 접근

📌 공격 방식

  • 요청 URL 또는 본문에서 다른 사용자 ID를 입력하여 타인의 데이터를 조회

공격 예시

PUT /api/orders/123/status
{
  "status": "shipped"
}
 

🚨 결과:

  • ID 123을 456으로 변경하면 다른 사용자의 주문 정보를 변경 가능

2️⃣ GraphQL API를 이용한 공격

📌 공격 방식

  • GraphQL API에서 사용자 ID를 변경하여 인증을 우회

공격 예제

query {
  user(id: "67890") {
    email
    phone
    address
  }
}
 

🚨 결과:

  • 서버가 id: "67890"을 검증하지 않으면, 공격자는 타인의 정보를 열람 가능

3️⃣ POST/PUT 요청을 통한 데이터 조작

📌 공격 방식

  • 자신의 계정 정보 대신 다른 사용자의 계정 정보를 요청 본문에 포함하여 제출

공격 예제

POST /api/transfer
{
  "from": "12345",
  "to": "67890",
  "amount": 5000
}
 

🚨 결과:

  • 공격자가 다른 사용자의 계정에서 돈을 송금하도록 조작 가능

⚠️ 보안 위협과 실제 사례

보안 위협

  • 🛡️ 개인정보 유출: 공격자가 타인의 이메일, 주소, 전화번호 등을 조회 가능
  • 🎭 데이터 변조: 사용자의 결제 정보, 주문 내역 등을 조작 가능
  • 🚀 계정 탈취: 비밀번호 변경 API에 대한 BOLA 취약점을 이용해 다른 계정 탈취 가능
  • 💣 서비스 악용: 사용자의 포인트, 쿠폰, 크레딧 등을 무단 사용 가능

실제 발생 사례

  1. 2021년 Facebook API BOLA 취약점 발견
    • 사용자 ID를 변경하여 타인의 계정 정보를 열람할 수 있는 취약점 보고됨
  2. 2022년 우버(Uber) API에서 BOLA 취약점 발견
    • 사용자가 자신의 API 토큰을 이용해 다른 사용자의 택시 기록을 확인 가능

🔐 방어 방법 및 대응 방안

1. 개별 객체에 대한 접근 권한 검증

  • 요청된 리소스가 현재 로그인된 사용자에게 적절한지 검증
  • 예제 (Node.js Express)
app.get("/api/user/:id/profile", (req, res) => {
    if (req.user.id !== req.params.id) {
        return res.status(403).json({ error: "Unauthorized access" });
    }
    // 정상 처리
});

 

2. 사용자 인증과 권한 검증 적용

  • 사용자의 역할(Role)을 확인하여 접근 가능한 데이터만 제공
  • 예제 (Django REST Framework)
class UserProfileView(APIView):
    def get(self, request, user_id):
        if request.user.id != user_id:
            return Response({"error": "Unauthorized"}, status=403)
        return Response({"email": request.user.email})

 

3. 서버 측에서 ID를 추출하여 사용 (클라이언트 입력 사용 금지)

  • 사용자가 직접 ID를 입력하지 않도록 하고, 서버에서 로그인된 사용자의 ID를 가져와 처리
  • 예제 (Express + JWT)
app.get("/api/user/profile", authMiddleware, (req, res) => {
    const userId = req.user.id; // 토큰에서 ID 추출
    const userProfile = getUserProfile(userId);
    res.json(userProfile);
});

 

4. API 로그 및 모니터링 강화

  • API 요청에서 비정상적인 ID 변경 탐지
  • 예제 (AWS CloudWatch 설정)
{
  "MetricName": "Unauthorized API Access",
  "Threshold": 5,
  "Period": 60,
  "EvaluationPeriods": 1,
  "AlarmActions": ["arn:aws:sns:us-east-1:123456789:SecurityAlerts"]
}

 

5. 보안 테스트 및 취약점 점검 수행

  • Burp Suite, OWASP ZAP 등의 도구를 활용하여 BOLA 취약점 점검

6. 웹 애플리케이션 방화벽(WAF) 적용

  • 비정상적인 객체 요청 패턴을 차단하여 BOLA 공격 예방

📌 해시태그
#BOLA #API보안 #웹보안 #데이터유출 #OWASP #인증취약점 #정보보안 #BrokenAuth

반응형