Login
网站首页 > 文章中心 > 其它

php反序列化漏洞复现过程_Java反序列化漏洞复现

作者:小编 更新时间:2023-08-02 11:53:34 浏览量:434人看过

这个网站干什么的 什么是PHP反序列化靶机实战

在我们讲PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数.那么什么是序列化呢,序列化说通俗点就是把一个对象变成可以传输的字符串.举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的.而反序列化就是把那串可以传输的字符串再变回对象.而反序列化则比较容易出现漏洞.

这么序列化一下然后反序列化,为什么就能产生漏洞了呢?

这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发不用我们手动调用:

在研究反序列化漏洞的时候,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞了.

所以这个网站其实希望告诉大家这个反序列化的问题,并提供一些实战练习.

简单分析PHP中序列化用法介绍

简单分析PHP中序列化用法介绍

序列化在我们学习php中都会有用到了对于序列化我们常用的函数有serialize和unserialize了,希望以下这篇文章能够帮助到各位了解到PHP中序列化用法,具体如下:

0x00 序列化函数

serialize():返回带有变量类型和值的字符串

unserialize():想要将已序列化的字符串变回 PHP 的值

测试代码:

php

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$a = $a;

$this-b = $b;

}

class test1 extends test{

function __construct($a){

$this-a = $a;

$a = 'hello';

$c = false;

$d = new test('helloa','hellob','helloc');

$e = new test1('hello');

var_dump(serialize($a));

var_dump(serialize($b));

var_dump(serialize($c));

var_dump(serialize($d));

var_dump(serialize($e));

运行结果:

序列化字符串格式: 变量类型:变量长度:变量内容 .

如果序列化的是一个对象,序列化字符串格式为:

变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}

将上述结果反序列化输出,执行结果:

boolean false

object(test)[1]

public 'a' = null

object(test1)[1]

public 'b' = null

0x01 对象序列化

当序列化对象时,PHP 将在序列动作之前调用该对象的成员函数 sleep().这样就允许对象在被序列化之前做任何清除操作.类似的,当使用 unserialize() 恢复对象时, 将调用 wakeup()成员函数.

在serialize()函数执行时,会先检查类中是否定义了 sleep()函数,如果存在,则首先调用 sleep()函数,如果不存在,就保留序列字符串中的所有属性.

在unserialize()函数执行时,会先检查是否定义了 wakeup()函数.如果 wakeup()存在,将执行__wakeup()函数,会使变量被重新赋值.

serialize()测试代码:

$this-a = $a;

function __sleep(){

echo "b has changed"."\n";

$this-b = 'hib';

return $this-b;

function __wakeup(){

echo "a has changed"."\n";

$this-a = 'hia';

serialize($d);

serialize($e);

var_dump($d);

var_dump($e);

执行结果:

b has changed b has changed

unserialize()测试代码:

请写出php变量序列化和反序列化的函数,并举出1个应用例子

class User

{

private $name;

private $id;

public $sex="F";

function __construct()

//give user a unique ID 赋予一个不同的ID

$this-id = uniqid();

function __sleep()

//do not serialize this-id 不串行化id

return(array("name","sex"));

function __wakeup()

//give user a unique ID

function p(){

echo "in function p() \t";

return $this-name;

function setname($name){

$this-name = $name;

} //create object 建立一个对象

$u = new User;

$u-setname("pphu");

//serialize it 串行化

$s = serialize($u);

echo "in serialize.php br/";

print_r($s);

echo "br/";

print_r($u);

echo "br/br/";

echo "br/br/";

echo "br/br/";

//// unserialize.php?php

include('serialize.php');

//global $s;

echo "in unserialize.phpbr/";

php数组反序列化.下面这段为什么失败

不要滥用heredoc,代码不美观.

我试过了,用序列化的结果反序列化是没问题的,你检查一下是不是有个别字符对不上?

php如何循环反序列化?

①构造HITCON类反序列化字符串,其中$method='login',$args数组'username'部分可用于构造SQL语句,进行SQL注入,'password'部分任意设置.

php 经过uft-8处理方式之后,反序列化仍然失败

以上就是土嘎嘎小编为大家整理的php反序列化漏洞复现过程相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章