太强了了,前排膜
前言
最近渗透测试某站点的时候触发了一个报错,然后发现了站点使用的CMS,百度了一下是一个国产开源的企业级CMS。从官网拉下来审了一下,再此记录一下
入口
下面是index.php入口文件
<?php
if( !file_exists(dirname(__FILE__) . "/include/config.db.php") )
{
header("Location:install/index.php");
exit();
}
require_once( "include/common.inc.php" );
$mod = str_replace( '../', '', $mod );
if( empty( $mod ) )
{
$mod = 'index';
}
$action_file = WEB_INCLUDE . '/action/' . $mod . '.php';
file_exists($action_file) && require_once($action_file);
$cls_tpl = cls_app:: get_template( $mod );
$cls_tpl->display();
?>
很常见的cms入口形式,但是可以注意到第八行将../替换为空,这里怀疑会不会存在目录穿越,可以采用..././这样的形式来穿越到上一层。但是第15行限制了后缀必须为php,且由于前缀也被限制于是不能使用zip伪协议拿shell,如果php版本为5.2可以采用00截断包含任意文件,这里暂时卡住,继续审计,第2行应该为配置文件略过,跟进第7行的common.inc.php
common.inc.php开头先定义了许多常量,然后更改了一些php配置,接着又引入了两个文件,跟进发现配置了一些变量,先不管,继续向下审计common.inc.php
<?php
$req_data = array();
foreach( array('_GET', '_POST', '_COOKIE') as $_request )
{
foreach( $$_request as $_k => $_v )
{
${$_k} = _get_request($_v);
if( '_COOKIE' != $_request )
{
$req_data[$_k] = _get_request($_v);
}
}
}
unset($_GET, $_POST);
?>
上面代码可以很明显的发现,cms把$_GET,$_POST,$_COOKIE注册为了全局变量。所以之后可能存在变量覆盖,之后的代码引入了全局函数和全局类。这时候CMS入口以审计结束,可以开始审计函数和类
重安装漏洞(Getshell)
由于安装文件一般是漏洞的重灾地,于是这里直接跳到了安装文件,果然找到了漏洞点。
在install_action.php中,安装完成后会把前端文件重命名,但是后端逻辑文件依旧存在,所以如果知道安装文件位置即可重安装
<?php
function install_end()
{
点击收藏 | 0
关注 | 1