测试了一下,这里记录一下结果:
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文件就好了!