PHP审计之WeEngine审计

PHP审计之WeEngine审计前言审计该CMS加深一下对于MVC架构的php审计流程梳理路由打开代码看到index.php文件if($_W['os']=='mo

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

PHP审计之WeEngine审计

前言

审计该CMS加深一下对于MVC架构的php审计流程

梳理路由

打开代码看到index.php文件

if($_W['os'] == 'mobile' && (!empty($_GPC['i']) || !empty($_SERVER['QUERY_STRING']))) {
	header('Location: ./app/index.php?' . $_SERVER['QUERY_STRING']);
} else {
	header('Location: ./web/index.php?' . $_SERVER['QUERY_STRING']);
}

web端会跳转到/web/index.php,来看到web/index.php

if (($_W['setting']['copyright']['status'] == 1) && empty($_W['isfounder']) && $controller != 'cloud' && $controller != 'utility' && $controller != 'account') {
	$_W['siteclose'] = true;
	if ($controller == 'account' && $action == 'welcome') {
		template('account/welcome');
		exit;
	}
	if ($controller == 'user' && $action == 'login') {
		if (checksubmit()) {
			require _forward($controller, $action);
		}
		template('user/login');
		exit;
	}
	isetcookie('__session', '', -10000);
	message('站点已关闭,关闭原因:' . $_W['setting']['copyright']['reason'], url('account/welcome'), 'info');
}

这里$controller$action接收是从bootstrap.inc.php

$controller = $_GPC['c'];
$action = $_GPC['a'];
$do = $_GPC['do'];

上面接收$controller$actionaccountwelcome

调用template('account/welcome');

function template($filename, $flag = TEMPLATE_DISPLAY) {
	global $_W;
	$source = IA_ROOT . "/web/themes/{$_W['template']}/{$filename}.html";
	$compile = IA_ROOT . "/data/tpl/web/{$_W['template']}/{$filename}.tpl.php";
	if(!is_file($source)) {
		$source = IA_ROOT . "/web/themes/default/{$filename}.html";
		$compile = IA_ROOT . "/data/tpl/web/default/{$filename}.tpl.php";
	}
    ...

这段代码实际上就是加载一个模板渲染。

继续往下看

$controllers = array();
$handle = opendir(IA_ROOT . '/web/source/');
if(!empty($handle)) {
	while($dir = readdir($handle)) {
		if($dir != '.' && $dir != '..') {
			$controllers[] = $dir;
		}
	}
}
if(!in_array($controller, $controllers)) {
	$controller = 'account';
}
$init = IA_ROOT . "/web/source/{$controller}/__init.php";
if(is_file($init)) {
	require $init;
}

$actions = array();
$handle = opendir(IA_ROOT . '/web/source/' . $controller);
if(!empty($handle)) {
	while($dir = readdir($handle)) {
		if($dir != '.' && $dir != '..' && strexists($dir, '.ctrl.php')) {
			$dir = str_replace('.ctrl.php', '', $dir);
			$actions[] = $dir;
		}
	}
}
if(empty($actions)) {
	header('location: ?refresh');
}
if(!in_array($action, $actions)) {
	$action = $acl[$controller]['default'];
}
if(!in_array($action, $actions)) {
	$action = $actions[0];
}

遍历读取/web/source/,所有内容。

遍历读取/web/source/' . $controller,并且把内容中的.ctrl.php去掉。

if(is_array($acl[$controller]['direct']) && in_array($action, $acl[$controller]['direct'])) {
		require _forward($controller, $action);
	exit;

判断是否为数组并且判断$acl[$controller]['direct'],并且查看$action是否在$acl截取对应$controllerdirect

逻辑其实就是$acl中定义了大量的数组,如

'account' => array(
		'default' => 'welcome',
		'direct' => array(
			'welcome',
			'auth'
		)

$controller=account

direct=array(‘welcome’,’auth’)

direct这个数组对应的是account下面的路由

访问welcome的路由的访问策略即

/web/index.php?c=account&a=welcome

漏洞审计

定位到漏洞位置web/source/site/category.ctrl.php

定位到176行

if (!empty($navs)) {
		foreach ($navs as $row) {
			file_delete($row['icon']);
		}
		pdo_query("DELETE FROM ".tablename('site_nav')." WHERE id IN (".implode(',', array_keys($navs)).")");
	}

file_delete($row['icon']);,这里的$row['icon']是通过遍历$navs

$navs是通过一下这个sql语句查询得来的

$navs = pdo_fetchall("SELECT icon, id FROM ".tablename('site_nav')." WHERE id IN (SELECT nid FROM ".tablename('site_category')." WHERE id = {$id} OR parentid = '$id')", array(), 'id');

找看数据库中的这两个字段是否可控

site_nav数据库表中对应的数据是$nav变量内容,发现 $nav['icon'] 变量是从$_GPC['iconfile']来的,即参数可控。这里的 $nav['icon']变量,其实就是我们文章开头分析的传入 file_delete函数的参数

			if(!empty($nav_exist)) {
				pdo_update('site_nav', $nav, array('id' => $category['nid'], 'uniacid' => $_W['uniacid']));
			} else {
				pdo_insert('site_nav', $nav);

这里需要先把文件名插入到数据库中,然后调用该功能将文件上传,代码会从数据库从查找该文件名,然后删除对应文件。

参考

https://github.com/hongriSec/PHP-Audit-Labs/tree/master/Part1/Day6/files

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119836.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Activity 工作流配置「建议收藏」

    Activity 工作流配置「建议收藏」一、什么是工作流工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。工作流管理系统(WorkflowManagementSystem,WfMS)是一个软件系统,它完成工作量的定义和管理,…

    2022年5月25日
    91
  • linux 下 route命令,linux route命令详细说明和使用「建议收藏」

    linux 下 route命令,linux route命令详细说明和使用「建议收藏」linux下的route命令,虽然在嵌入式开发中很少用到,但当涉及到简单静态路由开发时,还是有用的。此外,在配置linux网络时也有可能用到。本文旨在了解linuxroute命令及其使用。作用route命令用于查看和配置linux内核路由表,也就是用来查看和配置linux的静态路由表。描述route命令操作基于linux内核路由表,它的主要作用是创建一个静态路由让指定的一个主机或者一个网络通过…

    2022年7月18日
    14
  • 科研方法与学术论文写作_科技论文写作与发表教程第八版pdf

    科研方法与学术论文写作_科技论文写作与发表教程第八版pdf导读:本文推荐四个学术英语写作用到的网站/插件,让你的表达更地道,更多样,减少错误。它们分别是:AcademicPhrasebank,Linggle,collocaid,grammely。1.AcademicPhrasebank网址:http://www.phrasebank.manchester.ac.uk/这个网站提供论文各部分的模版,如介绍怎么写,总结怎么写,如何描述方法,报告细节等。比如现在需要在文章中举例,可以点击GivingExamples,点击页面显示的各项内容.

    2022年10月29日
    0
  • 深度学习基础之-2.6标签值归一化

    深度学习基础之-2.6标签值归一化提出问题在计算Loss时,会达到172.287,337.246这样大的数值,一般Loss都应该小于1.解决问题标签值也归一化公式如下:(1)ynew=y−yminymax−ymin=y−yminyrangey_{new}=\frac{y-y_{min}}{y_{max}-y_{min}}=\frac{y-y_{min}}{y_{range}}\tag{1}ynew​=ymax​−…

    2022年10月10日
    0
  • CAN总线详解

    1、简介CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。优点:传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。近些年来,CAN控制器价格越来越低。Ø低成本:ECUs通过单个CAN接口进行通信,布线成本低。Ø高集成:CAN总线系统允许在所有ECUs上进行集中错误诊…

    2022年4月6日
    81
  • js中数组截取方法

    js中数组截取方法slice()vararray=[1,5,3,9,8];varcut=array.slice(1,4);console.log(cut);打印出的结果是[5,3,9]值得注意的是,slice()不会操作原有数组,所以打印array的话,是不会变的vararray=[1,5,3,9,8];varcut=array.slice(1,4);console.log(cut);console.log(array);打印结果是[5,3,9][1,5,

    2022年5月27日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号