Mass Assignment 취약점:
프로그래밍 프레임워크에서 사용자 입력을 자동으로 모델의 모든 필드에 바인딩할 때,
공격자가 role, is_admin, permissions 같은 민감한 필드를 직접 조작할 수 있습니다.
웹 폼에 없는 필드라도 POST 파라미터로 전송하면 변조됩니다.
| 필드 | 값 | 민감도 |
|---|---|---|
| ID | 1 | 높음 |
| Username | user1 | 낮음 (변경 가능) |
| user1@example.com | 낮음 (변경 가능) | |
| Role | user | 매우 높음! (변경 불가) |
| Is Admin | 일반 사용자 | 매우 높음! (변경 불가) |
| Permissions | read | 높음! (변경 불가) |
// 정상 요청 (role 필드 없음)
curl -X POST https://app.example.com/profile \
-d "username=attacker&email=attacker@example.com"
// 공격 요청 (role, is_admin 필드 추가)
curl -X POST https://app.example.com/profile \
-d "username=attacker&
email=attacker@example.com&
role=admin&
is_admin=1&
permissions=read,write,delete"
// 결과: 일반 사용자가 관리자가 됨!
// 방법 1: 화이트리스트 (권장)
$allowed_fields = ['username', 'email'];
$update_data = [];
foreach ($allowed_fields as $field) {
if (isset($_POST[$field])) {
$update_data[$field] = $_POST[$field];
}
}
User::update($user_id, $update_data);
// 방법 2: 명시적 할당
$user->username = $_POST['username'];
$user->email = $_POST['email'];
// role, is_admin은 할당하지 않음
$user->save();
// 방법 3: Fillable 설정 (Laravel)
protected $fillable = ['username', 'email'];
// role, is_admin은 제외