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