1.漏洞成因:
文件上传时,由于校验不全、限制不当,可能导致被上传webshell、拒绝服务、任意文件写入等安全问题。
2.审计策略:
简单来说就是审计⽂件类型不校验或校验不当
审计检查上传⽂件的⽂件类型
审计是否限制了⽂件上传路径
是否对⽂件进⾏了重命名或对\u0000进⾏过滤
审计⽂件⼤⼩是否限制
审计是否返回了⽂件路径或⽂件路径很好猜测
3.审计常见的函数
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
上传
4.代码分析
废话不多说我们来看代码,通过搜索upload参数我们可以看到很多地方使用了upload这个参数但是我们重点关注upload.jsp这个文件。
进入到upload.jsp代码中,对代码进行解读其实逻辑很简单,先分析13-33行代码,先是获取一个临时路径savePath然后创建一个文件对象f1来表示该路径然后判断是否存在,不存在的话就新建一个。再往下分析创建了一个DiskFileItemFactory对象(DiskFileItemFactory是Commons FileUpload 库中的一个类),设置上传请求为UTF-8编码。在往下分析发现使用了upload.parseRequest(request)方法解析文件上传请求来获取上传的文件项列表。如果解析过程中发生异常,将打印异常信息并return回去,如果文件列表为空也会直接return。
上面分析了13-33行代码下面接着分析34-54行代码,这段代码我理解是一个循环用来遍历文件列表和文件上传。可以看到fileList参数是对文件进行遍历,然后41行代码是获取文件名然后进行判断。如果文件名为空或者包含空格就会继续下一次循环。44-57行代码使用了OaTools.gainedFileName方法生成一个新的文件名然后临时路径和文件名进行拼接赋值给f。然后使用write()方法写入文件后将服务器的物理路径和临时文件名作为响应输出。
这个时候我们就可以构造上传数据包进行上传来获取服务器的绝对路径,当然我们最终的目的不是为了获取一个服务器绝对路径那么简单呀。我们接着搜索upload参数会发现ntkoupload.jsp文件里面存在文件上传,其中的newFileName参数需要知道系统里存在的文件进行覆盖,正好我们在审计upload.jsp文件中获取到了服务器的绝对路径,我们可以进行组合进行上传。
自己在源码处加了注解只是个人理解有些注解写的不好的地方各位大佬担待担待。截图如下:
到这里代码就已经分析完了,通过upload.jsp文件上传获取到服务器的绝对路径然后又通过ntkoupload.jsp文件进行文件覆盖上传。
漏洞复现的话现在网上已经有很多poc和exp了大家了直接去找漏洞复现文章就行啦,推荐一个漏洞复现写的不错的公众号。
https://mp.weixin.qq.com/s/HkChiOJ_QFOgi2hfGuUwYg
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!