【问题标题】:can some one exploit my below unserialize code有人可以利用我下面的反序列化代码吗
【发布时间】:2018-01-11 14:56:30
【问题描述】:

根据unserialize (http://php.net/manual/en/function.unserialize.php) 上的 PHP.net 手册,经过几次谷歌搜索后发现 - 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']);
}

黑客能否制作“恶意标题”标签并提供其 URL 以利用我的反序列化代码?

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

【问题讨论】:

  • 您只是在反序列化您自己序列化的内容,因此风险大大降低。更重要的是您是否使用带有绑定参数的预准备语句来进行数据库交互。
  • OWASP 上有一个关于对象注入的解释你可能想读
  • 如果你使用 PDO 和准备好的语句,那你为什么使用serialize()(假设$title 是一个简单的字符串)?
  • 我们看到的大多数使用反序列化不安全的代码都可以通过更改将数据从序列化对象传递到值的 JSON 表示的方式来轻松修补代码。在某些情况下,只需将 serialize() 替换为 json_encode() 并将 unserialize() 替换为 json_decode() 是唯一需要进行的更改。
  • Can hacker craft "malicious title" tag and provide his URL to exploit my unserialize code? YES IF AND ONLY IF 有使用包含易受攻击代码的魔术方法定义的类。但是,此类漏洞需要了解您的代码和/或库/框架。

标签: php serialization


【解决方案1】:

如果攻击者能够以某种方式将特制字符串直接获取到您的数据库中,可能是通过次要的、不相关的漏洞,那么在您从数据库中获取该字符串时unserializeing 该字符串可能会导致对象/代码注入.

只有在您确定自己之前也对其进行过序列化的情况下,您才能信任要反序列化的数据。现在,您如何确定您从数据库中获取的数据之前已经被可信方序列化了?这取决于系统的整个其余部分,不会为攻击者提供绕过序列化的可利用方法。本质上,您无法确定谁对数据库中的数据进行了序列化。此处缺少的微小完整性检查加上那里看起来无害的代码可能共同导致漏洞。

更好的解决方案是使用像 JSON 这样的无漏洞数据格式。它纯粹是描述数据,没有机会往里面注入任何代码相关的东西。

【讨论】:

    【解决方案2】:

    很多非常好的 cmets,我很惊讶还没有人回答。

    黑客可以制作“恶意标题”标签并提供他的 URL 来利用我的反序列化代码吗?

    没有。

    我假设您指的是PHP Object Injection 漏洞。这是关于直接反序列化不受信任的输入。在这种情况下,你正在反序列化你自己序列化的东西,所以你很好。以下是它的表现:

    1. 攻击者制作恶意标题
    2. 你序列化它
    3. 您将其反序列化 - 此时它仍然是相同的恶意标题作为字符串。您需要再次对其进行反序列化,以便它成为一个对象并且您的代码存在风险。

    我还是建议使用 JSON,因为它更标准(例如,更容易从另一种语言中使用)。

    现在真正的问题是:

    黑客能否制作恶意标题标签来利用某事(不一定是unserialize

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

    话虽如此,在我看来,真正的漏洞在于您验证 URL 的方式。 filter_var($_GET['url'], FILTER_VALIDATE_URL) 会很乐意验证一个 URL,例如 file:///var/www/index.html。因此,您的代码允许用户读取您服务器上的任何文件。

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

    【讨论】:

    • "No." – …带星号。安全性取决于您之前实际上自己进行序列化的事实。如果还有其他漏洞可能允许攻击者将未序列化的字符串注入数据库的右列,他们可以利用此unserialize 调用来进行对象注入……
    • @deceze 我赞成你的评论,但 OP 特别询问了制作恶意标题并提供其 URL。根据 OP 显示的代码,答案是“否”。现在,如果我们要假设其他地方的其他漏洞是系统,那么一切都是可能的......
    • 同意。问题的具体表述方式,答案是否定的。现实情况是,安全并不是那么容易。
    • @deceze "现实情况是安全并不是那么容易。"阿门!
    猜你喜欢
    • 2016-09-28
    • 2012-04-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多