我不能使用恶意反射来查看私有字段的值

时间:2014-02-09 20:11:46

标签: java security reflection exploit

我可以获取受保护字段的值,但私有字段会抛出java.lang.IllegalAccessException。我想我知道为什么我会得到这个例外,但是如何使用反射来利用私有字段的内容,我该如何解决这个问题?

程序员帽已开启
我在netbeans项目中创建了以下弱势类。我已经制作了一个Jar文件来分发它。

public class Vulnerable {
    private int privateSecret;
    protected int protectedSecret;
    int secret;

    public Vulnerable() {
    this.protectedSecret = 11;
    this.privateSecret = 22;
    this.secret = 33;
    }
}

恶意黑客帽现已开启
我想知道私人隐藏的领域,我想知道它们包含什么 我有Jar文件,我已将其导入我的Exploit项目。

以下类扩展了Vulnerable并使用反射列出字段并尝试访问这些值。

public class ExpliotSubClass extends VulnerableCode.Vulnerable {

    public List<Field> protectedList = new LinkedList<Field>();
    public List<Field> privateList = new LinkedList<Field>();

    public void lists() {
        Field[] declaredFields = this.getClass().getSuperclass().getDeclaredFields();

        for (Field field : declaredFields) {
            int modifiers = field.getModifiers();
            if (Modifier.isPrivate(modifiers)) {
                privateList.add(field);
                System.out.println("Private = " + field.getName());
            } else if (Modifier.isProtected(modifiers)) {
                protectedList.add(field);
                System.out.println("Protected= " + field.getName());
            }
        }
    }


    public Object get(Field field) {
        try {
            return field.get(this);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(ExpliotSubClass.class.getName()).log(Level.SEVERE,
                                                                  null,
                                                                  ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ExpliotSubClass.class.getName()).log(Level.SEVERE,
                                                                  null,
                                                                  ex);
        }
        return null;
    }
}

3 个答案:

答案 0 :(得分:5)

要访问私有字段,您必须将其设置为可访问:

field.setAccessible(true);

答案 1 :(得分:1)

在这个lists()方法中,您应该在将字段对象添加到privateList之前添加以下代码。

-field.setAccessible(真);

这就是list方法的代码将成为

public void lists(){         Field [] declaredFields = this.getClass()。getSuperclass()。getDeclaredFields();

    for (Field field : declaredFields) {
        int modifiers = field.getModifiers();
        if (Modifier.isPrivate(modifiers)) {
            field.setAccessible(true);//Add this
            privateList.add(field);
            System.out.println("Private = " + field.getName());
        } else if (Modifier.isProtected(modifiers)) {
            protectedList.add(field);
            System.out.println("Protected= " + field.getName());
        }
    }
}

现在运行你的代码。它会起作用。

答案 2 :(得分:0)

如果你有.jar,你可以反编译它,然后解析.java文件以获得你需要的信息吗?