前言
ImpressCMS 是一个开源内容管理系统,旨在轻松安全地管理多语言网站。
自动任务处存在任意代码执行,从而导致RCE
功能点分析
cms安装好之后,登陆管理员账号密码。大概是下面这个样子。
来到Administration Menu
–Auto Tasks
点击Create new task
,红框中自动执行就是自动执行的任务的源代码。
现在我们不知道这个框中是否可以输入任意代码?即使可以输入任意代码,后续有没有过滤?
下面从源码层面来分析一下。
源码分析
首先想到的是找到这个功能点对应的源码,一步步跟。但是这里看了下,过程有点多。于是决定采用关键字的方法。
先随便创建一个任务
通过抓包,找到Source Code
窗口对应的关键字,关键字sat_code
,响应了一个跳转,响应体为空。
下面搜索这个关键字,跟一下它的处理过程。可以看到,主要集中在这三个文件中。
先看下对这个关键字调用最少的文件: update-112-to-122.php
。是在一个创建数据库表的字段的位置。同时也通读了下这个文件,没有变量,没有输入,直接忽略。也并不一定说这个文件肯定没问题,只是这里不考虑。
下面看一下第二个相关文件:modulesadmin.php
。
第一处:将自动任务模块的任务添加到系统自动任务列表。生成处理程序对象,设置用户输入的值,传递给处理程序进行处理。
下面继续跟进处理程序
处理程序位置:/modules/system/admin/autotasks/class/autotasks.php
处理程序:SystemAutotasksHandler
最后,来到/modules/system/admin/autotasks/class/autotasks.php
文件
第一处:
第二处:
至此,Source Code
窗口的处理过程基本分析完毕。可以看到,中间并没有对其进行过滤。可以直接执行任意代码。
我的这种方法跟平时的过程调试不太一样,比过程调试、一步步跟代码,要快很多。
当然,也可以补充一下过程调试,前面分析过,用户创建的任务,传递给了系统。
在核心启动过程结束时触发的函数,在如下位置下断点:
然后创建新的自动任务
来到断点
跟进execTasks()
跟进exec()
,可以看到,没有对要执行的代码做任何过滤和拦截。
验证
创建自动任务
执行