这次练习主要针对的是rce方向的两个漏洞,复现的是两个cms上的漏洞。一个是zzzphp,另一个是baijiacms
直接先在本地搭建。
针对zzzphp,我们要复现的是代码执行漏洞。这里有个小tips。针对仅使用mvc架构并且没有对基本方法二次封装的源码,我们可以针对功能点和查找特定函数去测试。但是如果是特殊框架开发的源码,我们就要针对不同框架的特性去进行审计。
这里我们要审计的是代码执行漏洞,我们直接查找相关函数eval
这里可以看到只有最后一个是真正可以执行代码的
我们具体看这个方法的类
这个执行关键在于$ifstr这个字符串,而他取决于
preg_match_all( $pattern, $zcontent, $matches )
我们可以查一查这个函数的用法
就是按照pattern的模式匹配将zcontent分割按顺序放在后面的数组参数里,所以最后ifstr取决于 $zcontent。这里就很清晰了,我们现在的目的就是去找谁调用了这个parseriflabel类。
我们发现parsercommon方法就调用了它,我们再看谁又实例化了ParserTemplate类
我们看到这里有四处调用。我们进入这个类具体分析
这四处的$zcontent值分别为
$user_tpl load_file($tplfile,$location) load_file($tplfile,$location) load_file($tplfile,$location)
第一个我们是不可控制的。这里如果对四个if都分析一遍难度太高。因为我们是复现,所以是确定这里有漏洞的,所以这里的if判断就不那么重要。
关于load_file($tplfile,$location)的值,我们可以不用跟下去分析,我们直接echo出来
发现这就是模板代码
这里我们就基本清晰了这个业务逻辑,实际上它就是在执行模板。而模板代码可以通过登录后台更改
这样就造成了任意代码执行。这里只要我们添加的代码绕过下面两次过滤就可以了
第二个练习是针对baijiacms的命令执行漏洞挖掘
同样,我们从寻找关键词开始
这里我们只能控制$file_full_path,$file_full_path实际来自file_save方法的参数。我们从方法名能猜出它是一个文件操作方法。我们看哪里调用了它
下面是执行代码的要求
这个应该是文件上传的参数
根据路由,我们反推出功能点地址
发现有文件上传功能
文件名做一个小小的绕过就行了