SpringMVC参数处理过程与Content-type绕过浅析
字数 1722 2025-08-18 11:36:48

SpringMVC参数处理与Content-type绕过分析

0x00 前言

在Spring Web应用中,通过自定义过滤器(Filter)进行输入验证和过滤是常见做法,主要用于防御SQL注入、XSS等安全风险。常见的实现方式是通过request.getParamaters()获取请求内容进行验证,但这种方法无法覆盖JSON等请求方式。

0x01 Content-type与参数解析过程

SpringMVC请求处理流程

  1. 请求到达DispatcherServletservice方法
  2. 根据请求方法调用processRequest方法
  3. 对于POST请求,调用doPost方法
  4. 执行doServicedoDispatch方法

Multipart请求处理

SpringMVC通过MultipartResolver判断和处理multipart请求:

  1. StandardServletMultipartResolver (Spring Boot默认)

    • 如果strictServletCompliance为true,Content-Type必须以multipart/form-data开头
    • 否则只要以multipart/开头即认为是Multipart请求
  2. CommonsMultipartResolver (基于Apache commons fileupload)

    • 检查HTTP方法是否支持
    • 调用FileUploadBase.isMultipartContent判断

FileUploadBase.isMultipartContent逻辑:

  • Content-Type为null → 返回false
  • Content-Type不为null → 转换为小写,以multipart/开头即认为是Multipart请求

JSON请求处理

对于application/json请求,使用RequestResponseBodyMethodProcessor解析器处理:

  1. 读取并处理Content-Type头

    • 检查字符集,若无则添加默认字符集
    • 例如application/jsonapplication/json;charset=UTF-8
  2. 使用MimeTypeUtils.parseMimeTypeInternal解析Content-Type

    • 提取分号前部分作为主类型
    • 解析参数部分
    • 统一将type和subtype转换为小写
  3. 通过消息转换器(HttpMessageConverter)读取请求体

    • 默认使用Jackson2转换器处理JSON请求

0x02 绕过思路

1. 绕过Content-Type限制

SpringMVC对Content-Type的限制:

  • 不允许通配符类型(*/*)
  • 不允许application/*+json等通配类型

2. Multipart请求绕过

当安全过滤器仅检查multipart/form-data时,可通过以下方式绕过:

  • 修改Content-Type大小写,如Multipart/form-data
  • 删除/替换multipart/后的内容
  • 组合使用上述方法

3. 其他绕过方式

利用Content-Type解析特性:

  • 修改大小写,如APPLICATION/JSON
  • 添加额外空格,如application / json
  • 在分号后添加额外内容,如application/json;extra=value
  • 组合使用上述方法

防御建议

  1. 在过滤器中全面处理各种请求类型:

    • 不仅检查request.getParameters()
    • 也要处理JSON、XML等请求体内容
  2. Content-Type检查要严格:

    • 使用精确匹配而非包含判断
    • 考虑大小写问题
  3. 对Multipart请求:

    • 使用与SpringMVC相同的判断逻辑
    • 或直接使用Spring提供的工具类
  4. 参数处理:

    • 统一处理所有可能的参数来源
    • 使用白名单而非黑名单策略

通过全面理解SpringMVC的参数处理机制和安全过滤器的局限性,可以更好地设计和实现Web应用的安全防护措施。

SpringMVC参数处理与Content-type绕过分析 0x00 前言 在Spring Web应用中,通过自定义过滤器(Filter)进行输入验证和过滤是常见做法,主要用于防御SQL注入、XSS等安全风险。常见的实现方式是通过 request.getParamaters() 获取请求内容进行验证,但这种方法无法覆盖JSON等请求方式。 0x01 Content-type与参数解析过程 SpringMVC请求处理流程 请求到达 DispatcherServlet 的 service 方法 根据请求方法调用 processRequest 方法 对于POST请求,调用 doPost 方法 执行 doService 和 doDispatch 方法 Multipart请求处理 SpringMVC通过 MultipartResolver 判断和处理multipart请求: StandardServletMultipartResolver (Spring Boot默认) 如果 strictServletCompliance 为true,Content-Type必须以 multipart/form-data 开头 否则只要以 multipart/ 开头即认为是Multipart请求 CommonsMultipartResolver (基于Apache commons fileupload) 检查HTTP方法是否支持 调用 FileUploadBase.isMultipartContent 判断 FileUploadBase.isMultipartContent 逻辑: Content-Type为null → 返回false Content-Type不为null → 转换为小写,以 multipart/ 开头即认为是Multipart请求 JSON请求处理 对于 application/json 请求,使用 RequestResponseBodyMethodProcessor 解析器处理: 读取并处理Content-Type头 检查字符集,若无则添加默认字符集 例如 application/json → application/json;charset=UTF-8 使用 MimeTypeUtils.parseMimeTypeInternal 解析Content-Type 提取分号前部分作为主类型 解析参数部分 统一将type和subtype转换为小写 通过消息转换器( HttpMessageConverter )读取请求体 默认使用Jackson2转换器处理JSON请求 0x02 绕过思路 1. 绕过Content-Type限制 SpringMVC对Content-Type的限制: 不允许通配符类型( */* ) 不允许 application/*+json 等通配类型 2. Multipart请求绕过 当安全过滤器仅检查 multipart/form-data 时,可通过以下方式绕过: 修改Content-Type大小写,如 Multipart/form-data 删除/替换 multipart/ 后的内容 组合使用上述方法 3. 其他绕过方式 利用Content-Type解析特性: 修改大小写,如 APPLICATION/JSON 添加额外空格,如 application / json 在分号后添加额外内容,如 application/json;extra=value 组合使用上述方法 防御建议 在过滤器中全面处理各种请求类型: 不仅检查 request.getParameters() 也要处理JSON、XML等请求体内容 Content-Type检查要严格: 使用精确匹配而非包含判断 考虑大小写问题 对Multipart请求: 使用与SpringMVC相同的判断逻辑 或直接使用Spring提供的工具类 参数处理: 统一处理所有可能的参数来源 使用白名单而非黑名单策略 通过全面理解SpringMVC的参数处理机制和安全过滤器的局限性,可以更好地设计和实现Web应用的安全防护措施。