几个月前,我正在编写一篇关于PHP反序列化缝隙的博客文章,决定为这篇文章找一个实在方针,能够让我将测试数据传输给PHP unserialize ()函数来完结演示意图。所以我下载了一批WordPress插件,并开端经过grepping来寻觅调用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)) {
这个插件的问题在于发送明文HTTP恳求,而且将该恳求呼应传递给了unserialize ()函数。就实在进犯而言,它并不是更佳进口点,可是假如我能经过这种微乎其微的办法向unserialize ()函数供给输出来触发代码的话,这就足够了!
0×01 PHP反序列化进犯
简略来说,当进犯者能够将他的数据供给给应用程序,而该应用程序将数据转化为运转目标时没有作恰当验证的时分就会呈现反序列化缝隙。假如进犯者数据被答应去操控运转目标的特点,那么进犯者就能够操作任何运用这些目标特点的代码履行流程,就有或许运用它建议进犯。这是一种称为面向特点编程(POP)的技能,一个POP小工具是能够经过这种办法操控任何代码片段,开发完结是经过向应用程序供给特制目标,以便在这些目标进行反序列化的时分触发一些有用的行为。假如想了解更多概况的话,能够参看我的博客文章《Attacking Java Deserialization》(https://nickbloor.co.uk/2019/08/13/attacking-java-deserialization/),其间的一般概念适用于任何根底技能。
在PHP应用程序的现状来看,POP小工具最为人熟知和最牢靠的原因在于类的__wakeup()办法(PHP“戏法办法”,unserialize()函数会查看是否存在__wakeup(),假如存在,则会先调用__wakeup()办法,预先预备目标需求的资源),假如一个类界说了__wakeup()办法,那么不管何时该类的某个目标运用了unserialize ()函数进行反序列化都能确保__wakeup()办法被调用,别的一个原因是__destruct ()办法(当创立的目标被毁掉或遇到PHP完毕符号的时分,比方程序现已履行完毕,目标会主动调用__destruct()履行一些相应的操作,能够自行界说),例如PHP脚本履行完结时(未发作丧命过错),当反序列化目标超出范围时仍简直能够确保__destruct ()办法被调用。
除了__wakeup ()和__destruct ()办法之外, PHP还有其他“戏法办法”,能够在类中界说,也能够在反序列化之后调用,这取决于反序列化目标的运用办法。在一个更大更杂乱的应用程序中或许很难追寻到反序列化目标在哪里完毕以及怎么来运用它或调用那些办法,所以确认那些类能够用于PHP反序列化缝隙运用也很困难,由于相关文件或许未包含在进口点,或许一个类的主动加载器(例如spl_autoload_register()函数)或许以及被注册来进一步混杂。
0×02 通用的PHP POP小工具
为了简化这个进程,我编写了一个PHP类,它界说了一切戏法办法而且在调用任何戏法办法时将详细信息写入日志文件。特别风趣的是戏法办法__get()和__call(),假如应用程序测验获取不存在的特点或调用该类中不存在的办法时就会调用以上戏法办法,前者能够用来辨认在payload object上设置的特点,以便操作并运用这些特点的代码,而后者能够用来辨认POP小工具触发运用的非戏法办法(而且能够将它们本身用作POP小工具)。
该类的__wakeup ()办法还运用了get_declared_classes ()函数来检索和记载能够运用exploit payload的已声明类的列表(尽管这不会反映当时未声明但能够主动加载的类)。
if(!class_exists("UniversalPOPGadget")) {
class UniversalPOPGadget {
private function logEvent($event) {
file_put_contents('UniversalPOPGadget.txt', $event . "rn", FILE_APPEND);
}
public function __construct() { $this->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()'); }
}}
[1] [2] [3] 黑客接单网
这个Ruby结构包括一些能够浸透测验WordPress网站和体系的模块,用户也能够自己开发模块扩展其功用。 运转它需求什么条件? 保证体系上装置了Ruby 2.2.x,翻开一个指令行窗口,切换当时目录...
无文件进犯是当时较为常见的一种进犯手法,歹意软件经过其payload来躲避检测,而无需在磁盘上编写可履行文件。无文件履行最常见的技能之一是代码注入——进犯者不需要直接履行歹意软件,而是将歹意软件代码注...
研究者在HackingTeam上发现了新开发的Mac歹意软件,这项发现促进了投机活动。自从上一年七月以来,这款臭名远扬的歹意软件造成了数Gbytes集团私家邮件和源代码的流出,现在这款软件作者再次出...
问题描述: 假如用户输入的数据在未经处理的情况下刺进到一条SQL查询句子,那么运用将很可能遭受到SQL注入进犯,正如下面的比如: $unsafe_variable = $_POST['user_in...
这是一款根据谷歌搜索引擎的自动化爬虫。 爬虫介绍 爬虫大体机制便是: 先进行一次谷歌搜索,将成果解析为特定格局,然后再提供给exp运用。 我们能够测验运用–help来列出一切参数。 这个项目笔者会持...
在逻辑缝隙中,恣意用户暗码重置最为常见,或许出现在新用户注册页面,也或许是用户登录后重置暗码的页面,或许用户忘掉暗码时的暗码找回页面,其间,暗码找回功用是重灾区。我把日常浸透过程中遇到的事例作了缝隙成...