【发布时间】: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