PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
代码审计——第一百零七天
PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
PHP审计 - MVC开发-控制模块视图
什么是MVC?
-
MVC(
Model-View-Controller)是一种经典的软件架构模式,它将应用程序分为三个核心组件:- Model(模型):主要负责数据逻辑和业务规则,比如处理数据的存储、检索、验证和计算;不依赖UI,独立于View和Controller
- View(视图):负责用户界面展示,将Model中的数据以可视化形式呈现给用户;只负责展示,不包含业务逻辑
- Controller(控制器):负责接收用户输入,协调Model和View,比如处理用户请求、调用Model更新数据、选择对应的View进行渲染;作为“中间人”,连接用户操作与系统响应
-
架构图如下:

-
MVC对审计主要影响:
- 文件代码定位问题
- 代码过滤分析问题
- 前端安全发现问题
-
那其实最最重要的就是第一点这个文件代码定位问题,我们审计的时候是需要知道功能点和代码的一个对应关系的,即:
- 正向:从url定位到代码
- 反向:从代码分析到url
-
MVC开发审计入口常见方法:
- 搜索法:常规或部分MVC模型源码可以采用关键字的搜索挖掘思路
- 功能法:框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路
- 对比法:可以通过前后修复版本文件及代码不同特征进行针对挖掘思路
- 特征法:数据库监控挖掘SQL注入、文件监控挖上传删除写入等,后续补充
- 工具法:通过一些审计工具帮助快速找到一些可疑漏洞点
- AI辅助法:直接让AI阅读代码辅助找漏洞点
-
当然,目前主流的架构已经从传统的MVC转换成了前后端分离的API + MC、MVVM、微服务架构等,但是整体的思路是差不多的
PHP常见漏洞关键字
- SQL注入:
select insert update mysql_query msyqli 等
- 文件上传:
$_FILES type="file" 上传 move_uploaded_file() 等
- XSS跨站:
print print_r echo sprintf die var_dump var_export 等
- 文件包含:
include include_once require require_once 等
- 代码执行:
eval assert preg_replace call_user_func call_user_func_array 等
- 命令执行:
system exec shell_exec `` passthru pcntl_exec popen proc_open 等
- 变量覆盖:
extract() parse_str() importrequestvariables() $$ 等
- 反序列化:
serialize() unserialize() __construct __destruct 等
- 其他漏洞:
unlink() file_get_contents() show_source() file() fopen() 等
MVC架构示例
-
这里以LmxCMS V1.4程序为例,讲讲MVC架构如何对应前端URL和后端源码
-
访问
http://localhost/install安装一下,然后进入首页就可以看到它的URL结构和我们之前的不一样:
-
这里url结构为
http://lmxcms/index.php?m=list&a=index&classid=5,咋一看就是index.php然后传入3个参数,实际上你看index.php源码根本啥也没有:
-
这里就根据小迪说的,它就是一个典型的MVC架构:

-
于是这个URL其实对应到源码就是:
/index.php?m=list&a=index&classid=5
↓ ↓ ↓ ↓
c/index目录 list文件 index方法 传入参数
-
这个感觉我也说不太明白,反正就是网页是控制页面输入的,所以对应的就是Controller层,所以这个URL就一步步对下来就行了:

-
然后这里的m和a其实就是它自定义的一个接收url参数:

-
根据这里的这个Controller层,我们就可以找到对应的Model层,一般来讲他们的名字都是对应的,虽然这里不太对应:
ContentModel()或者ColumnModel(),然后在/m目录下可以找到对应的Model层:
-
最后就是如何找View层,其实也是差不多的,就是根据名称来找就好了:

-
反正就是多看几套这种源码,之后在看到类似的URL以及目录结构的时候基本也就知道了
PHP审计 - MVC开发-RCE代码执行
- 这里我们演示的是LmxCMS的三个漏洞,会采用三种方式去进行复现:
搜索法
-
第一个案例是CNVD-2019-05679,LmxCMS V1.4版本后台
Ac***.cl***.php文件存在代码执行漏洞:
-
我们在源码中直接找到对应的文件,一般都是先看Controller层,所以直接找到
/c/admin/AcquisiAction.class.php文件,对应的Model层就是/m/AcquisiModel.class.php -
然后根据它的提示说是存在代码执行漏洞,于是直接搜索上述的关键字,这里找到用户可控变量+eval函数的代码部分:


-
它的可控参数就是这个
$temdata,往上找可以发现是通过接收的cid参数,跟踪这个处理函数就是它model层的数据库处理 -
此时我们知道它后端的处理逻辑之后,我们就可以知道构造Payload大致的前端URL为:
http://lmxcms:7899/admin.php?m=Acquisi&a=showCjData&id=1&lid=1&cid=1
-
那这里有个问题就是这个cid是从数据库里面取出来的,也就是说我们需要通过向数据库里面插入数据,然后再通过这里取才能触发该漏洞
-
通过跟踪这个
caijiDataOne函数我们知道它的数据库表名为cj_data:
-
于是我们就直接在这个表里面插入一条采集之后的数据,这里是需要它下达一个采集任务然后采集对应恶意网页内容存到数据库中,再通过访问上述URL取出恶意数据,造成代码执行:


功能法
-
第二个案例是CNVD-2-19-05678,LmxCMS V1.4版本后台
Te***.cl***.php文件存在代码执行漏洞:
-
同样找到对应Controller层为
TemplateAction.class.php,看它的index方法可以看到这个用的是smarty模板:
-
由于这里它没有Model层,所以我们先找到它的前端功能点:

-
这里可以看到它的默认模板文件有:

-
这里你再点进去看,比如这个footer.html文件,你可以看到它会用一些变量去描述动态内容:

-
而我们查看它的一个使用手册会发现,它这里能够执行php代码,因为它原本是html文件无法执行php代码,所以这里能执行那就必然是用到了eval这类的函数:

-
因此这里就可以按照它这个语法去执行任意代码:


对比法
-
这个就是你知道某个版本有漏洞,但是新出的版本它可能做了一些过滤,所以这里就可以通过对比法去找它的差异然后尝试绕过
-
用到的软件就是
Beyond Compare或者UltraCompare,比如我们看LmxCMS V1.4和LmxCMS V1.41的区别,就可以直接将文件拖进来看看之前爆过的漏洞是否修复过:
-
你可以直观地看到红色的文件就是被修改过的,也就是说,在V1.41版本,上述的两个漏洞没有被修复
-
那这个文件对比的意义就是:
- 通过对比快速找到脆弱点,修复什么,上个版本的问题可能就在这里
- 帮助快速测试新版本有无0day
PHP审计 - MVC开发-RCE命令执行
-
第二个案例是CNVD-2021-12800,百家CMS 4.1.4版本存在命令执行漏洞:

-
同样安装好之后打开源码,由于描述中没有什么关键信息,所以只能尝试通过关键词找触发位置:

-
那这里就对这个参数慢慢分析看看哪个可控即可,下面是我的一个分析流程:
system('convert'.$quality_command.' '.$file_full_path.' '.$file_full_path);
=> 条件1:!empty($settings['image_compress_openscale'])
$file_full_path <= file_save()
1. file_upload() x
2. file_upload_base64() x
3. fetch_net_file_upload() x
4. setting.php => $file['name']
$file['name'] => $file = $_FILES['weixin_verify_file'];
条件2:$_FILES['weixin_verify_file'] 不为空
=> 条件3:后缀为txt
看谁调用了该文件:system/weixin/class/web/setting.php
-
现在通过分析找到了要触发这里的文件上传就需要触发setting.php文件,于是我们需要分析分析他的URL和代码对应关系:

-
这里就直接看源码目录结构猜,比如这个什么manager,我们能在这个system目录下找到,然后在他的class目录下能找到store.php,对应了do参数
-
查看这个php文件可以看到接收了op参数,所以就基本八九不离十了,通过template目录还可以找到对应的store_display.php文件,这就是他的View层,但是这个
mod=site我没搞懂是啥 -
所以这里我们就可以对应到
system/weixin/class/web/setting.php文件的触发URL:
http://baijiacms:7899/index.php?mod=site&act=weixin&do=setting

- 而根据文件的名称
weixin_verify_file,那就能够定位到这里了,然后我们就要考虑条件是否满足了 - 第一个条件就是
$settings['image_compress_openscale']不为空,这个我们直接全局搜索image_compress_openscale可以找到他在system/manager/template/web/netattach.php,于是我们就可以找到他的URL为:
http://baijiacms:7899/index.php?mod=site&act=manager&do=netattach

-
这里就把他开启,随便设一个值,然后第二三个条件我们就上传一个txt文件然后抓包改即可:

-
可以看到成功执行命令,复现成功,所以这个例子是可以好好去看看去总结的
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)