文章插图
同时这里下面一方面会删除最后一个 *
文章插图
另一方面如果 lowerCaseNames 为 true ,那么参数名还会转为小写,恰好这里确实设置了这一点
文章插图
因此综合起来可以写出这样的payload,当然结合上篇还可以变得更多变这里不再讨论
文章插图
变形之编码误用假设这样一个场景,waf同时支持多个语言,也升级到了新版本会解析 filename* ,假设go当中有个编码叫y4,而java当中没有,waf为了效率将两个混合处理,这样会导致什么问题呢?
文章插图
如果没有,这里报错后会保持原来的值,因此我认为这也可以作为一种绕过思路?
try {paramValue = https://www.isolves.com/it/cxkf/yy/JAVA/2022-07-13/RFC2231Utility.hasEncodedValue(paramName) ? RFC2231Utility.decodeText(paramValue): MimeUtility.decodeText(paramValue);} catch (final UnsupportedEncodingException e) {// let's keep the original value in this case}
扩大tomcat利用面现在只是war包的场景,多多少少影响性被降低,但我们这串代码其实抽象出来就一个关键Part warPart = request.getPart("deployWar");String filename = warPart.getSubmittedFileName();
通过查询 官方文档 ,可以发现从Servlet3.1开始,tomcat新增了对此的支持,也就意味着简单通过javax.servlet.http.HttpServletRequest#getParts 即可,简化了我们文件上传的代码负担(如果我是开发人员,我肯定首先也会使用,谁不想当懒狗呢)
getSubmittedFileNameString getSubmittedFileName()Gets the file name specified by the clientReturns:the submitted file nameSince:Servlet 3.1
Spring早上起床想着昨晚和陈师的碰撞,起床后又看了下陈师的星球,看到这个不妨再试试Spring是否也按照了RFC的实现呢(毕竟Spring内置了Tomcat,就算没有,但可能会思路有类似的呢)文章插图
Spring为我们提供了处理文件上传MultipartFile的接口
public interface MultipartFile extends InputStreamSource {String getName(); //获取参数名@NullableString getOriginalFilename();//原始的文件名@NullableString getContentType();//内容类型boolean isEmpty();long getSize(); //大小byte[] getBytes() throws IOException;// 获取字节数组InputStream getInputStream() throws IOException;//以流方式进行读取default Resource getResource() {return new MultipartFileResource(this);}// 将上传的文件写入文件系统void transferTo(File var1) throws IOException, IllegalStateException;// 写入指定pathdefault void transferTo(Path dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));}}
而spring处理文件上传逻辑的具体关键逻辑在org.springframework.web.multipart.support.StandardMultipartHttpServletRequest#parseRequest ,抄个文件上传demo来进行测试分析
Spring4基础构造这里我测试了 springboot1.5.20.RELEASE 内置 Spring4.3.23 ,具体小版本之间是否有差异这里就不再探究
其中关于
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest#parseRequest 的调用也有些不同
private void parseRequest(HttpServletRequest request) {try {Collection<Part> parts = request.getParts();this.multipartParameterNames = new LinkedHashSet(parts.size());MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap(parts.size());Iterator var4 = parts.iterator();while(var4.hasNext()) {Part part = (Part)var4.next();String disposition = part.getHeader("content-disposition");String filename = this.extractFilename(disposition);if (filename == null) {filename = this.extractFilenameWithCharset(disposition);}if (filename != null) {files.add(part.getName(), new StandardMultipartHttpServletRequest.StandardMultipartFile(part, filename));} else {this.multipartParameterNames.add(part.getName());}}this.setMultipartFiles(files);} catch (Throwable var8) {throw new MultipartException("Could not parse multipart servlet request", var8);}}
简单看了下和tomcat之前的分析很像,这里Spring4当中同时也是支持 filename* 格式的推荐阅读
- 通过 Java 技术手段,获取女朋友定位地址...
- Java Post请求工具类,非常实用,建议收藏
- QQ|QQ崩了!N多网友反馈文件收发失败 腾讯尚未回应
- 安卓手机如何打开.ttf文件?
- 特朗普下令解密通俄门文件-特朗普通俄门事件是怎么回事
- Office|被曝自动删除用户文件:WPS重申不会侵犯用户隐私
- 删除|WPS会删除本地文件?我亲自帮你们试了试
- Javascript怎样访问Sqlserver数据库
- JAVA中计算两个日期时间的差值竟然也有这么多门道
- Linux 压缩命令