批量赋值
软件框架有时允许开发人员自动将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
参考
最后更新于