目录
漏洞复现前的准备工作:
一、代码执行漏洞简介
二、PHP双引号的高级用法
寻找存在代码执行漏洞的点
一、寻找可利用的unlink函数
第6个文件的第56行:
去网站看看对应功能点:
接下来,我们在网站删除Logo的时候抓包看看:
二、利用代码执行漏洞获取权限
漏洞复现前的准备工作:
一、代码执行漏洞简介
RCE(remote command/code execute)命令执行或者代码执行。RCE的原理是用户输入的数据被当做代码执行。存在RCE漏洞的系统,可以让攻击者直接向后台服务器远程注入操作系统命令或者恶意的后端代码,从而控制服务器。现在因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE。
二、PHP双引号的高级用法
在PHP语言中,单引号和双引号都可以表示一个字符串,但是对于双引号来说,可能会对引号内的内容进行二次解释,这就可能会出现安全问题。
在PHP5.5及以上版本存在着双引号的二次解析,按照PHP官方的解释,这是属于字符串的高级用法。双引号的二次解析能够将双引号内的字符串当成代码来执行,这本身并不是漏洞,但如果被加以利用,则可能产生一些意外的结果。
双引号二次解析的要点:
1、字符串得在双引号内
2、$和{} 得在一起
3、PHP版本要5.5.38以上
寻找存在代码执行漏洞的点
安装中出现这个页面:
来到data目录下删除install.lock,再登录看看:
重新安装:
回到data目录下,先看看配置文件里写的什么:
发现数据库的账号密码都是双引号括起来的,有没有可能利用双引号的二次解析在这里进行一些“特殊操作”呢?
写入测试代码试试看:
发现...成功写入phpinfo()
说明config.php存在双引号的二次解析,通过对其加以利用,则有可能实现远程控制服务器。
因此我们接下来的操作可以围绕config.php文件来进行。如果能够利用成功,则表明这个文件存在代码执行漏洞。
一、寻找可利用的unlink函数
就像刚才的步骤,只要来到安装页面,就能进行RCE。
而,cms安装页面的锁定状态是由install.lock文件控制的,因此我们假如能把目标网站上的install.lock文件删掉,就有可能访问到安装页面。那么问题就变成了:如何删除目标网站的install.lock文件。
用seay源代码审计系统全局搜索含有unlink函数的文件,结果如下:
从上往下,一个文件一个文件快速过一遍,找到可以操作的文件
第一个文件,点进去看看:
发现路径拼接的是常量,写死了,排除!
第二个文件,点进去看看:
发现unlink里面接了一个可传值参数,看看这个参数是否可控?
发现这个参数交给了is_backup_file处理,全局定位一下,看看怎么处理的?
也就是说,传进来的$filename必须包含.sql后缀,而我们要传的显然不是.sql后缀代码,Pass
第三个文件,点进去看看:
观察一下,发现也是参数必须拼接常量.sql后缀,Pass
扫了前面之后,直接来到第6个文件处,有可能,点进去看看:
发现Unlink里面跟的是一个参数$mobile_logo,往上找找看,看看相关设定:
第6个文件的第56行:
这几行代码的逻辑链路基本思路如图所示:
去网站看看对应功能点:
提交logo到什么地址去了?
回到前端看看,获取Logo传入的位置的URL:
http://www.rce.com/m/theme/default/images/logo.jpg
给源码打个断点die();看看点击删除后返回的绝对路径是什么:
而我们要删除的地址是:
....../douphp/data/install.lock (等于需要往前回退四次 ../../../../data/install.lock)
接下来,我们在网站删除Logo的时候抓包看看:
发现mobile_logo参数下面没有传内容(因为上传的是一个空的jpg图片)
在包里添上install.lock的路径为mobile_logo的值:
放行,然后再点击删除Logo:会返回安装页面!表明删除install.lock文件操作成功
二、利用代码执行漏洞获取权限
写入shell:已知配置文件是config.php,等于这句话是写进了config.php文件中
路径为:data/config.php
显示安装失败,实际已经写入了:
接着访问,成功连接!