cve-2025-5497是phpwcms 1.9.46/1.10.9中的反序列化漏洞,通过篡改base64编码的phpwcms_session cookie触发__destruct执行任意代码;修复需启用unserialize白名单并确保php≥7.4。

复现phpwcms CVE-2025-5497反序列化漏洞
需在未修复的phpwcms 1.9.46或1.10.9环境中,通过构造恶意序列化数据触发__destruct魔术方法执行任意PHP代码,该漏洞利用链依赖用户可控的cookie参数进入unserialize()调用点。
第一步:访问目标站点首页,使用Burp Suite拦截任意HTTP请求,定位到包含cookie: phpwcms_session=的请求头。
第二步:提取当前phpwcms_session值,用base64_decode解码(注意phpwcms默认对session值做base64编码后再存储),得到原始序列化字符串,例如a:2:{i:0;s:4:"user";i:1;s:32:"5f4dcc3b5aa765d61d8327deb882cf99";}。
第三步:构造POP链payload。必须使用phpwcms 1.9.46中仍存活的危险类——重点尝试phpwcms\phpwcms_article与phpwcms\phpwcms_content,二者__destruct方法均存在file_put_contents调用且参数未过滤;用PHP本地环境生成序列化字符串,确保对象属性中包含恶意路径和代码,如/var/www/html/shell.php与?php>。
第四步:将新生成的序列化字符串base64_encode后,替换原cookie中的phpwcms_session值,发送请求;若服务器返回HTTP 200且无报错,立即访问/shell.php?1=id验证是否成功写入并执行。
验证1.9.46/1.10.9补丁是否生效
官方修复方案是在include/inc_lib/session_handler.inc.php第87行附近,将原本直接反序列化的unserialize($data)替换为带白名单的调用,并增加base64校验前缀。
方法一:检查核心文件是否被修改
打开include/inc_lib/session_handler.inc.php,搜索unserialize(,确认该行是否已改为unserialize($data, ['allowed_classes' => false]);若仍是裸调用,则补丁未应用。
方法二:动态验证反序列化行为
向目标站点发送一个伪造的、含非法类名的序列化cookie,例如O:12:"MaliciousClass":0:{}经base64编码后设为phpwcms_session;若返回500或空白响应,说明白名单机制已启用;若仍返回200且无异常,则防护失效。
方法三:确认PHP运行时配置兼容性
phpwcms 1.10.9要求PHP ≥ 7.4才能启用allowed_classes参数;用phpinfo()页面确认当前PHP版本,【低于7.4的环境即使升级到1.10.9也无法启用白名单防护】,必须同步升级PHP或改用其他加固手段。
绕过补丁的临时测试(仅限授权渗透)
某些1.9.46热补丁仅校验cookie前缀是否为wcms_,但未清理序列化字符串中的控制字符;可尝试在payload开头插入%00%00%00或\x00\x00\x00,再base64编码,观察是否仍能触发反序列化。
若绕过成功,说明补丁存在校验逻辑缺陷,需立即回退至1.10.9完整版或手动补全filter_var($data, FILTER_SANITIZE_STRING)清洗步骤。
在include/inc_lib/session_handler.inc.php中找到unserialize调用行,在其上方插入:
$data = str_replace(["\x00", "\r", "\n", "\t"], "", $data);
保存后清空temp/cache/目录,重启PHP-FPM进程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











