【问题标题】:Is unserialize really unsafe for all systems?反序列化对所有系统真的不安全吗?
【发布时间】:2014-04-21 09:46:00
【问题描述】:

根据documentation,将反序列化与不受信任的输入一起使用是不安全的。

作为测试,我写道:

<?php
global $secret;
$secret = 'SuperSecret';

class Thing {

    public static function __wakeup() {
        var_dump($GLOBALS);
    }

    public function __unserialize() {
        return 'okay';
    }
}

if (isset($_GET['s'])) {
    echo 'serializing=';
    echo serialize(new Thing() );
}

$unser = unserialize($_GET['thing']);

先转到?s,然后显示:O:5:"Thing":0:{}

转到 ?thing=O:5:"Thing":0:{} 它将显示所有全局变量 - 存在安全风险。

但是如果没有类具有这种不安全的 __wakeup() 函数呢?对于没有“不安全”__wakeup 函数的(大多数)系统来说,反序列化不是安全的吗?

【问题讨论】:

  • 你是在用这个解决方案解决一些特殊问题(然后你做错了)还是只是好奇?
  • 试图理解为什么在代码中使用这很危险 - 看起来这里的解决方案应该有效:stackoverflow.com/questions/3874744/…
  • 不使用是安全的
  • @zerkms 不,请参阅下面的答案。
  • 是的,见上面的评论

标签: php class security oop serialization


【解决方案1】:

这是一篇很好的文章。

https://blog.alertlogic.com/blog/writing-exploits-for-exotic-bug-classes-unserialize()/

基本上,反序列化可用于重写或更改对 PHP 或您的脚本很重要的类。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2020-11-23
  • 2021-05-26
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多