接下来就需要后向查找,可以在Viewbeanbase类针对页面参数的反序列化方法中看到jata.session的值是可控的
这里接着后向查找,如果这里不熟悉jato的处理流程,则会被误导到AMViewBeanBase类的deserializePageAttributes方法
然后继续跟进父类,则最终会被误导ConsoleViewBeanBase的deserializePageAttributes方法,
然后最终会认为反序列化入口点在IOUtils的反序列化方法
用户请求 ->
ApplicationServletBase的doGet负责处理 ->
ApplicationServletBase.processRequest方法 ->
ApplicationServletBase.getViewBeanInstance获取 viewbean ->
ApplicationServletBase.dispatchRequest 方法 ->
ViewBean的invokeRequestHandler方法
这里用click1 生成恶意序列化数据
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Ck1 "open -a Calculator" | (echo -ne \x00 && cat) | base64 | tr '/+' '_-' | tr -d '='
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Ck1 "open -a Calculator" | (echo -ne \x00 && cat) | base64 | tr '/+' '_-' | tr -d '=' > click1.ser
注:由于漏洞管理法的原因,POC暂不公开。
这里拿SCServlet试试
然后会发现它会自己转发流程,不会走jato后续的分发器
发现三个servlet实现了 onBeforeRequest方法,
剔除掉这三个servlet及其子类
也就是说从33个servlet中,删掉这15个,然后删掉之后,再去web.xml中对比,把没有路由的servlet再删掉,就只剩了
然后访问这5个的路由,比如PWResetServlet,
它只能加载这个包名下的viewBean,查看Viewbean接口的所有实现,找到这个包下面的viewbean,带入
比如这里用PWResetQuestionViewBean
可以看到是没有问题的,只要传递参数就行了。
作者这里用了VersionServlet,VersionServlet 只能加载com.sun.web.ui.servlet.version 包下面的viewBean,所以versionServlet只能加载这四个
我们随意换一个viewBean
Reference:
https://juejin.cn/post/6844903536174563342
http://www.corej2eepatterns.com/Patterns/ServiceToWorker.htm
本文始发于微信公众号(穿云箭安全实验室):Pre-auth RCE in ForgeRock OpenAM (CVE-2021-35464) 分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论