Wordpress 5.2.3 未授权页面查看漏洞(CVE-2019-17671)分析
字数 1617 2025-08-26 22:11:34

WordPress 5.2.3 未授权页面查看漏洞(CVE-2019-17671)分析

漏洞概述

WordPress在5.2.3及之前版本存在一处未授权页面查看漏洞(CVE-2019-17671),攻击者可以在未授权的情况下,查看所有私密页面或已删除至回收站的页面。

重要说明

  • 此漏洞影响的是"页面"(Page)而非"文章"(Post)
  • 页面是用户可以单独建立的固定页面(如留言板、通知单页面)
  • 文章是可以通过标签实现相关文章链接的内容
  • 该漏洞不能查看未发布的文章,只能查看私密或回收站的页面

漏洞分析

WordPress环境设置机制

  1. WP类:位于\wp-includes\class-wp.php,是WordPress环境设置类
  2. $public_query_vars数组:定义公共查询变量
  3. main方法:设置WordPress环境所需的所有变量
    • 调用parse_request方法解析请求(GET/POST)
  4. parse_request方法
    • 解析请求以找到正确的WordPress查询
    • 设置查询变量
    • 遍历$public_query_vars数组,检查请求参数中是否存在这些变量
    • 若存在,则将参数键值赋值到WP环境变量中

请求处理流程示例

请求示例:

http://127.0.0.1/wordpress/?static=0&order=asc&kumamon=test

处理结果:

  • $public_query_vars中存在"order"与"static"
  • GET请求中的order与static参数会被处理
  • "kumamon"不在$public_query_vars中,不做处理

漏洞触发点

  1. parse_query方法:位于\wp-includes\class-wp-query.php

    • $qv变量引用自$this->query_vars
    • $this->query_varsfill_query_vars方法处理后的值
  2. 关键条件判断

    • 通过GET请求传入static变量,将$qv['static']赋值为0
    • 进入条件分支,设置:
      $this->is_page = true
      $this->is_single = false
      
  3. SQL查询

    • 查询所有page类型的发布内容
    • 查询条件:wp_posts.post_type = 'page'
    • 排序:ORDER BY wp_posts.post_date ASC(由GET请求中的order=asc决定)
    • 查询结果包含所有状态的页面(publish、private、trash)
  4. 绕过验证的关键

    • 通过ASC升序排列,使最早发布的页面(通常是public状态)位于$this->post[0]
    • 程序只检查$this->post[0]的发布状态
    • $this->post[0]为public,则绕过后续登录校验

漏洞利用条件

  1. 必须使用order=asc参数:

    • 默认是降序排列(DESC)
    • 不使用ASC可能导致$this->post[0]为private或trash状态,触发登录校验
  2. 可查看的内容:

    • 所有私密页面(private)
    • 回收站中的页面(trash)
    • 不能查看未发布的文章

漏洞修复

WordPress修复方案:

  1. $public_query_vars数组中移除static变量

    • 使请求中的static参数被忽略
  2. 移除'' != $qv['static']条件

    • 只能通过pagename或page_id查询单条page
    • 单条page显示时会验证其状态,非public的不予显示

教学总结

  1. 漏洞本质:通过精心构造的请求参数,绕过WordPress的权限检查机制
  2. 关键点
    • 利用static参数触发页面查询
    • 使用order=asc确保最早发布的public页面位于结果首位
    • 绕过对非public内容的权限检查
  3. 影响范围:WordPress 5.2.3及之前版本的所有页面(Page)内容
  4. 防护建议
    • 及时更新WordPress版本
    • 对敏感页面设置更严格的访问控制
    • 监控异常访问日志
WordPress 5.2.3 未授权页面查看漏洞(CVE-2019-17671)分析 漏洞概述 WordPress在5.2.3及之前版本存在一处未授权页面查看漏洞(CVE-2019-17671),攻击者可以在未授权的情况下,查看所有私密页面或已删除至回收站的页面。 重要说明 : 此漏洞影响的是"页面"(Page)而非"文章"(Post) 页面是用户可以单独建立的固定页面(如留言板、通知单页面) 文章是可以通过标签实现相关文章链接的内容 该漏洞不能查看未发布的文章,只能查看私密或回收站的页面 漏洞分析 WordPress环境设置机制 WP类 :位于 \wp-includes\class-wp.php ,是WordPress环境设置类 $public_query_vars 数组 :定义公共查询变量 main方法 :设置WordPress环境所需的所有变量 调用 parse_request 方法解析请求(GET/POST) parse_ request方法 : 解析请求以找到正确的WordPress查询 设置查询变量 遍历 $public_query_vars 数组,检查请求参数中是否存在这些变量 若存在,则将参数键值赋值到WP环境变量中 请求处理流程示例 请求示例: 处理结果: $public_query_vars 中存在"order"与"static" GET请求中的order与static参数会被处理 "kumamon"不在 $public_query_vars 中,不做处理 漏洞触发点 parse_ query方法 :位于 \wp-includes\class-wp-query.php $qv 变量引用自 $this->query_vars $this->query_vars 由 fill_query_vars 方法处理后的值 关键条件判断 : 通过GET请求传入static变量,将 $qv['static'] 赋值为0 进入条件分支,设置: SQL查询 : 查询所有page类型的发布内容 查询条件: wp_posts.post_type = 'page' 排序: ORDER BY wp_posts.post_date ASC (由GET请求中的order=asc决定) 查询结果包含所有状态的页面(publish、private、trash) 绕过验证的关键 : 通过ASC升序排列,使最早发布的页面(通常是public状态)位于 $this->post[0] 程序只检查 $this->post[0] 的发布状态 若 $this->post[0] 为public,则绕过后续登录校验 漏洞利用条件 必须使用 order=asc 参数: 默认是降序排列(DESC) 不使用ASC可能导致 $this->post[0] 为private或trash状态,触发登录校验 可查看的内容: 所有私密页面(private) 回收站中的页面(trash) 不能查看未发布的文章 漏洞修复 WordPress修复方案: 从 $public_query_vars 数组中移除static变量 使请求中的static参数被忽略 移除 '' != $qv['static'] 条件 只能通过pagename或page_ id查询单条page 单条page显示时会验证其状态,非public的不予显示 教学总结 漏洞本质 :通过精心构造的请求参数,绕过WordPress的权限检查机制 关键点 : 利用 static 参数触发页面查询 使用 order=asc 确保最早发布的public页面位于结果首位 绕过对非public内容的权限检查 影响范围 :WordPress 5.2.3及之前版本的所有页面(Page)内容 防护建议 : 及时更新WordPress版本 对敏感页面设置更严格的访问控制 监控异常访问日志