主页 > 网络知识 > Think CMF X任意内容包含漏洞分析复现(3)

Think CMF X任意内容包含漏洞分析复现(3)

 

Think CMF X任意内容包含漏洞分析复现

既然都找到类了,那么就跟进去看一下啦,跟进发现里面确实有一个run函数,确定是他没错了

 

tips:这里跟踪文件也有个技巧,有时候在定位某个类位于哪个文件时,我们也可以采用全局搜索的方式,或者直接用类名搜索文件名(phpstorm快捷键,快速按两次shift)

 

Think CMF X任意内容包含漏洞分析复现

又有if分支,为了效率我们同样可以用刚刚说的方法,判断到底进入了哪个分支,可以注意到我在上面打了很多断点,这个断点是为了标示出哪些行是我自己添加的,或者标示一些重要的逻辑处,方便我后面审计结束删除自己添加的代码,也可以防止中途离开再回来看代码遗忘重点这种情况的发生,总之算是一个小技巧吧。

 

我这里用我的打印调试法定位到,代码会运行到Storage::load()这里,我们跟进,在这里我们使用phpstorm直接go to这种方式发现phpstorm定位不到load函数的定义处,那么我们只有先定位Storage类,Storage类如下

 

Think CMF X任意内容包含漏洞分析复现

发现Storage类里面根本就没有load方法,而且他也没有继承任何父类,那么load方法到底藏在哪里呢?这里就涉及到__callstatic这个模式方法啦,这个方法会在调用该类不存在的静态方法或变量时触发,所以,load方式是通过call_user_func_array函数调用的,那到底调用的哪里的load方法呀,这里有两种方式确定,一是老老实实看代码,搞清楚self::handler到底值为多少,第二种就是我采用的全局搜索的方法,我不想一行行看代码,直接全局搜索load(

 

 

Think CMF X任意内容包含漏洞分析复现

出来的结果挺多的,但是我们根据之前调用时的参数,可以大体确定是上图中的其中一个,最后再结合自己的判断力或者都试一下确定是File.class.php(其实这里我是猜的23333,文件名更贴切嘛)中的load函数,跟进

 

 

Think CMF X任意内容包含漏洞分析复现

结果发现,就只是引入了一个文件,我这就急眼了呀,我想这么就引入一个文件就完了呢,那我传入的content什么时候写入到这个文件的呀,我觉得我肯定是遗漏了什么东西,于是开始顺着这个文件找线索,看看到底哪里把传入的content写入了这个文件,还是用我们的打印调试法确定这个文件的路径在

 

/data/runtime/Cache/Portal/

然后文件名的命名规则可以从传给Storage::load函数的参数里确定

Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']);

我采用了几种方法来定位到底哪里把content写入了文件,第一种方式就是全局搜索C(‘CACHE_PATH’).$_data['prefix'].md5($_content).C(‘TMPL_CACHFILE_SUFFIX’)

因为这是文件的命名规则,写入的时候肯定也是这个规则,但是结果失败了,只出现一条结果就是load这里,然后我就在想刚刚File.class.php里面有load函数,那么应该也有写入函数(set,write之类的),结果一看果然有!

 

Think CMF X任意内容包含漏洞分析复现

那我不得全局搜索一波嘛,在我搜索put的时候有所发现,再根据/data/runtime/Cache/Portal/目录下生成的cache文件的文件名、文件内容、调用put函数时传入的实参命名、实参个数以及调用put函数的文件名等多个数据参考,以及失措过后,觉得Template.class.php文件这一处put函数的调用极有可能就是了,这里的loadTemplate函数里有调用put函数的操作,反推,loadTemplate函数又在fetch函数里被调用了,然后我以为我之前跟代码的时候跟错了fetch,23333,回到ParseTemplateBehavior.class.php去确认

 

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!