title: Phpmyadmin 2.x-反序列化漏洞date: 2021/2/13 20:46:25
categories: 代码审计
tags: 代码审计
https://rj45mp.github.io/phpMyAdmin-WooYun-2016-199433/
漏洞简介:
phpmyadmin 2.x版本中存在溢出反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行代码。
漏洞影响:
phpmyadmin 2.x
漏洞原理分析:
什么是序列化和反序列化:
序列化(serialize):将对象的状态信息保存为字符串,可以传输或存储形式的过程。在序列化期间,对象将其当前状态写入临时或持久性存储区。简单的说:将php中的对象,类,数组,变量,匿名函数等,转换为字符串,方便存储在数据库或传输。以后,就可以从存储区读取序列化后的字符串,再将期反序列化,还原对象状态,重新创建该对象。
如上图所示,将对象$students1序列化后的结果是
O:8:”students”:3:{s:4:”name”;s:6:”avicii”;s:3:”age”;s:2:”28”;s:3:”sex”;s:5:”woman”;}
反序列化(unserialize):序列化是将对象的信息保存为字符串,那么反序列化就是将对象序列化后的结果将期还原,重新创建对象状态信息。
利用方法:
当使用序列化或者反序列化的函数进行操作时,如果其中出现了可控变量,那么我们可以利用变量尝试调用对象中的魔术方法,对对象中的变量值进行覆盖自定义 实现攻击。主要依靠本地序列化构造出有害的序列化值。
主要我们本地构造出序列化的值通过参数传递进去触发对象其中的魔术方法,将我们序列化的值进行反序列化。
危害:
对用户输入的数据进行检测,导致攻击者可以控制反序列化的过程,从而导致代码执行,sql注入,文件读取,目录遍历。
常见魔术方法:
__construct 对象创建时自动调用
__destruct 对象销毁时自动调用
__wakeup 在使用unserializa函数时自动调用,对象被序列化后自动调用
__toString 方法用于一个类被当作字符串时触发
Phpmyadmin 2.x-反序列化漏洞漏洞分析:
首先定位unserialize函数,发现在scripts\setup.php下
第28行使用了unserialize函数反序列化函数,对POST传参的字符串进行反序列化操作,在对象从创建到销毁的过程中,会自动触发某些魔术方法。
所以我们应该跟进控制点,看看哪些对象的实例化会被调用某些魔术方法。
我们发现setup.php使用require_once函数引进./libraries/common.lib.php
跟进查看
发现又包含了/libraries/Config.class.php,再次跟进查看
在PMA_Config类中
发现在279行使用了__wakeup()方法,此方法当字符串被序列化后会自动调用,即使用unserialize会自动调用 触发方法。
可以看出当满足if条件中某一个条件就可以往下执行,我们先跟进load()函数,
当检测出定义了file_get_contents函数,使用eval函数执行file_get_contents读取的内容;如果没有file_get_contents函数使用implode函数把文件内容\n拼接,在执行eval函数。
所以我们利用思路:
大致流程
传入序列化对象值->反序列化->触发__wakeup->load函数执行->进入if判断->eval执行getSource方法->source参数
就是访问到setup.php这个文件地中然后满足if条件判断post传参configuration,action不等于clear,执行到unserialize触发__wakeup魔术方法,同时实例化对象PMA_Config,而我们发现控制点在load函数中,我们则只需要传入形参source和对应的特定数据即可
我们构造poc
<?php
class PMA_Config{
public $source="D:/phpstudy/www/I.php";
}
$result=new PMA_Config();
echo serialize($result);
?>
O:10:”PMA_Config”:1:{s:6:”source”;s:21:”D:/phpstudy/www/I.php”;}