【问题标题】:Is it safe to serialize and unserialize the $_POST array?序列化和反序列化 $_POST 数组是否安全?
【发布时间】:2017-04-03 16:49:11
【问题描述】:

TLDR:将 $_POST 数组序列化为文件,然后在不同的请求或不同的脚本上将其读回 $_POST 变量是否安全?

我意识到这很不寻常。这是有原因的,需要十几页的文字才能解释为什么我考虑在特殊情况下这样做,至少在此期间。

归结过程:

file_put_contents('sample.post', serialize($_POST));

$_POST = unserialize(file_get_contents('sample.post'));

我已经对 post 变量的实际内容进行了广泛的过滤。我的问题是序列化和反序列化整个 $_POST 数组的过程是否给恶意用户提供了一种攻击方法。

PHP 文档说“警告。不要将不受信任的用户输入传递给 unserialize()。由于对象实例化和自动加载,反序列化可能会导致代码被加载和执行,恶意用户可能会利用这一点。”

我发现这些文章描述了这种攻击方法。但它们似乎依赖于用户能够指定要直接反序列化的字符串,即 IE unserialize($_POST['value'])。

https://www.notsosecure.com/remote-code-execution-via-php-unserialize/ https://heine.familiedeelstra.com/security/unserialize

我是不是纠正了只要我在序列化和反序列化,就不能在反序列化过程中创建对象,对吧?

我的印象是 $_POST 数组只会包含字符串(尽管我在 PHP 文档中找不到明确提到的内容)。

据我了解,即使有人提供了与序列化对象格式匹配的字符串,它也会在序列化过程中“存储”为字符串,并具有明确的长度(字节长度)。所以它只会在反序列化时被分配为一个字符串。似乎由于字符串的长度在序列化过程中与它们一起存储,因此您不能像使用 SQL 注入那样从输入中破坏序列化字符串的结构。我试图用一些无效的多字节字符来欺骗它,但没有运气。然而,我无法做到这一点和经验丰富的黑客能够做到这一点是两件不同的事情。

我找不到其他关于其他攻击方法的信息。

如果我遗漏了什么,请告诉我!我刚读了几篇 cmet 说“你永远不应该这样做”,所以我很紧张,我误解了一些东西。

【问题讨论】:

  • 看起来你的基地已经被覆盖了

标签: php security post serialization deserialization


【解决方案1】:

我认为如果没有进一步的攻击,就不可能在稍后的场景中将某些内容作为 POST 变量发送以利用 unserialize() 调用,但其他人可能有一个想法。如果 $_POST 有一些不可序列化的东西,这可能是个问题,但我认为这可能不会发生。无论 $_POST 中的内容是什么,它都已经在内存中了一次,因此假设 serialize()unserialize() 正常工作,执行类似的操作应该是安全的

$serialized = serialize($userinput);
unserialize($serialized);

但是,您正在将这些数据保存到其间的磁盘中。在利用不同的漏洞并访问您的文件(或“通过设计”访问,如 IT 运营人员)后,攻击者可能能够修改保存的序列化数据,并可能在那里注入他的攻击。这样一来,它显然很容易受到攻击。

所以这确实是一种风险,尽管可能不是很高。请注意,此解决方案的安全性在很大程度上取决于您保存的序列化内容的安全性。

【讨论】:

  • 有人可以解释一下否决票吗?如果您告诉我错误的原因,我很乐意修改或删除我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2015-03-31
  • 2011-08-11
  • 1970-01-01
  • 2012-03-25
  • 2017-08-27
相关资源
最近更新 更多