如何突破JFinal黑名单机制实现任意文件上传( 二 )


总结刚刚我们在测试阶段的分析,比较良好的做法就是想办法让程序执行到黑名单函数之前报错,这样代码就会停止执行到黑名单函数 。
那我们去看一下代码,
Upload/MultipartRequest.class 76-87
this.multipartRequest = new com.oreilly.servlet.MultipartRequest(request, uploadPath, maxPostSize, encoding, fileRenamePolicy);Enumeration files = this.multipartRequest.getFileNames();while(files.hasMoreElements()) { String name = (String)files.nextElement(); String filesystemName = this.multipartRequest.getFilesystemName(name); if (filesystemName != null) { String originalFileName = this.multipartRequest.getOriginalFileName(name); String contentType = this.multipartRequest.getContentType(name); UploadFile uploadFile = new UploadFile(name, uploadPath, filesystemName, originalFileName, contentType); if (this.isSafeFile(uploadFile)) { this.uploadFiles.add(uploadFile); } }}从上传文件
this.multipartRequest = new com.oreilly.servlet.MultipartRequest(request, uploadPath, maxPostSize, encoding, fileRenamePolicy);到删除黑名单文件
this.isSafeFile(uploadFile)这段代码之间我们还是有很多操作可以去做的 。
我这边的思路就是,首先保证上传文件的参数正常,再在文件参数后去给一个该接口不存在的参数
于是在轮询上传参数的时候
第一个参数是文件,直接会被上传到服务器
而去轮询第二个参数的时候,系统就会“报参数不存在“的异常,从而停止程序的执行,绕过黑名单机制 。
看到这些代码也可以明白,第一版的时候LuoKe同学绕过黑名单成功的原因是因为提交的第二个参数缺少分割boundary导致的报错,思路同样可行 。
下图给出poc:

如何突破JFinal黑名单机制实现任意文件上传

文章插图
 
看一下后台抛的异常:
如何突破JFinal黑名单机制实现任意文件上传

文章插图
 
总结 
1.其实我猜测这个漏洞也还有其他可能的利用方式
比如我们常提到的资源竞争(写一个写木马文件的jsp,在上传的同事疯狂访问该上传路径,这样就有可能在删除文件之前访问到jsp文件,并写入木马成功) 。
 
2.该漏洞归根到底还是开发意识的问题,无论如何,处理上传文件的时候还是应该牢记先校验,再上传 。
 
作者:平安银行-Glassy




推荐阅读