源码下载地址:
https://github.com/PopojiCMS/PopojiCMS/archive/refs/tags/v2.0.1.zip
安装完成后需要手动删除一下install.php(我是这样的),他不会自动删除,然后index.php有一个判断规则,如果install.php存在会自动跳转到安装页面。
从exploit-db给的POC可以看到漏洞所在页面和参数
找到对应的代码去搜一下关键字:meta_content,但是并没有搜到,考虑可能是通过动态调用的方法调用的某个文件,然后接收的这个参数。
这里还有个方法,就是直接从根目录去搜索这个关键字,如果系统比较大搜索出来的东西可能比较多,如果系统比较小可能直接就能定位到漏洞代码
接下来看下这两个参数,有可能是通过其中某一个参数去动态调用的其他类:?mod=setting&act=metasocial
这里还有另外一个办法就是通读代码,因为访问的是这个文件,那肯定是通过这个文件调用的其他文件去处理的这个请求。
下图可以看到第31行实例化一个PoRequest类,然后用这个类下的get方法去接收mod参数,最后用ucfirst方法将首字符转为大写。
这里因为上图第35行传参时给filterType参数传递了实参,所以会替换掉下图的false默认参数,这里会走进第45行的if判断。
这里filter_input过滤器FILTER_SANITIZE_STRING表示过滤特殊字符等内容,这里POC传递的是setting,没特殊字符还是会原样返回。
下面的act参数也是一样的 ,接收到后原样返回,主要看下switch里的代码,这里的43行代码,这里得到的是route.php,那就不会走进前面两个case,直接看最后route.php这个代码块
前面mod传的是setting,那么131行的if就不会成立,直接看else里的代码
150行判断文件是否存在,这里拼接完的完整路径为:
../po-content/component/setting/admin_setting.php
下图为150行DIR_CON常量的值
找下上面的路径文件,这里应该就是真正存在漏洞的代码了
再看下route.php那个文件的155行代码,直接include这个文件,那么直接看这个文件,就不继续看route.php的代码里
上图的34行,判断了一下是否登录,所以这里判断为后台的漏洞,需要登录才可以利用
这里就是接收payload的地方了,因为PHP接收到数据后会自动url解码一次,所以这里传递的数据是URL编码的,但是到后面会自动转换回来。
写入的文件内容
所以admin_setting.php的1070行会讲恶意的代码写入到PHP文件内。
其实payload那里写正常的代码不用url编码也是可以的,看下Demo
原文始发于微信公众号(琴音安全):PopojiCMS远程命令执行漏洞分析
评论