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环境设置机制
- WP类:位于
\wp-includes\class-wp.php,是WordPress环境设置类 $public_query_vars数组:定义公共查询变量- main方法:设置WordPress环境所需的所有变量
- 调用
parse_request方法解析请求(GET/POST)
- 调用
- 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中,不做处理
漏洞触发点
-
parse_query方法:位于
\wp-includes\class-wp-query.php$qv变量引用自$this->query_vars$this->query_vars由fill_query_vars方法处理后的值
-
关键条件判断:
- 通过GET请求传入static变量,将
$qv['static']赋值为0 - 进入条件分支,设置:
$this->is_page = true $this->is_single = false
- 通过GET请求传入static变量,将
-
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,则绕过后续登录校验
- 通过ASC升序排列,使最早发布的页面(通常是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版本
- 对敏感页面设置更严格的访问控制
- 监控异常访问日志