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

访客5年前关于黑客接单1678

几个月前,我正在编写一篇关于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]  黑客接单网

相关文章

几个不错且免费的Web安全解决方案

朋友:有什么的免费的网站安全解决方案,或者说产品么? 黑客接单渠道:当然有啊!不光免费,还很好用呢! 朋友:那还不赶忙和我说说?我小网站买不起WAF,免费的好用的话我就用下啊! 黑客接单渠道:那等下,...

2019 神盾杯 final Writeup(二)-黑客接单平台

前语 接之前的剖析文章,本篇文章将2019 神盾杯线下赛后续两道web题也解析一下。 web3 预置后门扫描 翻开源码发现是干流cms typecho,先上东西扫一波: 一起注意到版别号: 依...

深化了解Json Web Token之实战篇

原本想用python DRF 的 JWT做,后来各种失利。终究尝试了用Php,发现十分便当。 PHP 版别 PHP 7.2.4-1+b2 (cli),也便是kali linux自带的php,至于com...

恣意用户暗码重置(三):用户混杂

在逻辑缝隙中,恣意用户暗码重置最为常见,或许出现在新用户注册页面,也或许是用户登录后重置暗码的页面,或许用户忘掉暗码时的暗码找回页面,其间,暗码找回功用是重灾区。我把日常浸透过程中遇到的事例作了缝隙成...

HTTPie:WEB开发调试东西

还在用wget和curl?试试HTTPie吧  :) HTTPie (读作aych-tee-tee-pie)是指令行方法的HTTP客户端。可经过简略的http指令,可合作语法发送恣意HTTP恳求数据,...

Java Web 工程源代码安全审计实战,第 1 部分: 跨站 XSS

 Java Web 运用安全问题日益严峻。源代码审计能够防备于未然。源代码审计人员要经过实战审计练习,才干熟练掌握 Java Web 源代码安全思路和技巧。 前语 Web 运用是互联网运用的重要方式...