반응형
📌 목차
- Mass Assignment 공격이란?
- 공격 원리와 작동 방식
- 주요 공격 기법
- 보안 위협과 실제 사례
- 방어 방법 및 대응 방안
🔍 Mass Assignment 공격이란?
Mass Assignment(대량 할당) 공격은 웹 애플리케이션이 입력된 모든 필드를 자동으로 객체에 할당할 때 발생하는 취약점이다.
개발자가 사용자 입력을 화이트리스트 없이 그대로 모델 객체에 바인딩하면,
공격자는 의도하지 않은 필드를 조작하여 관리자 권한을 탈취하거나, 계정 정보를 변경하는 등의 공격을 수행할 수 있다.
이 취약점은 주로 Ruby on Rails, Express.js, Django, Laravel 등에서 발생한다.
⚙️ 공격 원리와 작동 방식
Mass Assignment 취약점은 프레임워크의 자동 바인딩 기능을 악용하여 공격자가 숨겨진 필드에 값을 할당할 수 있도록 만든다.
✅ 취약한 사용자 업데이트 API 예제
POST /api/update-profile
Content-Type: application/json
{
"username": "user123",
"email": "user@example.com"
}
📌 서버에서는 입력된 모든 필드를 데이터베이스 객체에 그대로 바인딩하는 경우, 공격자가 추가적인 필드를 삽입하여 조작 가능
✅ 공격자가 조작한 요청
POST /api/update-profile
Content-Type: application/json
{
"username": "hacker",
"email": "hacker@example.com",
"isAdmin": true
}
🚨 결과:
- 관리자 권한이 부여됨(isAdmin: true)
- 기본 사용자가 관리자 계정으로 승격 가능
🚨 주요 Mass Assignment 공격 기법
1️⃣ 관리자 권한 상승(Privilege Escalation)
📌 공격 방식
- 숨겨진 isAdmin 또는 role 필드를 조작하여 권한 상승
✅ 공격 예제
PUT /api/users/1234
Content-Type: application/json
{
"role": "admin"
}
🚨 결과:
- 일반 사용자가 관리자 계정으로 변환됨
2️⃣ 계정 소유권 탈취(Account Takeover)
📌 공격 방식
- user_id, email_verified 등의 필드를 변경하여 다른 사용자의 계정을 탈취
✅ 공격 예제
PUT /api/users/1234
Content-Type: application/json
{
"email": "attacker@example.com",
"email_verified": true
}
🚨 결과:
- 공격자가 다른 사용자의 이메일을 자신의 이메일로 변경 가능
- 비밀번호 재설정 요청을 통해 계정 탈취 가능
3️⃣ 결제 및 금액 조작(Financial Exploitation)
📌 공격 방식
- balance, credit_limit, discount 등의 필드를 수정하여 금전적 이득 취득
✅ 공격 예제
POST /api/payment
Content-Type: application/json
{
"amount": 100,
"discount": 100
}
🚨 결과:
- discount 값을 100으로 설정하여 무료 결제 가능
⚠️ 보안 위협과 실제 사례
✅ 보안 위협
- 🛡️ 권한 상승(Privilege Escalation): 공격자가 관리자 권한을 얻을 수 있음
- 🎭 계정 탈취(Account Takeover): 이메일 변경을 통해 계정을 가로챌 수 있음
- 🚀 데이터 조작(Data Manipulation): 포인트, 할인율, 잔액 등을 조작 가능
- 💳 결제 및 금융 시스템 악용(Financial Exploitation): 결제 금액을 조작하여 서비스 무단 이용 가능
✅ 실제 발생 사례
- 2012년 GitHub에서 발생한 Mass Assignment 취약점
- 공격자가 관리자 권한을 부여하여 GitHub 저장소를 탈취 가능
- 2018년 Uber API에서 발견된 Mass Assignment 취약점
- 사용자가 다른 운전자의 계정을 수정할 수 있는 취약점 발견
🔐 방어 방법 및 대응 방안
✅ 1. 화이트리스트(Whitelist) 필드만 허용
- 허용된 필드만 업데이트할 수 있도록 필터링 적용
- 예제 (Express.js + Mongoose)
const allowedFields = ["username", "email"];
const filteredData = {};
Object.keys(req.body).forEach(key => {
if (allowedFields.includes(key)) {
filteredData[key] = req.body[key];
}
});
User.updateOne({ _id: req.user.id }, filteredData);
✅ 2. 민감한 필드 업데이트 제한
- isAdmin, role, balance 등의 필드는 클라이언트에서 변경할 수 없도록 설정
- 예제 (Django REST Framework)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["username", "email"]
read_only_fields = ["isAdmin", "role"]
✅ 3. 객체에 직접 바인딩 금지(Manual Binding 적용)
- update_attributes() 같은 자동 매핑 메서드 사용 금지
- 예제 (Ruby on Rails)
class User < ApplicationRecord
attr_protected :isAdmin, :role
end
✅ 4. API 요청 검증 및 로깅 활성화
- 허용되지 않은 필드가 포함된 요청을 차단하고 로그로 남김
- 예제 (Nginx WAF 설정)
SecRule ARGS_NAMES "isAdmin|role|balance" "id:1234,deny,status:403"
✅ 5. 웹 애플리케이션 방화벽(WAF) 적용
- WAF를 이용해 이상한 필드가 포함된 요청을 감지 및 차단
✅ 6. 정기적인 보안 테스트 수행
- OWASP ZAP, Burp Suite 등을 활용하여 API의 Mass Assignment 취약점 점검
📌 해시태그
#MassAssignment #웹보안 #API보안 #OWASP #권한상승 #계정탈취 #보안취약점 #정보보안
반응형
'보안' 카테고리의 다른 글
🚨 JWT 공격(JSON Web Token Exploitation): 취약한 서명 알고리즘을 악용한 토큰 변조 🔓 (0) | 2025.02.20 |
---|---|
🚨 WebSockets 공격: 인증되지 않은 연결을 악용한 보안 취약점 🔓 (0) | 2025.02.20 |
🔓 BOLA 공격(Broken Object Level Authorization): 인증 취약점을 악용한 데이터 탈취 🚨 (0) | 2025.02.20 |
🚨 GraphQL 공격: Introspection 쿼리를 이용한 내부 데이터 구조 유출 🔍 (0) | 2025.02.20 |
🚨 CORS Misconfiguration Exploitation: 취약한 CORS 설정을 악용한 데이터 탈취 공격 🔓 (1) | 2025.02.20 |