某微oa审计
简单写一下审计了几个月这个oa的思路
首先肯定还是看web.xml
对jsp文件的鉴权以及oa的补丁都在SecurityFilter中
E8和E9的主要差别就是E9多了一个/api的访问 也就是这个servlet
这个servlet就是扫描com.cloudstore和com.api包下的@Path注解的一个rest接口
SecurityFilter初始化时会调用weaver.security.filter.SecurityMain的initFilterBean方法会初始化安全规则 会加载这两个文件夹下对应Ecology版本的XML规则文件
后面这些代码太多了 就不一一去看 一个重要的点就是会去调用
weaver.security.rules.ruleImp包下面的每一个类的validate方法 这些类差不多就是E9每次打的补丁 我们可以在拿到补丁后直接看到这些洞的URL 这里有一个小tips就是如果是因为安全规则访问某个点导致的404 在返回的header里会有一个securityIntercept
泛微在这几个月修复了一系列由于imagefilemanager导致的RCE漏洞
我们先看到这次某微在3月份打的一个补丁
weaver.security.rules.ruleImp.SercurityRuleForCptInventory
这个补丁针对性的修复了我交给某平台的一个前台RCE漏洞 并且只是在我交洞的一个月后 我没拿洞去打 也没给过任何人 所以 懂得都懂~
路径是/api/cpt/inventory/docptimpoptinventory
这里拿到inventoryexcelfile参数调用getImageFileInfoById方法拿到ImageFileManager
随后调用getImageFileName验证了后缀名
我习惯在审计的时候把这些库文件丢到jd-gui里面全部反编译出来方便在idea里面搜索
在com.engine.cpt.web.CptInventoryAction类里 跟进
可以发现这里是拿到inventoryexcelfile参数然后查询数据库后将imagefilename拼接到了路径中直接将文件写入到/cpt/ExcelToDB/目录中 所以我们现在需要找到一个前台的地方进行上传jsp木马写入imagefile表中并且还要回显imagefileid 当我把e9源码熟悉之后 直接在所有jsp文件中搜索new FileUpload(request,"utf-8") 由此找到了这个文件可以前台访问 workrelate/plan/util/uploaderOperate.jsp 这个文件可以达到上面的要求
跟进这个方法
关键点在这个uploadFiles方法
跟进后就会发现这个类weaver.file.FileUpload的所有文件上传操作都会进行压缩之后写入到imagefile数据表中 然后将文件放到filesystem目录 并且在文件上传的过程中不会验证文件的后缀名 作为imagefilename字段写入到数据库中
到这里似乎已经可以写入webshell了 但是如果此时我们一步步的上传然后去访问会发现直接404了 这是因为有对应的规则 访问/cpt/ExcelToDB/目录中的jsp文件必须登陆才能访问 我们需要的是前台RCE 所以必须得找一个前台的地方我们可以完全控制写入数据库中的imagefilename参数 使其为/../../xxx.jsp 在weaver.file.FileUpload类的上传中 调用的是某微自己写的文件上传解析类 weaver.file.multipart.MultipartParser
直接取最后一个斜杠后的内容为文件名 通过搜索new ServletFileUpload寻找调用commons-fileupload库来解析文件上传的地方 最后找到了
/api/fna/documentCompare/doCreateDocument这个路径
这里可以将文件名原样的写入到imagefile表中 返回imagefileid 具体的就不去跟了
最后还有一个点就是/api路径的鉴权 我们上面所提到的这两个路径都是需要登陆后访问的
解决办法就是大写 /API/像这样访问就不需要登陆
/api/路由的鉴权在这个类中335行
可以看到这里拿到requesturi之后并没有转换大小写 导致/API/可以绕过这个鉴权
那为什么大写api还能同样到达这个路由呢 tomcat是不可以的 之前我以为这是windows和linux系统的差异导致的 但是后面发现是Resin导致的
调resin的过程可以看这里https://blog.csdn.net/HBohan/article/details/121163220
这里的urlpattern正则为^/api(?=/)|^/apiz 大小写不敏感 所以仍然可以匹配到这个servlet
后续某微修复了大写api
至此后面少了很多的前台rce......
本文只是抛砖引玉,不对的地方希望师傅们指点指点。