李某-摸鱼日记 2023-10-20 10:17 采纳率: 0%
浏览 198
已结题

奇安信的不安全的框架绑定漏洞需要怎么解决

奇安信代码安全卫士扫描出来的 API误用:不安全的框架绑定 漏洞需要怎么解决?救助!
漏洞·描述为:
目前大部分WEB框架支持将HTTP请求参数与类的属性相匹配的而生成一个对象。因此,攻击者能够将值放入HTTP请求参数中从而绑定系统对象。
例如:在以下代码片段中, Spring MVC可以将 HTTP请求参数绑定到User所有属性。

@RequestMapping("/login" )
public String login(User user) {
...
}

其中,User 类定义为:

public class User {
private String username;
private String address;
private boolean admin;
private int age;
...
}

修复建议:
当程序将非将HTTP请求参数直接绑定给对象时,应该要控制绑定到对象的属性,防止暴露所有属性。
在Spring MVC中,可以配置绑定器使用setAllowedFieldssetDisallowedFields方法控制属性绑定过程以控制应绑定的属性。
例1:在以下代码片段中,在 Spring MVC(3.0版本至最新)通过setDisallowedFields方法禁止绑定敏感属性。

@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields(new String[]{"admin"});
}
@RequestMapping("/login" )
public String login(User user) {
...
}

例2:在 Spring MVC(2.X版本)通过setDisallowedFields方法禁止绑定敏感属性。

@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.setDisallowedFields(new String[]{"admin"});
}

而在使用 @RequestBody注释参数的 Spring MVC应用程序中,绑定过程由HttpMessageConverter进行处理,这些实例使用Jackson和JAXB等库将 HTTP请求参数转换为Java对象。这些库提供了注释来控制应允许或禁止的字段。例如对于Jackson,可以使用@JsonIgnore注释禁止将某个字段绑定到请求。
例3:在以下代码片段中,Jackson禁止绑定敏感属性。

@RequestMapping(value="/add/user", method=RequestMethod.POST, consumes="text/html")
public void addEmployee(@RequestBody User user){
...
}
public class User {
private String username;
private String address;
@JsonIgnore
private boolean admin;
private int age;
...
}

同理,Jackson还可以使用@JsonIgnoreProperties、@JsonIgnoreType和 @JsonInclude等注解告诉框架忽略这些属性,使用JAXB使用@XmlAccessorType、@XmlAttribute、@XmlElement和 @XmlTransient等注解告诉框架忽略这些属性,然后使用@XmlAttribute和@XmlElement等注解选择应绑定的字段。
例4:在以下代码片段中,Jackson使用@XmlAttribute选择要绑定的字段。

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class User {
private String username;
private String address;
@JsonIgnore
private boolean admin;
private int age;
@XmlAttribute
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@XmlAttribute
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
private boolean isAdmin()  {
return admin;
}
private void setAdmin(boolean admin)  {
this.admin = admin;
}
...
}

在Struts 1和 2 中,如果某个属性不应绑定到请求,则应将其 setter方法设置为私有即可。
例5:在以下代码片段中,在Struts可以将某个属性的setter方法设置为私有从而禁止绑定敏感属性。

private boolean admin;
private void setAdmin(boolean admin)  {
this.admin = admin;
}
代码中Controller入参为为@RequestBody entity.尝试过在Controller层加@InitBinder,entity里加@JsonIgnoreProperties(ignoreUnknown = true),依旧能扫描出来。救助!
  • 写回答

15条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-20 10:26
    关注
    获得0.60元问题酬金

    基于Monster 组和GPT的调写:

    • 已经用@InitBinder@JsonIgnoreProperties(ignoreUnknown = true),但还遇到问题。可能是因为这些措施没有足够精确地限制哪些属性可以通过HTTP请求进行绑定。一些额外的步骤,您可以尝试解决这个问题:
    1. DTO(Data Transfer Object)使用:而不是直接在控制器方法中使用实体类,可以定义一个DTO类,该类只包含客户端可以修改的属性。然后,可以在服务器端将此DTO转换为实体类。这种方式,可以明确控制哪些属性可以从前端接收,并减少不必要的暴露。

      public class UserDTO {
          private String username;
          private String address;
          // 不包含 admin 字段
          // ... getters 和 setters
      }
      

      在控制器中:

      @RequestMapping(value="/add/user", method=RequestMethod.POST, consumes="text/html")
      public void addEmployee(@RequestBody UserDTO userDto){
          User user = convertToEntity(userDto);
          // ...
      }
      
    2. **使用@JsonView**:@JsonView允许您定义多个视图,从而控制序列化和反序列化过程中哪些属性应包含。

      public class Views {
          public static class Public {}
      }
      
      public class User {
          @JsonView(Views.Public.class)
          private String username;
      
          @JsonView(Views.Public.class)
          private String address;
      
          private boolean admin;  // 没有视图,不会从JSON反序列化
          // ...
      }
      

      在控制器中使用@JsonView来指定一个视图:

      @JsonView(Views.Public.class)
      @RequestMapping(value="/add/user", method=RequestMethod.POST, consumes="text/html")
      public void addEmployee(@RequestBody User user){
          // ...
      }
      
    3. 验证框架的更新:确保正在用的所有相关框架和库(例如Spring,Jackson等)都是最新版本。旧版本可能不支持某些安全特性或包含已知的安全漏洞。

    • 如果所有这些方法并且问题仍然存在,那么问题可能不在于代码的安全性,而是在于奇安信代码安全卫士的扫描策略。在这种情况下,建议联系奇安信的技术支持以获取关于为什么这些问题仍然被标记的更多信息。
    评论

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 赞助了问题酬金15元 10月20日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab