代码审计-lmxcms(梦想CMS)

admin 2023年12月17日09:26:46评论57 views字数 2545阅读8分29秒阅读模式
介绍
梦想cms以下简称“lmxcms”,是由“10年”(网名)开发的一套简单实用的网站管理系统(cms)。它采用的是MVC模型搭建
源码搭建
代码审计-lmxcms(梦想CMS)

我这里还是采用小皮面板搭建

代码审计-lmxcms(梦想CMS)

创建好后访问/install目录安装即可

漏洞挖掘
代码审计-lmxcms(梦想CMS)

MVC基础

由于是第一篇MVC模型的CMS审计,简单介绍一下

MVC处理流程

  1. Controller截获用户发出的请求;

  2. Controller调用Model完成状态的读写操作;

  3. Controller把数据传递给View;

  4. View渲染最终结果并呈献给用户。

网上的图

代码审计-lmxcms(梦想CMS)

我们使用IDA查看它的源码

代码审计-lmxcms(梦想CMS)

c/下是控制器

存放网站功能的调用文件

代码审计-lmxcms(梦想CMS)

m/下是模块

存放网站功能的调用文件的具体实现

代码审计-lmxcms(梦想CMS)

template/下是视图

存放我们执行结果后的返回页面

代码审计-lmxcms(梦想CMS)

我们首页访问

http://lmxcms14:86/index.php?m=content&a=index&classid=11&id=8

推导出它的代码段
m=content,控制器名为content,我们在前端文件中找

代码审计-lmxcms(梦想CMS)

a=index,模块名为index,我们寻找index方法

代码审计-lmxcms(梦想CMS)

它调用contents模块,我们可以跟一下

代码审计-lmxcms(梦想CMS)

这就是前端代码的实现,那也就是说我们找对了

&classid=11&id=8,这两个就是index下的参数了

我们可以尝试输出点东西,来判断是否是这段代码调用。

代码审计-lmxcms(梦想CMS)

代码审计-lmxcms(梦想CMS)

成功输出

漏洞一:代码执行

我们通过eval关键词全局搜索

代码审计-lmxcms(梦想CMS)

定位到AcquisiAction.class.php文件的对应代码段

代码审计-lmxcms(梦想CMS)

eval中有两个变量,$data值是$temdate['data'],那么我们就是看$temdate['data']我们能否可控。

$temdata = $this->model->caijiDataOne($_GET['cid']);

发现$temdata的值是caijiDataOne执行cid的结果,我们跟一下caijiDataOne()

代码审计-lmxcms(梦想CMS)

发现它这里好像有执行sql语句,根据注释也可知,它这里会根据我们传入的id值进行数据的读取,它这里有执行个cj_data_tab();,我们跟一下

代码审计-lmxcms(梦想CMS)

发现它指向一个数据表,我们打开数据库看一下

代码审计-lmxcms(梦想CMS)

那我们的cid接收的就是这个表的id值,data就是表中的data,这样大概的逻辑我们就清楚了

根据文件构造url访问

http://lmxcms14:86/admin.php?m=Acquisi&a=showCjData

提示sql语句错误,那我们把a的值删掉,来到对应功能点

代码审计-lmxcms(梦想CMS)

其实这个功能点,在代码的注释中已经提示了,我们直接进入后台就能看到

代码审计-lmxcms(梦想CMS)

它是在数据库中取数据嘛,我们尝试添加,它这里是要添加采集后,创建节点,最后采集数据,采集完成后看下数据库

代码审计-lmxcms(梦想CMS)

数据已经有了,我们要修改一下data的值,修改后的值为

代码审计-lmxcms(梦想CMS)

我们来看一下eval执行的语句

eval('$data = '.$temdata['data'].';');

修改后的值为,点是连接符,我这里去掉

eval('$data = '1;phpinfo();//';');

分号的作用是把前面的代码闭合,两斜杠是注释后面的代码,执行语句就会变成

eval($data = 1;phpinfo(););

我们构造访问地址:

http://lmxcms14:86/admin.php?m=Acquisi&a=showCjData&cid=1

爆sql语句错误,我们复制它这里块功能点的url

代码审计-lmxcms(梦想CMS)

http://lmxcms14:86/admin.php?m=Acquisi&a=caijiDataList&lid=2&id=2

发现还有lid和id两个参数,我们回到代码中查看

$cjData = $this->model->getOneCjData($this->lid);$jdData = $this->model->getOne($this->id);

其实这里只要加上这两个值就行了,我们也可以跟一下getOneCjData和getOne看下获取的是哪个表的值

getOneCjData

代码审计-lmxcms(梦想CMS)

再跟

代码审计-lmxcms(梦想CMS)

查看lmx_cj_list表

代码审计-lmxcms(梦想CMS)

对应上了

getOne的看法一样

那我们的完整url就是

http://lmxcms14:86/admin.php?m=Acquisi&a=showCjData&cid=1&lid=2&id=2

代码审计-lmxcms(梦想CMS)

漏洞存在

漏洞二:代码执行

在网站后台存在模板功能,通常这种模板功能比较容易产生漏洞,我们打开看下

代码审计-lmxcms(梦想CMS)

通过内容可以发现是首页的文件

代码审计-lmxcms(梦想CMS)

我们根据url访问对应文件

代码审计-lmxcms(梦想CMS)

可以发现它这里使用了smarty,我们使用php标签插入php代码

代码审计-lmxcms(梦想CMS)

访问首页

代码审计-lmxcms(梦想CMS)

漏洞存在

漏洞三:后台sql注入

其实就是在我们第一处命令执行那里

代码审计-lmxcms(梦想CMS)

从我们前面跟的流程来看,它这三次接收的产生,好像没做过滤就带入的数据库中,而且是数字型

我们尝试注入一下

and 1=2发现报错

代码审计-lmxcms(梦想CMS)

1=1正常

代码审计-lmxcms(梦想CMS)

那么就可以确定存在注入了

poc:http://lmxcms14:86/admin.php?m=Acquisi&a=showCjData&id=2&lid=2&cid=1%20and%20updatexml(1,concat(0x3a,(select%20user())),1)

代码审计-lmxcms(梦想CMS)

漏洞存在

漏洞四:任意文件删除

全局搜索unlink(

代码审计-lmxcms(梦想CMS)

找到BackdbAction.class.php中的代码段

代码审计-lmxcms(梦想CMS)

查看一下谁使用了这个delOne

代码审计-lmxcms(梦想CMS)

点第一处查看

代码审计-lmxcms(梦想CMS)

delbackdb使用了删除函数,然后它这里好像也没有对filename做检测

代码审计-lmxcms(梦想CMS)

我们在delone中echo一下$dir

我们构造访问地址

http://lmxcms14:86/admin.php?m=Backdb&a=delbackdb&filename=1

代码审计-lmxcms(梦想CMS)

我们在网站后台创建个文件

代码审计-lmxcms(梦想CMS)

我们向上跳转两级到根目录,再跟上要删除的文件

poc:http://lmxcms14:86/admin.php?m=Backdb&a=delbackdb&filename=../../c/admin/caigo.txt

代码审计-lmxcms(梦想CMS)

代码审计-lmxcms(梦想CMS)

文件删除成功,漏洞存在,我们可以删除install/install_ok.txt文件,这样网站就会重新安装,这样新的管理员账号密码不就由我们控制。

代码审计-lmxcms(梦想CMS)

最后
代码审计-lmxcms(梦想CMS)
这套源码虽然采用MVC模型,但是相对简单,代码流程不长,系统中还有不少漏洞,适合小白练手。

原文始发于微信公众号(菜狗安全):代码审计-lmxcms(梦想CMS)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月17日09:26:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   代码审计-lmxcms(梦想CMS)http://cn-sec.com/archives/2309694.html

发表评论

匿名网友 填写信息