Spring 自动绑定漏洞

  • A+

Spring 自动绑定漏洞

0x01:自动绑定

自动绑定功能在很多框架中都有实现,主要功能是允许软件框架自动将HTTP请求中的参数绑定到程序变量或对象中以便于开发者访问。
而自动绑定漏洞的漏洞点在于,攻击者可能将额外的HTTP请求参数绑定到一个对象上,使用这种方法来创建、修改、更新开发人员或者业务本身从未打算设计到的参数,而这些新参数反过来又会影响程序代码中不需要的新变量或对象,进而触发一些业务逻辑漏洞
[email protected]、@SessionAttribute、@Initbind注解
1、@ModeAttribute注解
java
@ModelAttribute
运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
public String login(@ModelAttribute User user, ModelMap model)
运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
@ModelAttribute("showSecret")
public Boolean getShowSectet() {
logger.debug("flag: " + showSecret);
return showSecret;
}

2、@SessionAttribute注解
language
在默认情况下,ModelMap 中的属性作用域是 request 级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。(但一般都会进行Dao层操作,将user保存,之后再取还便是覆盖后的东西)
如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。
Spring MVC将存放在model中对应的数据暂存到Session中
@SessionAttributes("mysession")将model中mysession对象绑定到Session中

```java
范例1:通过Model绑定
@Controller
@RequestMapping(value = "login")
@SessionAttributes("mysession")
//定义把Model中的mysession属性的值绑定到Session中
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute User user, ModelMap model) {
String viewName = "";
boolean check = true;
if (check) {
model.addAttribute("mysession", "123");
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}

java
范例2:通过@ModelAttribute绑定
我们使用@ModelAttribute把表单自动绑定到对象上,那这个对象也可以通过@ModelAttribute(“”)绑定到Session中。
@Controller
@RequestMapping(value = "login")
@SessionAttributes("user")
//此处定义需要绑定到session中的model名称
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute("user") User user, ModelMap model){
//@ModelAttribute将绑定到session中
String viewName = "";
boolean check = true;
if (check) {
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}
}

3、@InitBinderjava
被此注解的方法可以对WebDataBinder初始化。webDataBinder是用于表单到方法的数据绑定的!只对当前的Controller有效
Spring MVC中可以使用@InitBinder注解,通过WebDataBinder的方法setAllowedFields、setDisallowedFields设置允许或不允许绑定的参数。
binder.setDisallowedFields(new String[] { "balance" }

3、@PathVariable与@RequestParamjava
@PathVariable获取请求中参数绑定到变量中
使用@PathVariable时,URL是这样的:http://host:port/path/参数值
@Requestparam获取请求参数绑定到变量中
使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值

参考文章language
https://blog.csdn.net/weixin_38972910/article/details/84880669?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3
```

0x02自动绑定漏洞分析(案列一)

1、我们看到在buy方法中使用@ModeAttribute注解来绑定数据到user对象中,在购买的时候又从user对象中获取Balance和产品价格进行比较,这里就存在了自动绑定漏洞

20200514_080915.png
2、将断点断到方法一开始,然后构造数据包发送数据,观察user对象中的Balance已经发生了变化,所以此时观察调用栈中user对象数据时在何时发生变化的

20200514_080958.png
3、User对象中的变量在这里已经发送了变化,我们将断点断到这里,重新注册一个账号进行操作

20200514_081019.png
4、断点之后发现与之前看到的Balance的值不一致,猜想应该是在这里进行相应的处理,F7跟进到方法中。

20200514_081045.png
5、这里mavContainer是一个ModeAndView的'容器'对象,其中包含了user model对象,所以继续F7跟进invokeForRequest方法。

20200514_081110.png
6、进入invokdeForRequest方法中,仍然继续跟进这里的getMethodArgumentValues方法。这里对参数进行了遍历,跟进到resolveArgument,并且传入了macContainer和一个binderfactory。猜测这里会对参数进行绑定,跟进该方法,这个方法是用来获取支持的参数的参数解析器

20200514_081141.png
7、这里继续跟进对应的resolveArgument

20200514_081209.png
8、这里的mavContainer.getModel.get(name)是获取对应的model对象的(即user对象),然后看到this.bindRequestParameters方法,这里传入了Binder和request,跟进该方法

20200514_081235.png
9、这里继续跟进bind方法

20200514_081258.png
10、这里将请求参数复制给了mapvs,这里的addBindValues的作用是添加URI模板变量作为绑定值,这里并没有添加什么东西,然后跟进dobind方法,这个方法是对参数进行绑定的

20200514_081321.png
11、这里的check的方法相当于处理参数的格式的,直接跟进doBind方法

20200514_081342.png
12、这里的俩个check就是@initBinder中设置不对某个参数进行绑定生效的地方,然后直接跟进apply方法
然后跟进setPropertyValues方法。

20200514_081425.png
13、前面是获取属性值的,即productid和Balance的。然后跟进setPropertyValue方法

20200514_081450.png
继续跟进set..value方法,

20200514_081512.png
一路跟踪来到processLocalProperty,看起来这里通过字段名获取了字段的处理方法,那么这里就是漏洞的触发点了,我们跟入getLocalPropertyHandler:,然后到getPropertyDescriptor

20200514_081533.png
这里通过转换大小写获取了balance,然后封装赋值给了pd

20200514_081558.png
然后一直执行到这里,将this中的object中的值替换

20200514_081620.png
6、整体的调用流程如下

20200514_081651.png
总结:
1)@ModelAttribute会自动将参数绑定到Model对象中,如果设置了@SessionAttribute的话,同样会将请求数据保存到session中,这样如果在其他处应用这些对象去拿取相应的值,便会产生问题,但是Dao对象中的数据并没有被改变,可以通过Dao对象或使用Service获取Dao对象来避免该问题,@initBinder初始化了参数绑定器(webdatabinder),设置是否可以绑定该参数
```
DataBinder数据绑定最终依赖的是BeanWrapper,其实这个也是不准确的,
实际上依赖的是PropertyAccessor

```
2)Binder的继承关系

20200514_081745.png

0x03自动绑定漏洞(案例二)

1、在重置密码处存在自动绑定漏洞,进入重置密码处,代码如下

20200514_081815.png
在这里提交重置用户名的时候,通过service获取用户名,然后添加到model中,同时也会添加到session中,这里并不存在问题

20200514_081841.png
这里在请求重置页面,使用了@modelAttribute注解,这里便可提交User的额外参数,让@ModelAttribute去绑定我们提交的参数到user对象中去,同时也会绑定到session中

20200514_081920.png
使用burp抓包添加额外参数answer去使其绑定该参数

20200514_081947.png
虽然在提交密保问题的时候并没有使用@ModelAttribute获取user,但是这里会通过session中获取对应的user对象的对应值

20200514_082009.png
成功修改用户的密码

20200514_082046.png
参考文章如下
language
引用文章如下
https://aluvion.github.io/2019/04/02/%E8%87%AA%E5%8A%A8%E7%BB%91%E5%AE%9A%E6%BC%8F%E6%B4%9E-war%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95/
https://tuanlinh.gitbook.io/ctf/volgactf-2019-qualifier
https://zhuanlan.zhihu.com/p/107842857
https://www.anquanke.com/post/id/86278

相关推荐: Kimsuky APT组织利用疫情话题针对南韩进行双平台的攻击活动的分析

Kimsuky APT组织利用疫情话题针对南韩进行双平台的攻击活动的分析 一.前言 kimsuky APT组织(又名Mystery Baby, Baby Coin, Smoke Screen, BabyShark, Cobra Venom) ,该组织一直针对于…