CVE-2017-20208CVE-2017-20208是WordPress平台上一款广受欢迎的注册表单插件RegistrationMagic中存在的一个高危PHP对象反序列化注入漏洞。该漏洞由Wordfence安全团队的安全研究员发现,CVSS 3.1评分高达9.8分,属于严重级别漏洞。
RegistrationMagic插件允许网站管理员创建自定义用户注册表单、支付表单以及用户登录页面,在WordPress生态系统中拥有大量活跃安装。该漏洞存在于插件所有低于3.7.9.3的版本中,攻击者无需任何身份认证即可通过网络远程利用此漏洞。
漏洞的核心问题在于插件中is_expired_by_date()函数对用户输入的反序列化处理不当。PHP的unserialize()函数在处理不可信输入时,如果传入精心构造的序列化字符串,攻击者可以注入任意PHP对象。由于WordPress及其插件生态中存在多个可用的POP(Property-Oriented Programming)链,攻击者可以利用这些链触发危险操作,如任意文件写入、远程文件获取等,最终实现远程代码执行(RCE)。
该漏洞已在2017年10月被Wordfence披露为野外利用的零日漏洞之一,表明在实际攻击场景中已被黑客组织利用。鉴于漏洞利用门槛低(无需认证、无需用户交互)、影响范围广(所有低于3.7.9.3的版本)以及危害程度高(可完全控制目标网站),该漏洞被评定为严重级别,建议相关用户立即升级到修复版本。
该漏洞的技术原理基于PHP对象反序列化机制的不安全使用。具体分析如下:
1. **漏洞触发点**:RegistrationMagic插件中的is_expired_by_date()函数接收用户可控的输入参数,并直接将其传递给PHP的unserialize()函数进行反序列化操作,而没有进行任何验证或过滤。
2. **反序列化原理**:PHP的unserialize()函数能够将序列化字符串还原为PHP对象。当攻击者传入精心构造的序列化字符串时,可以实例化任意类并调用其魔术方法(如__wakeup()、__destruct()、__toString()等)。
3. **POP链利用**:WordPress核心及其众多插件中存在多个可利用的POP链。POP链通过串联多个类的魔术方法,在反序列化过程中形成调用链,最终触发危险操作。在本漏洞中,攻击者可以利用POP链实现远程文件获取(file_get_contents())和文件写入操作。
4. **完整攻击流程**:
- 攻击者构造包含恶意序列化字符串的HTTP请求
- 请求发送到存在漏洞的WordPress站点
- is_expired_by_date()函数对恶意输入进行反序列化
- 触发POP链,调用文件操作相关类
- 从攻击者控制的远程服务器下载恶意PHP文件
- 将恶意文件写入到网站可访问目录
- 攻击者访问上传的webshell,执行任意PHP代码
5. **漏洞危害**:成功利用后,攻击者可以完全控制目标WordPress网站,包括读取敏感数据、植入后门、横向移动到服务器其他位置,甚至将网站作为进一步攻击的跳板。