WordPress 5.1 CSRF to RCE 漏洞详解

wordPress/ target=_blank class=infotextkey>WordPress是使用php语言开发的博客平台 , 用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 。也可以把 WordPress当作一个内容管理系统(CMS)来使用 。前些日子 , RIPS放了一个WordPress5.1的CSRF漏洞通过本文将对此次CSRF漏洞进行详细分析 , RCE相关的分析见后续分析文章
 
预备知识
在wordpress中 , 超级管理员是可以在评论中写入任何代码而不被过滤的
 
比如 , 在评论中输入

WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 

WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
直接弹框
但是超级管理员在提交评论表单时 , wordpress需要校验其Nonce值
想理解这个漏洞 , 首先要了解下wordpress的Nonce ( number used once )防御机制
Wordpress的Nonce ( number used once ) 机制 , 是用来防止CSRF而引进的 。WordPress会为一些请求提供一个随机数进行校验 , 以防止未授权的请求的发生 。
 
来看下wordpress的Nonce机制是如何使用的:
1、使用wp_create_nonce生成 nonce值:
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
可见 , 其实nonce值与$i、$action、$uid、$token有关
这里的$i 是nonce创建的时间相关变量 , 由wp_nonce_tick()生成 , 其余的$action、$uid、$token很好理解 。
由这里我们可以看出 , nonce的生成 , 与其操作也是有关系的
 
2、将生成的 nonce传递给需要提交时验证的前端模板
3、需要验证的表单被提交后 , 验证其中nonce , 例如下图中 , 本次漏洞点
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
Nonce讲解完毕 , 言归正传 , 分析本次漏洞
 
漏洞分析
理论上 , 如果没法通过Nonce验证 , 后续的操作会直接被终止 , 而且在csrf攻击中 , 攻击者是没有办法伪造管理员实时的Nonce值 。
 
但从本次漏洞处来看 , 如下图
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
这里虽然没有通过Nonce的验证(wp_verify_nonce),但是并未终止操作 。Wordpress在这里使用了两个过滤方法对后续的数据进行过滤 。
 
至于为什么没有终止 , 而采用了如下的过滤逻辑 , 据说是因为WordPress其中有一些特殊的功能例如trackbacks and pingbacks会受到该值的影响 , 笔者没有进一步考究 , 感兴趣的同学可以自己分析下 。
 
到目前为止 , 我们虽然没有合法的nonce值 , 但我们的payload仍然幸存 , 
接下来 , 看看逻辑里的 kses_init_filters()这个方法
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
 
超级管理员&非法Nonce情况:
我们用超级管理员身份提交一个评论 , 但是改包 , 把&_wp_unfiltered_html_comment改为空 , 使其通过不了Nonce校验 , 如下图
 
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
 
果然进入下图断点
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
 
紧接着 , 进入如下断点
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
使用wp_filter_post_kses对输入的数据进行过滤
 
普通用户情况:
此时用普通用户进行评论
 
WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 

WordPress 5.1 CSRF to RCE 漏洞详解

文章插图
 
直接调用wp_filter_kses进行过滤
 
以上思路以及明朗了
超级管理员&合法nonce ->不做任何过滤
超级管理员&不合法nonce ->wp_filter_post_kses
普通用户 –>wp_filter_kses
 
先来看看普通用户提交和超级管理员无nonce提交时调用的过滤函数有什么区别


推荐阅读