1. Mass Assignment 취약점이란?
중요 정보 페이지 접근 및 로그인을 진행할 때 사용자 검증에 대한 최종 검토가
서버 측에서 이뤄지지 않을 경우 클라이언트 단에서 변조를 통해
별도의 인증 없이 페이지 직접 접근 및 우회 접근이 가능한 취약점을 이야기한다.
2. 취약점 예시
- 관리자 계정으로 계정 생성하기
OWASP juice shop 사용을 위해 계정생성을 진행한다.

계정 생성 시 응답 패킷 내에 [role] 파라미터가 customer로 설정된 것을 확인할 수 있었다.

일반 고객 권한으로 가입이 되었는데 관리자 권한으로 로그인 가능한 부분이 있을 것 같다.
새로운 계정을 재생성하고 생성 시 [role] 파라미터를 admin으로 설정하여 전달해보도록 하자

회원가입은 정상으로 된듯하니 로그인을 시도한 후 사용자 관리 페이지로 접근하니
접근가능한 것을 확인했다.

단순한 권한 변조를 통해 일반 사용자 권한에서 관리자 권한으로 권한상승이 이뤄진 것을 확인할 수 있다.
이러한 취약점을 Mass Assignment 라고 한다.
해당 취약점에 대한 조치방안과 공격지점을 알아보자
3. 조치방안
소프트웨어 프레임워크를 통해 개발 시 HTTP 요청 매개 변수를 프로그래밍 코드 변수
또는 개체를 사용하여 개발자에게 자동으로 바인딩할 수 있는데
이 때 공격자가 의도되지 않은 프로그램 코드를 생성하거나 덮어쓸 수 없는 프로그램 코드를 만들 수 있다.
OWASP에 올라온 내용인데 정확히 무슨 뜻인지 모르겠다.
그냥 코드로 한번 보자
- 사용자 계정 정보를 등록할 때 사용하는 form 태그 코드 (html)
<form>
<input name="userid" type="text">
<input name="password" type="text">
<input name="email" text="text">
<input type="submit">
</form>
- binding 되는 objcet 형식
public class User {
private String userid;
private String password;
private String email;
private boolean isAdmin;
//Getters & Setters
}
- HTTP request를 진행하는 Controller 부분
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String submit(User user) {
userService.add(user);
return "successPage";
}
위의 코드들을 바탕으로 HTTP request가 이뤄지는데
이 때 전형적인 request 형식은 다음과 같다
POST /addUser
...
userid=bobbytables&password=hashedpass&email=bobby@tables.com
그런데 위에서 살펴보았듯이 class User 내에 존재하는 instacnce 중
'isAdmin' 속성이 존재하는 것을 보았다.
그렇다면 해당 값에 대한 검증 로직이 존재하지 않는다면 임의로 삽입 후 reqeust를 던질 수 있다.
POST /addUser
...
userid=bobbytables&password=hashedpass&email=bobby@tables.com&isAdmin=true
최종 조치 code
구조적인 접근은 도메인 object에 직접적으로 사용자가 data 삽입을 통한
binding을 시도하지 못하도록 DTO (Data Transfer Objects) 를 작성하는 것이다.
public class UserRegistrationFormDTO {
private String userid;
private String password;
private String email;
//NOTE: isAdmin field is not present
//Getters & Setters
}
Spring MVC 에서 Allow-listing, Block-listing 방식으로도 수정할 수 있다.
- Allow-listing
@Controller
public class UserController
{
@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request)
{
binder.setAllowedFields(["userid","password","email"]);
// isAdmin 속성 제거, 위 세가지 속성만 사용하는 것을 허가
}
...
}
- Block-listing
@Controller
public class UserController
{
@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request)
{
binder.setDisallowedFields(["isAdmin"]);
// 해당 속성을 사용하지 못하도록 설정
}
...
}
'취약점 진단' 카테고리의 다른 글
| OWASP Juice Shop [SQL Injection] (0) | 2025.12.11 |
|---|---|
| OWASP Juice Shop [Redirect 취약점] (0) | 2025.12.11 |
| OWASP Juice Shop [정보누출 취약점] (0) | 2025.12.11 |
| Docker 사용법 (0) | 2025.12.11 |
