Java 0day Jre远程代码执行分析测试(2)

测试了一下,这里记录一下结果:

1、使用网上的poc,在java6u23,java6b13, java7u6下分别测试。(为什么要测试java6u13,原因是SunToolkit.getField方法在低版本java6中也是public 的,所以测试看看在低版本是否也能重现java7的漏洞)

2、测试寻找是否有其他可以替代SunToolkit.getField方法的其他方法。

结果:

1、原始poc在java6里不行,java7里可以直接成功利用,弹出calc。

2、两个版本的java6都没法突破,原版poc,直接报错:在applet下根本不允许访问awt.SunToolkit包。

3、java7如果直接import这个包,也是同样的报错,jvm不允许加载此包。

4、尝试了其他函数,没有测试成功可以替换SunToolkit.getField方法的方法。

根据结果反馈的原理:

首先这个问题出在的重点有两个,一个是classFinder,一个是java 7的sun.awt.SunToolkit上。

1、限制了只能在java7上成功。

2、限制了后续是否能disableSecurityManager,也就是去掉java代码执行的沙盒限制。虽然说这个SunToolkit不是不可替 代的(field.setAccessible(true);找到这个类似代码就行),但是我找了一下午没有找到替代品。

因为需要加载2,所以必须要有1去用反射加载,就是因为java7的1这里存在问题,原本不能加载的SunToolkit可以被加载了,所以才引发一系列 后续内容。至于getField是不是public有没有影响,这里没有测试出来,因为1已经直接限制了即时是public的java6,也没法调用 SunToolkit。

作者:GaRY

以上是今天的阶段性测试结果,不保证原理完全正确,但是根据今天的测试结果看来是这样的。这里感谢@kxlzx和@tcpper


作者:sine

@GaRY

上面有这样一个问题:至于getField是不是public有没有影响?

我刚找到一个这样的例子,问题是:java反射的安全性控制机制好象没有起作用?

01 public class GG {
02   public String name = "test";
03 }
04 public class Test1 {
05   public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException {
06  
07       Class cls = Class.forName(GG.class.getName());
08  
09       GG gg = (GG) cls.newInstance();
10       Field field = cls.getDeclaredField("name");
11  
12        //field.setAccessible(true);
13       System.out.println((String)field.get(gg));
14 }
15 }

无论field.setAccessible(true);与否,都能调用GG类型name属性值,因为name是public;如果是private就会报java.lang.IllegalAccessException(安全权限异常) 。

其实在java里这是个很简单的安全机制,例如:子类无法访问父类的私有属性或方法 (只能通过父类的,如:public方法访问)。

所以反射机制的setAccessible(true);方法在这里确实有很大问题!

@f4tb0y 配置好java环境,保存上面的为.java文件,并编译为.class文件;创建一个.html

.html内容

<applet code="类名.class" width="0"   height="0" ></applet>

把两个文件放在同一路径,运行一下.html文件就好了!


 

分享: