简介致远OA存在前台密码重置漏洞,可以重置系统中默认账户,使用重置后的密码通过接口获取cookie后可getshell,此组合拳可以实现致远的前台RCE。 漏洞复现
未重置前通过密码获取cookie失败 重置审计管理员密码
详情见后续分析。 分析密码重置这个漏洞在去年用了挺多次的,后来打了补丁后能打的不多了,本来打算开工后就写文章,一直忙于项目。正好最近看到有师傅分析了整个过程,公众号上也有一些风声,索性蹭一波师傅的文章进行学习和补充。 阅读下文前强烈推荐看这一篇文章,本文基于这篇文章(https://xz.aliyun.com/t/13741)进行补充。 前面分析基本上都和上面文章中一致则不再赘诉,在文章最后说到,需要使用普通用户权限修改管理员密码,从而实现RCE或留后门。如果只是这样,那这个漏洞其实也就是越权,实用性不太强;因为致远后台本身就存在低权限getshell的漏洞,所以有了用户就不需要进行此操作。
这个漏洞如果是前台的话,则实用性就非常强,不再需要爆破弱口令等方式来进入后台。通过此漏洞直接前台重置默认管理员密码后使用接口来获取cookie,从而后台getshell;通过这种组合拳,基本上可以实现致远前台RCE。感谢参考文章师傅的分析和分享,下面我的水文开始。
查阅致远开发文档后可知,如果声明了@NeedlessCheckLogin注解,则不需要登录即可访问。当Controller上声明此注解时,所有aciton都不需要登录;如果在某个Controller中action上声明此注解,则表示当前action不需要登录。
经过一番简单寻找,发现GenericController和ShareController在action中声明了此注解(可能还有其他Controller,当时找到这两个后就没有继续寻找)。所以调用这两个Controller的action时,不需要登录即可访问。 GenericController: ShareController:
其实这两个Controller能够达到的效果完全一致,下面用genericController.do再进行简单复现。 核心思想是通过xxx.do的后缀让致远使用SpringController的方式进行验证,而不是使用rest方式;但我们的请求格式又满足重置密码的rest接口,所以最终会调用rest接口来重置密码;而密码是share.do/genericController.do,这两个接口正好满足SpringController调用且声明了不需要鉴权的注解,从而完成前台密码重置。
通过ZipSlip漏洞,将webshell解压到根目录下从而getshell。
通过构造特殊的zip文件,从而使得webshell解压到根目录下。
通过接口定位代码 首先判断了必须为 接着判断了MaxUploadSizeExceeded和unknownException参数,不为空则抛出异常。 然后获取上传信息,并创建临时zip文件来保存信息。 接下来创建一个临时目录,判断是否有文件,有就清空。 最后创建zip文件,遍历zip中的文件并取出后进行拼接。未对zip文件进行过滤,导致可以通过 推广一波自己的星球: 安全绘景:持续更新0/1day的poc和分析复现、红队技巧、实战文章、实用工具等资源,欢迎各位师傅来扰,不满意直接退款。最后祝愿各位师傅天天高危! 注:使用Apple的师傅,切勿直接使用Apple的付款方式,可以选择wx或其他方式,也可以私信联系。
|
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论