如影随形

影子是一个会撒谎的精灵,它在虚空中流浪和等待被发现之间;在存在与不存在之间....

您现在的位置是:澳门永利赌场网址_永利娱乐场靠谱吗_永利线上取款额度 > 永利娱乐场靠谱吗 > 澳门永利赌场网址 >

PHP反序列化与WordPress一些意外BUG的有趣结合

发布时间:2019-05-17 21:07编辑:http://www.gongshuka浏览(163)

    name = "PluginName"; $payloadObject->slug = "PluginSlug"; $payloadObject->version = "PluginVersion"; print serialize($payloadObject);

    在使用这种手段后,我开始像往常一样使用WordPress实例,特别注意了与目标WordPress插件相关的所有功能,同时查看UniversalPOPGadget日志文件。很快地,生成了一些日志文件,其中包括以下内容(为简洁起见,已将大量可用类删除):

    logEvent('UniversalPOPGadget::__construct()'); } public function __destruct() { $this->logEvent('UniversalPOPGadget::__destruct()'); } public function __call($name, $args) { $this->logEvent('UniversalPOPGadget::__call(' . $name . ', ' . implode(',', $args) . ')'); } public static function __callStatic($name, $args) { $this->logEvent('UniversalPOPGadget::__callStatic(' . $name . ', ' . implode(',', $args) . ')'); } public function __get($name) { $this->logEvent('UniversalPOPGadget::__get(' . $name . ')'); } public function __set($name, $value) { $this->logEvent('UniversalPOPGadget::__set(' . $name . ', ' . $value . ')'); } public function __isset($name) { $this->logEvent('UniversalPOPGadget::__isset(' . $name . ')'); } public function __unset($name) { $this->logEvent('UniversalPOPGadget::__unset(' . $name . ')'); } public function __sleep() { $this->logEvent('UniversalPOPGadget::__sleep()'); return array(); } public function __wakeup() { $this->logEvent('UniversalPOPGadget::__wakeup()'); $this->logEvent(" [!] Defined classes:"); foreach(get_declared_classes() as $c) { $this->logEvent(" [+] " . $c); } } public function __toString() { $this->logEvent('UniversalPOPGadget::__toString()'); } public function __invoke($param) { $this->logEvent('UniversalPOPGadget::__invoke(' . $param . ')'); } public function __set_state($properties) { $this->logEvent('UniversalPOPGadget::__set_state(' . implode(',', $properties) . ')'); } public function __clone() { $this->logEvent('UniversalPOPGadget::__clone()'); } public function __debugInfo() { $this->logEvent('UniversalPOPGadget::__debugInfo()'); } }} ?> 0×03 PHP检测

    0×08 注意事项/陷阱

    UniversalPOPGadget::__wakeup() [!] Defined classes: [...Snipped...] UniversalPOPGadget::__get(sections) UniversalPOPGadget::__isset(version) UniversalPOPGadget::__isset(author) UniversalPOPGadget::__isset(requires) UniversalPOPGadget::__isset(tested) UniversalPOPGadget::__isset(homepage) UniversalPOPGadget::__isset(downloaded) UniversalPOPGadget::__isset(slug) UniversalPOPGadget::__get(sections) UniversalPOPGadget::__get(sections) UniversalPOPGadget::__isset(banners) UniversalPOPGadget::__get(name) UniversalPOPGadget::__get(sections) UniversalPOPGadget::__isset(version) UniversalPOPGadget::__isset(author) UniversalPOPGadget::__isset(last_updated) UniversalPOPGadget::__isset(requires) UniversalPOPGadget::__isset(tested) UniversalPOPGadget::__isset(active_installs) UniversalPOPGadget::__isset(slug) UniversalPOPGadget::__isset(homepage) UniversalPOPGadget::__isset(donate_link) UniversalPOPGadget::__isset(rating) UniversalPOPGadget::__isset(ratings) UniversalPOPGadget::__isset(contributors) UniversalPOPGadget::__isset(tested) UniversalPOPGadget::__isset(requires) UniversalPOPGadget::__get(sections) UniversalPOPGadget::__isset(download_link)

    为了简化这个过程,我编写了一个PHP类,它定义了所有魔术方法并且在调用任何魔术方法时将详细信息写入日志文件。特别有趣的是魔术方法__get()和__call(),如果应用程序尝试获取不存在的属性或调用该类中不存在的方法时就会调用以上魔术方法,前者可以用来识别在payload object上设置的属性,以便操纵并使用这些属性的代码,而后者可以用来识别POP小工具触发使用的非魔术方法(并且可以将它们自身用作POP小工具)。

    我开始修改这些对象的属性并刷新相关的WordPress页面,来测试修改内容对结果页面有何影响(如果有的话)。在有些情况下WordPress使用了HTML编码来防止HTML/Java注入,但是最终我发现了几个可以插入任意HTML和Java的字段。请记住这个情况是发生在管理界面内,如果管理员登录并浏览“更新”或“插件”页面,攻击者就能够对WordPress站点执行MitM攻击或DNS欺骗,也可能会利用此漏洞实现远程代码执行。

    0×07 解答

    该类的__wakeup ()方法还使用了get_declared_classes ()函数来检索和记录可以利用exploit payload的已声明类的列表(虽然这不会反映当前未声明但可以自动加载的类)。

    这个插件的问题在于发送明文HTTP请求,并且将该请求响应传递给了unserialize ()函数。就真实攻击而言,它并不是最佳入口点,但是如果我能通过这种微不足道的方式向unserialize ()函数提供输出来触发代码的话,这就足够了!

    $url = 'http://api.wordpress.org/plugins/info/1.0/'; $response = wp_remote_post ($url, array ('body' => $request)); $plugin_info = @unserialize ($response ['body']); if (isset ($plugin_info->ratings)) {

    0×05 Sections属性?