【代码审计】lmxcmsv1.4漏洞复现

概要

复现环境:PHP5.6.9,MySQL5
使用工具:PHPstrom,PHPstudy
lmxcms使用MVC架构模式相对于原生PHP代码较为难懂
本文以代码审计初学者的角度来叙述漏洞点,以及详细的两个RCE漏洞复现过程
CNVD编号:CNVD-2019-05679,CNVD-2019-05678

MVC代码审计流程

  • 根据前端页面链接找好在后台中对应的目录,文件,以及函数
  • 搜索关键功能点,例如:eval, select, include/require等
  • 根据已知漏洞点找到对应位置,重新构建url(复现nday的话)

复现过程

前置基础内容

该源码的目录结构如下图所示
在这里插入图片描述
相较于传统的原生php代码来说,第一眼看上去肯定是两眼一黑,所以我们首先要了解什么是MVC
在这里插入图片描述
主要是分为三个模块
Controller处理请求,准备数据,决定如何展示数据
Model处理业务逻辑和数据库逻辑,对于payload的过滤分析一般也在这一层
View负责前端渲染,展示(基本全是静态html文件)

那也就是说View层会是纯粹的前端页面(本文暂且抛开前后端分离),在源码里稍微翻一翻就可以找到符合这一描述的目录
在这里插入图片描述
稍微翻一下就发现里面全是前端三件套(HTML,CSS,JS),这就确定了识图层的位置

如果你比较有经验,看一下目录结构就大概能猜到c是Controller层,m是Model层

当然,这里我们就按初学者的视角来确定一下
在前端上大致点一下,看一下url的变化
在新闻中是这样的url

http://10.104.33.201:86/index.php?m=content&a=index&classid=7&id=4

在这里插入图片描述
进行一下断点调试,因为是index.php,所以直接在index.php中下一个断点,看看具体的变化
在这里插入图片描述
在这里插入图片描述
ide工具很好的帮我们定位到了

$dir : F:/xiaodisec/011/107/lmxcms1.4/c/index/
$classname : ContentAction

那就可以直接定位到/c/index/ContentAction.class.php文件了

在这里插入图片描述
根据上述的url:
/index.php?m=content&a=index&classid=7&id=4

就可以大致猜测一下m指的是文件名,a为函数名,后续为参数变量
修改一下index函数
在这里插入图片描述

public function index(){
        $temModel = new parse($this->smarty);
        echo $temModel->contents($this->id,$this->classid,$this->contentModel);
        echo 'hello world';
    }

在这里插入图片描述
在页面的左下角就可以看到输出了,这也验证了我们的猜想就是这个index函数控制主页面的内容

做一下小的思路引导,能不能调用其他函数么(比如我们自己新增一个test函数)
在这里插入图片描述像这样把index的结构复制过来
原因:mvc架构情况下,想要正常显示就要按照代码的逻辑去微调,大刀阔斧的改肯定是会异常的,感兴趣的可以自己试一下

想要访问这个test界面,url就应该写成

http://10.104.33.201:86/index.php?m=content&a=test&classid=7&id=4

在这里插入图片描述正常访问,验证了以上我们所有的猜想

所有前置内容到这里差不多了

漏洞复现

CNVD-2019-05679

既然是RCE漏洞,先找漏洞的入口点,搜索eval
在这里插入图片描述会显示很多文件出来

命令执行函数的要素:

  1. 有命令执行函数eval,exec等
  2. 变量可控

这样去排查和对比
在这里插入图片描述这个$temdata是我们可以直接控制cid的值来实现命令执行
很明显就需要继续看一下具体的赋值过程
追踪caijiDataOne函数
在这里插入图片描述

cj_data_tab函数
在这里插入图片描述
根据注释综合猜测一下就是从cj_data数据库中读取了一条数据,然后赋值给$temdata的,通过eval去执行data字段的内容

在数据库直接构造一条数据测试就可以
在这里插入图片描述
按照这个逻辑,我们当前是处于admin目录下,也就是后台,我们是需要登陆的,要构造的url就应该是/admin.php?m=Acquisi&a=showCjData&id=1&lid=1&mid=1&cid=1

$cjData = $this->model->getOneCjData($this->lid);
$jdData = $this->model->getOne($this->id);
$fieldData = $GLOBALS['allfield'][$jdData['mid']];
$temdata = $this->model->caijiDataOne($_GET['cid']);

根据这块将需要的参数都给上,id和lid都对应着数据库中的id,lid字段
getOne()和getOneCjData()函数都是封装好的sql查询函数,感兴趣的可以继续跟踪一下看看,也是在php中比较常见封装方法

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

在这里插入图片描述
命令执行成功
对于data内容,即1;phpinfo();的解释
最终拼接进入eval执行的语句
eval($data=1;phpinfo();//;);
相当于执行了两条php语句,前一句赋值。用;来隔断执行后面真正我们想要执行的命令,再将后续多余的东西给注释掉就完成了

在回顾CNVD-2019-05679的漏洞描述:
LmxCMS V1.4后台Ac***.cl***.php存在代码执行漏洞。

修复方法:

CNVD-2019-05678

LmxCMS V1.4后台Te***.cl***.php存在代码执行漏洞。攻击者可利用该漏洞发起远程命令执行攻击

有上面的知识,再看这个,那直接猜就可以了
锁定/c/admin/TemplateAction.class.php文件
这个漏洞在源码中很难去审计去了,需要结合前端的手册去看
在使用手册中:http://www.lmxcms.com/doc/
在这里插入图片描述
已经说明了前端可以插入php代码来执行,但是要用规定格式
<{php}> php代码... <{/php}>
找到前端界面测试一下,随便找一个footer,html吧
在这里插入图片描述
插入<{php}> phpinfo() <{/php}>
回到首页
在这里插入图片描述就执行了phpinfo命令

于此,两个漏洞就复现完了

小结

总的来说,就是需要多观察目录结构来定位文件,在根据正则表达式来找功能点,逐步去确定我们能够利用的功能点,需要自己多去尝试不同的可能性
比如上述内容应该还有留言板,就可能存在XSS漏洞,都可以尝试嘛(当然,这里会直接过滤掉标签,所以笔者没有测出来)

声明

本文仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失,均由使用者自行承担责任

更多推荐