This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Difference between revisions of "Mass Assignment Cheat Sheet"
(→Spring MVC) |
|||
Line 74: | Line 74: | ||
== Spring MVC == | == Spring MVC == | ||
+ | |||
+ | === Whitelisting === | ||
+ | @Controller | ||
+ | public class UserController | ||
+ | { | ||
+ | @InitBinder | ||
+ | public void initBinder(WebDataBinder binder, WebRequest request) | ||
+ | { | ||
+ | binder.setAllowedFields(["userid","password","email"]); | ||
+ | } | ||
+ | |||
+ | ... | ||
+ | } | ||
+ | |||
+ | [http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/DataBinder.html#setAllowedFields-java.lang.String...- Javadoc] | ||
+ | |||
+ | === Blacklisting === | ||
+ | @Controller | ||
+ | public class UserController | ||
+ | { | ||
+ | @InitBinder | ||
+ | public void initBinder(WebDataBinder binder, WebRequest request) | ||
+ | { | ||
+ | binder.setDisallowedFields(["isAdmin"]); | ||
+ | } | ||
+ | |||
+ | ... | ||
+ | } | ||
+ | [http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/DataBinder.html#setDisallowedFields-java.lang.String...- Javadoc] | ||
== NodeJS == | == NodeJS == |
Revision as of 23:11, 17 February 2016
Last revision (mm/dd/yy): 02/17/2016 Introduction"Modern frameworks allow developers to automatically bind HTTP request parameters from both request query and body into model objects for ease of development and increased productivity. If the binder is not correctly configured to control which HTTP request parameters are bound to which model attributes, an attacker may be able to abuse the model binding process and set any other attributes that should not be exposed to user control. This binding is possible even if the model attributes do not appear in the web forms or API contracts." - Mass Assignment: Sensitive Field Exposure ExampleSuppose there is a form for editing a user's account information: <form> <input name=userid type=text> <input name=password type=text> <input name=email text=text> <input type=submit> </form> Here is the object that the form is binding to: public class User { private String userid; private String password; private String email; private boolean isAdmin; //Getters & Setters } Here is the controller handling the request: @RequestMapping(value = "/addUser, method = RequestMethod.POST) public String submit(User user) { userService.add(user); return "successPage"; } Here is the typical request: POST /addUser userid=bobbytables&password=hashedpass&[email protected] And here is the exploit: POST /addUser userid=bobbytables&password=hashedpass&[email protected]&isAdmin=true
General Solutions
Alternative NamesDepending on the language/framework in question, this vulnerability can have several alternative names
Languages & FrameworksSpring MVCWhitelisting@Controller public class UserController { @InitBinder public void initBinder(WebDataBinder binder, WebRequest request) { binder.setAllowedFields(["userid","password","email"]); } ... } Blacklisting@Controller public class UserController { @InitBinder public void initBinder(WebDataBinder binder, WebRequest request) { binder.setDisallowedFields(["isAdmin"]); } ... } NodeJSRuby On RailsDjangoASP.NETPHP LaravelAuthors and Primary EditorsReferences and future reading
Other Cheatsheets |