Php Laravel 5.5.42中的Cookie(未)序列化
安全版本5.5.42“禁用cookie值的所有序列化/非序列化”—— 但我的值仍然序列化,只是没有序列化。而我呢Php Laravel 5.5.42中的Cookie(未)序列化,php,laravel,laravel-5,laravel-5.4,Php,Laravel,Laravel 5,Laravel 5.4,安全版本5.5.42“禁用cookie值的所有序列化/非序列化”—— 但我的值仍然序列化,只是没有序列化。而我呢 Cookie::get('key') 我得到的是 "s:5:"value";" 设置protectedstatic$serialize=truein-App\Http\Middleware\EncryptCookies有帮助,也有帮助 unserialize(Cookie::get('key')) 但据我所知,这个安全版本的问题源于unserialize()本身,而不是我稍后对
Cookie::get('key')
我得到的是
"s:5:"value";"
设置protectedstatic$serialize=true
in-App\Http\Middleware\EncryptCookies有帮助,也有帮助
unserialize(Cookie::get('key'))
但据我所知,这个安全版本的问题源于unserialize()本身,而不是我稍后对unserialize值所做的,所以这有点超出了更新的目的。
为什么我的cookies在这里被序列化,以及如何解决这个问题?这实际上是值得一提的,因为这个问题本身非常有趣 从Laravel的角度来看,这不是一个cookie问题,而是一个
APP_键
config键与序列化/非序列化相结合的问题
文件中的相关报价:
但是,如果应用程序的加密密钥在
恶意方,该方可以使用
加密密钥和利用PHP对象固有的漏洞
序列化/非序列化,例如调用任意类
方法
相关部分是PHP对象序列化/非序列化固有的漏洞
通常爆炸的形式是物体注入(至少是最常见的)
OWASP有一个很好的例子
甚至php.net也有一个红色警告
警告
不要将不受信任的用户输入传递到unserialize()
Cookie来自用户,用户不可信
因为有一个例子,所以我也将OWASP放在这里:
class Example1
{
public $cache_file;
function __construct()
{
// some PHP code...
}
function __destruct()
{
$file = "/var/www/cache/tmp/{$this->cache_file}";
if (file_exists($file)) @unlink($file);
}
}
// some PHP code...
$user_data = unserialize($_GET['data']);
// some PHP code...
在此示例中,攻击者可能能够通过路径删除任意文件,例如请求以下URL:
http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}
话虽如此,我强烈建议阅读(甚至简短地)有关序列化/非序列化漏洞的内容
如果您使用的是一个合适的框架,通常情况下,如果您不刻意引入一些漏洞,并且坚持框架的标准,那么您将得到大多数安全问题的解决。效率较低,但在结构化数据的情况下,我将serialize/unserialize替换为json_encode/json_decode。Cookie是加密的,因此如果您只是重新生成APP_密钥
,则所有旧Cookie将无效,新Cookie将不会序列化。是,这意味着您生成的所有加密值也将无效,因此您可能需要使用新密钥重新加密这些值。重新生成应用程序密钥没有帮助。在我的测试中也会发生这种情况,包括本地测试和Bitbucket管道测试,每次都会生成密钥,并且没有cookie持久性。谢谢你的回答。这就是为什么我不想使用我提到的两种方法中的任何一种(手动调用unserialize或设置标志)。但是cookie中的值仍然是序列化的。我应该自己分析吗?只要试试你的应用程序密钥
,你就没事了。我的测试管道在每次运行中都有php artisan密钥:generate。我也在当地试过。没用。