OWASP Juice Shop Mass Assignment

2025. 12. 11. 10:36·취약점 진단

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
'취약점 진단' 카테고리의 다른 글
  • OWASP Juice Shop [SQL Injection]
  • OWASP Juice Shop [Redirect 취약점]
  • OWASP Juice Shop [정보누출 취약점]
  • Docker 사용법
JNU
JNU
JNU의 보안공부
  • JNU
    JNU diary
    JNU
  • 전체
    오늘
    어제
  • 인기 글

    • 분류 전체보기 (105)
      • 네트워크 보안 (15)
      • 시스템 보안 (18)
      • 웹 보안 (16)
      • Frida (4)
      • Android (4)
      • 정보보안기사_산업기사 (1)
      • iOS (6)
      • Network (7)
      • 악성코드 분석 (10)
      • 침투테스트 (5)
      • Bandit 원정대 (4)
      • 대학원 (3)
      • AWS Cloud (3)
      • CVE (2)
      • Python (0)
      • Dreamhack (1)
      • 취약점 진단 (5)
      • 레드라쿤 CTI (1)
  • 06-09 04:58
  • hELLO· Designed By정상우.v4.10.5
JNU
OWASP Juice Shop Mass Assignment
상단으로

티스토리툴바