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请求处理流程
- 请求到达
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应用的安全防护措施。