首先我们直奔第一个点能否任意重装,我们可以看到必须常量DEL_INSTALLER为1的时候才会触发删除install.php,那么我们追踪DEL_INSTALLER看看
这里可以看到DEL_INSTALLER默认值便是0,以是一样平常情形下这里是可以任意重装的,我们从黑盒的测试也可以印证这一点。同时表单也做了过滤以是这里也没有后面两种情形。
越权漏洞
在安装完毕后打开config.php看到两个比较奇怪的常量定义:AUTH_KEY和AUTH_COOKIE_NAME从名字来看这连个常量肯定是有一定联系的。如下图:

我们在抓包时候创造了AUTH_COOKIE_NAME这个常量,解释这是一个cookie名。我们连续再代码中追踪这个常量。
我们可以看到在登录验证cookie中利用了这个常量,我们追踪一下cookie值是如何布局的
这里可以看到,调用了emHash这个类方法,并且这里利用了AUTH_KEY这个常量,这里解释这两个常量是有联系的。我们在连续追踪hash_hmac()到底利用key做了什么。
这里对传入的$key也便是AUTH_KEY进行了md5加密到一个二进制字符串中而后分割为64个字节与一个字符64次的字符串进行异或末了得到两个字符串$ipad,$opad末了再将他们打包拼接用md5加密返回给上级调用。我们再回到上级。
我们知道generateAuthCookie方法中的 $key、$hash是由AUTH_KEY加密而成。终极的cookie是由$user_login 、 $expiration $hash拼接而成,而$expiration是cookie的生存韶光,$user_login是用户名。这里可以得知$key、$user_login、$expiration都是固定的那么只要知道AUTH_KEY就有假造cookie造成越权的可能。
例如我们准备两个靶机,一个靶机上岸,获取这个靶机的cookie即可越权上岸其余一个靶机。条件是两个靶机的AUTH_KEY得同等。这里有点鸡肋但是还是有利用的可能。我们将两个靶机的cookie拿出来比较确实是一样的。
后台getshell(一)
实在上诉两个漏洞已经能够让我们进入后台了,现在的任务便是如何Getshell了。这里我随便看了一下创造后台有设置上传附件后缀的功能。
但是测试创造,加入php后缀你创造会将phpt更换为X,从源码中可有很直不雅观看到这点。
此时我把稳到了备份功能,这个后缀是保存在数据库中的,既然我不能直接将后缀写入数据库,那么我能不能通过数据备份规复的方法写入数据库呢。
这里直接备份所有表,下载下来然后找到写入后缀的语句,加上php,如下
导入备份后创造设置中的上传后缀有php
直接在文章揭橥出上传PHP文件即可getshell
后台getshell(二)
我们还创造这个cms中上传插件的地方可以上传zip,这里我们想如果在插件中插入一句话木马是不是也能getshell?我们找到插件上传的脚本,创造利用了一个叫emUnzip的函数。
我们连续追踪这个函数,创造这个解压函数是利用ZipArchive()类来实现解压缩的。我们可以看到代码755行中获取了压缩包的内部目录/文件的名称 ,并将其分割为数组将第一个元素赋值给了$dir,我们看到switch中plugin选项,这里又将获取的第一个文件夹名称赋值给$plugin_name,利用getFromName方法获取了压缩包是否存在$dir . $plugin_name . '.php'这个文件。综上这里便是检测压缩包中文件夹里面是否存在一个与文件夹名称同等的PHP文件,末了在再压。这里也没对文件进行其他校验操作。因此我们只要再布局 文件夹名和文件名相同的内容的压缩包,同时由上方代码也可以知道,文件将会被解压到 /content/plugins/a/a.php(文件夹名称a)
构建压缩包上传插件:
总结
这次代码审计也是十分传统地从安装文件入手,黑盒结合白盒测试的方法进行审计。总的来说作者有一点安全意识在输入时候对php进行过滤,但是如果做事器是iis可以解析asp但是这里并没有对asp进行过滤,并且如果做事器解析phtml这些后缀在附件上传处同样可以getshell。总的来说在开拓时候上传部分应该锁去世不应让用户可控。