在2013年左右,测试过非常多的WAF都不支持Multipart解析,当时经常使用Multipart请求方式来绕过WAF。Multipart所以使用请求与普通的GET/POST参数传输有非常大的区别,因为Multipart请求需要后端Web应用解析该请求包,Web容器也不会解析Multipart请求。WAF可能会解析Multipart但是很多时候可以直接绕过,比如很多WAF无法处理一个数据量较大的Multipart请求或者解析Multipart时不标准导致绕过。
    在PHP中默认会解析Multipart请求,也就是说我们除了可以以GET/POST方式传参,还可以使用发送Multipart请求,后端一样可以接受到Multipart中的参数。在Java的MVC框架中Spring MVC、Struts2等实现了和PHP类似的功能,当框架发现请求方式是Multipart时就会主动的解析并将解析结果封装到HttpServletRequest中。
    示例 - Spring MVC 注入代码片段:

    1. @ResponseBody
    2. @RequestMapping("/getArticleById.php")
    3. public SysArticle getArticleByID(String id) {
    4. return jdbcTemplate.queryForObject(
    5. "select * from sys_article where id = " + id,
    6. BeanPropertyRowMapper.newInstance(SysArticle.class)
    7. );
    8. }

    访问示例程序:http://localhost:8000/getArticleById.php?id=100000
    6. 5. Multipart字段解析问题 - 图1
    使用Multipart请求注入数据库信息测试:
    6. 5. Multipart字段解析问题 - 图2