21-PHP代码审计——jizhicms1.9.5文件上传漏洞
Posted songly_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21-PHP代码审计——jizhicms1.9.5文件上传漏洞相关的知识,希望对你有一定的参考价值。
影响版本:
jizhicms_Beta1.9.5
漏洞环境:
php5.6.27
jizhicms_Beta1.9.5
本次分析4月份左右jizhicms的1.9.5版本爆出来的文件上传漏洞。
文件上传漏洞点在后台的扩展管理 --> 插件列表中,如下所示
选择一个插件点击下载,burpsuite工具抓到如下数据
post请求包有一个下载插件的url,并且这个下载的url是可控的,上传的漏洞点也是由这个url触发的,漏洞产生的具体原因继续分析update方法。
然后根据post请求的找到PluginsController中的update方法
//更新插件
function update(){
//对提交的数据过滤
$filepath = $this->frparam('filepath',1);
if(strpos($filepath,'.')!==false){
JsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患!'));
}
if($filepath){
if($this->frparam('action',1)){
$action = $this->frparam('action',1);
// 自己获取这些信息,获取download的url地址
$remote_url = urldecode($this->frparam('download_url',1));
$remote_url = strpos($remote_url,'?')!==false ? $remote_url.'&version='.$this->webconf['web_version'] : $remote_url.'?version='.$this->webconf['web_version'];
$file_size = $this->frparam('filesize',1);
//临时的插件下载路径
$tmp_path = Cache_Path."/update_".$filepath.".zip";
switch ($action) {
case 'prepare-download':
$code = 0;
ob_start();
$ch=curl_init($remote_url);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_NOBODY,1);
$okay=curl_exec($ch);
curl_close($ch);
$head=ob_get_contents();
ob_end_clean();
$regex='/Content-Length:\\s([0-9].+?)\\s/';
$count=preg_match($regex,$head,$matches);
$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0;
JsonReturn(array('code'=>0,'size'=>$filesize));
break;
case 'start-download':
// 这里检测下 tmp_path 是否存在
try {
set_time_limit(0);
touch($tmp_path);
// 做些日志处理
//打开下载url的文件开始下载
if ($fp = fopen($remote_url, "rb")) {
if (!$download_fp = fopen($tmp_path, "wb")) {
exit;
}
while (!feof($fp)) {
if (!file_exists($tmp_path)) {
// 如果临时文件被删除就取消下载
fclose($download_fp);
exit;
}
//将下载的文件写入到本地临时下载路径
fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);
}
//关闭文件流,到这一步已经下载完成
fclose($download_fp);
fclose($fp);
update函数内部只是单纯的检查了download_url的url格式是否正确,没有进一步校验url来源的合法性,接着就开始创建临时的下载路径并下载download_url指定的插件,因此攻击者可以将url指定为特定的远程服务器的url下载恶意文件。
这里为了方便演示,将download_url格式指定为另一个站点的插件,可以看到响应消息页面上传成功。
漏洞分析完毕。
以上是关于21-PHP代码审计——jizhicms1.9.5文件上传漏洞的主要内容,如果未能解决你的问题,请参考以下文章