前言

反射技术不仅在开发上有广泛的应用,在安全领域也有其独特的效果,正好最近划水,就稍微学习一下反射技术,然后写一篇文章总结一下。

反射

一种用于运行状态下,动态获取信息或者调用函数的技术,在安全领域被常用来进行函数调用。


Reflection in PHP

官方文档:https://www.php.net/manual/zh/book.reflection.php

定义

它是指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射 API 。反射是操纵面向对象范型中元模型的 API ,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

测试代码

其中常用的就是 ReflectionClass 类,通过这个类,我们可以获取对象的成员、调用它的私用方法,以及更多的其他信息,测试代码如下:

<?php
class test{
    private $test = "Twings";
    private function get() {
        $this -> test = "Aluvion";
        return $this -> test;
    }
    public function hello() {
        return "Hello, World!";
    }
}
$test = new test();
$ref = new ReflectionClass($test);
$method = $ref -> getMethod("get");
$method -> setAccessible(true);
echo $method -> invoke($test);

举一个例子

国赛的 RefSpace 题目,为了解题我们需要得到 FlagSDK 的私有函数 getHash 的返回值,但是题目用 SG11 加密对 FlagSDK 类的源码进行了加密(虽然好像可以通过魔改底层来进行解密:https://xz.aliyun.com/t/4906#toc-10 ),这时候我们就需要利用反射技术了,它能让我们绕过加密获取私有函数的返回值,payload如下:

use interesting\FlagSDK;
$sdk = new FlagSDK();
$ref = new ReflectionClass($sdk);
$instance = $ref -> newInstance();
$method = $ref -> getMethod("getHash");
$method -> setAccessible(true);
echo $method -> invoke($instance);

参考文章:

https://www.cnblogs.com/nixi8/p/5176213.html

https://www.cnblogs.com/KeenLeung/p/6041280.html


Reflection in Java

官方文档:https://developer.android.google.cn/reference/java/lang/Class

定义

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是 Class 类中的方法.所以先要获取到每一个字节码文件对应的 Class 类型的对象。

RCE

在安全领域,反射技术常被用来进行 RCE 。在 Java 的语言漏洞利用中,我们一般无法引入能够命令执行的包或使用 new 来动态调用,这个时候我们就需要使用 Java 反射来进行命令执行:

Class.forName("java.lang.Runtime").getRuntime().exec("calc.exe")

参考文章:

https://www.cnblogs.com/luoxn28/p/5686794.html

https://www.cnblogs.com/ysocean/p/6516248.html

https://www.jianshu.com/p/9be58ee20dee

https://blog.csdn.net/lwl20140904/article/details/80163880


Web

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Java特色-表达式注入漏洞从入门到放弃
2019国赛部分题解简略版