前言
反射技术不仅在开发上有广泛的应用,在安全领域也有其独特的效果,正好最近划水,就稍微学习一下反射技术,然后写一篇文章总结一下。
反射
一种用于运行状态下,动态获取信息或者调用函数的技术,在安全领域被常用来进行函数调用。
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