有人可以利用我的下面的反序列化代码

时间:2018-01-11 14:56:30

标签: php serialization

根据unserialize上的PHP.net手册(http://php.net/manual/en/function.unserialize.php),在找到谷歌搜索后,可以利用unserialize代码。

我没有太多关于黑客如何利用unserialize代码的信息。我只是害怕,因为我正在使用来自外部用户输入的反序列化代码。

以下是我的代码,我想知道是否可以利用此代码:

<?php

if(filter_var($_GET['url'], FILTER_VALIDATE_URL)) {

    // $_GET['url'] = 'http://example.com/page/1.html'
    $html = file_get_contents($_GET['url']); 

    $doc = new DOMDocument();
    $encode = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
    libxml_use_internal_errors(true);
    $doc->loadHTML($encode);
    libxml_clear_errors();

    $nodes = $doc->getElementsByTagName('title');
    $title = strtolower($nodes->item(0)->nodeValue);

    // storing in mysqli database
    // hiding mysql code.. 
    $serialize = serialize(['icon' => 'check', 'data' => $title]);

    // fetching from mysqli database.
    // hiding other mysql code..
    $row = $fetch->fetch_assoc();
    $unserialize = unserialize($row['title']);
}

黑客可以制作&#34;恶意标题&#34;标记并提供他的URL以利用我的反序列化代码?

更新:我正在使用PDO用于mysql,这不是问题。我担心的是来自外部网站title html标记的反序列化代码,我无法控制。

2 个答案:

答案 0 :(得分:1)

如果攻击者能够以某种方式将特制的字符串直接输入您的数据库,可能是通过一个不相关的辅助漏洞,那么当您从数据库中获取该字符串时unserialize该字符串可能会导致一个对象/代码注入。

如果您确定之前已自行序列化,那么您只能信任您正在反序列出的数据。现在,可以如何确保您之前从受信任方对您从数据库中提取的数据进行了序列化?这取决于整个系统的其余部分,为攻击者绕过序列化提供了无法利用的方法。基本上,您无法确定谁已序列化数据库中的数据。在这里微小的缺乏理智检查加上无害的外观代码可能会导致漏洞。

更好的解决方案是使用像JSON这样的无漏洞数据格式。它纯粹描述了数据,并且没有机会向其中注入与代码相关的任何内容。

答案 1 :(得分:0)

很多非常好的评论,我很惊讶没有人做出回答。

  

黑客可以制作&#34;恶意标题&#34;标记并提供他的URL以利用我的反序列化代码?

没有

我假设您正在引用PHP Object Injection漏洞。这是关于直接反序列化不受信任的输入。在这种情况下,您正在反序列化您自己序列化的内容,因此您很好。以下是它将如何发挥作用:

  1. 攻击者制造恶意头衔
  2. 你序列化
  3. 你反序列化它 - 此时它仍然是与字符串相同的恶意标题 。您需要再次对其进行反序列化,以使其成为对象,并且您的代码存在风险。
  4. 无论如何,我建议使用JSON,因为它更标准(例如,更容易使用其他语言)。

    现在真正的问题是:

      

    黑客可以制作恶意标题标签来利用某些东西(不一定是unserialize

    答案是,这就是为什么在使用用户提供的标题时总是需要防止XSS和SQL注入。

    话虽如此,我认为真正的漏洞与验证网址的方式有关。 filter_var($_GET['url'], FILTER_VALIDATE_URL)会愉快地验证file:///var/www/index.html等网址。因此,您的代码允许用户读取服务器上的任何文件。

    对于ftp://ssh://等其他协议也是如此。它完全被滥用了。