基于thinkphp3的cms代码审计

初期工作

介绍

YxtCMF在线学习系统是一个以thinkphp+bootstrap为框架进行开发的网络学习平台系统。

下载

百度搜索yxtcmf,有很多下载链接,这里就不贴过来了

搭建

将源码放在根目录下,访问有安装向导

(这里一开始用php5.4版本,后面注册用户的时候报错,换成7.0好了)

了解结构

├─admin                 后台目录
├─application           应用目录
├─data                  缓存目录
├─Expand                存放软件目录
├─plugins               存放插件目录
├─public                WEB目录(对外访问目录)
├─themes                前端文件存放目录
├─ueditor               ueditor编辑器目录
├─update                更新目录
├─uploads               上传文件目录
├─yxtedu                系统目录

这里特别说一下,我一般接触到前台用户和后台管理员都是分隔在不同表的,此处在同一表下。其实建在一张表中是没问题的,用户和权限分表设计,之后通过用户id进行表间的关联

漏洞

文件上传

前台注册用户后,可以上传头像,黑盒测试发现应该是会对后缀名进行禁用。

好家伙,发现是白名单,只让传这几个后缀,还是比较难利用的

目录遍历

通过seay发现多处直接使用readfile函数,经审计发现此处的$file可以利用

function downmoban(){
		$name=htmlspecialchars($_GET['name']);
		$dir= dirname(dirname(dirname(dirname(__FILE__))));
		$file=$dir.'/Uploads/'.$name;  
		if(is_file($file)){
			$length = filesize($file);
			$showname =  ltrim(strrchr($file,'/'),'/');
			header("Content-Description: File Transfer");
			header('Content-Length:' . $length);
			 if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) {
				 header('Content-Disposition: attachment; filename="' . rawurlencode($showname) . '"');
			 } else {
				 header('Content-Disposition: attachment; filename="' . $showname . '"');
			 }
			 readfile($file);
			 exit;
		} else {
			 exit('文件已被删除!');
		} 
      }

$file由$name拼接而成,而name变量直接由get传参,且未经过任何处理

可以进行任意文件读取

代码写入

网站信息|添加url规则 处可以添加路由,代码本身逻辑没有问题

但是由于插入的代码未作任何过滤直接插入到数据库中,导致任意代码写入漏洞,危害性较大

此处跟进了特别多的函数和方法,就不全程跟进了

先获取到表名

再插入到数据库中

可以看到数据库只在if中进行了数组,包含exp,不为空,过滤非标量数据的判断,一句话代码还是可以写入到路由中

成功连接

原文地址:https://www.cnblogs.com/karsa/p/14106798.html