探寻 Java 文件上传流量层面 waf 绕过( 四 )


探寻 Java 文件上传流量层面 waf 绕过

文章插图
 
同时这里下面一方面会删除最后一个 *
探寻 Java 文件上传流量层面 waf 绕过

文章插图
 
另一方面如果 lowerCaseNames 为 true ,那么参数名还会转为小写,恰好这里确实设置了这一点
探寻 Java 文件上传流量层面 waf 绕过

文章插图
 
因此综合起来可以写出这样的payload,当然结合上篇还可以变得更多变这里不再讨论
探寻 Java 文件上传流量层面 waf 绕过

文章插图
 
变形之编码误用假设这样一个场景,waf同时支持多个语言,也升级到了新版本会解析 filename* ,假设go当中有个编码叫y4,而java当中没有,waf为了效率将两个混合处理,这样会导致什么问题呢?
探寻 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.1Spring早上起床想着昨晚和陈师的碰撞,起床后又看了下陈师的星球,看到这个不妨再试试Spring是否也按照了RFC的实现呢(毕竟Spring内置了Tomcat,就算没有,但可能会思路有类似的呢)
探寻 Java 文件上传流量层面 waf 绕过

文章插图
 
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 文件上传流量层面 waf 绕过


推荐阅读