wordPress/ target=_blank class=infotextkey>WordPress是使用php语言开发的博客平台 , 用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站 。也可以把 WordPress当作一个内容管理系统(CMS)来使用 。前些日子 , RIPS放了一个WordPress5.1的CSRF漏洞通过本文将对此次CSRF漏洞进行详细分析 , RCE相关的分析见后续分析文章
预备知识
在wordpress中 , 超级管理员是可以在评论中写入任何代码而不被过滤的
比如 , 在评论中输入
文章插图
文章插图
直接弹框
但是超级管理员在提交评论表单时 , wordpress需要校验其Nonce值
想理解这个漏洞 , 首先要了解下wordpress的Nonce ( number used once )防御机制
Wordpress的Nonce ( number used once ) 机制 , 是用来防止CSRF而引进的 。WordPress会为一些请求提供一个随机数进行校验 , 以防止未授权的请求的发生 。
来看下wordpress的Nonce机制是如何使用的:
1、使用wp_create_nonce生成 nonce值:
文章插图
可见 , 其实nonce值与$i、$action、$uid、$token有关
这里的$i 是nonce创建的时间相关变量 , 由wp_nonce_tick()生成 , 其余的$action、$uid、$token很好理解 。
由这里我们可以看出 , nonce的生成 , 与其操作也是有关系的
2、将生成的 nonce传递给需要提交时验证的前端模板
3、需要验证的表单被提交后 , 验证其中nonce , 例如下图中 , 本次漏洞点
文章插图
Nonce讲解完毕 , 言归正传 , 分析本次漏洞
漏洞分析
理论上 , 如果没法通过Nonce验证 , 后续的操作会直接被终止 , 而且在csrf攻击中 , 攻击者是没有办法伪造管理员实时的Nonce值 。
但从本次漏洞处来看 , 如下图
文章插图
这里虽然没有通过Nonce的验证(wp_verify_nonce),但是并未终止操作 。Wordpress在这里使用了两个过滤方法对后续的数据进行过滤 。
至于为什么没有终止 , 而采用了如下的过滤逻辑 , 据说是因为WordPress其中有一些特殊的功能例如trackbacks and pingbacks会受到该值的影响 , 笔者没有进一步考究 , 感兴趣的同学可以自己分析下 。
到目前为止 , 我们虽然没有合法的nonce值 , 但我们的payload仍然幸存 ,
接下来 , 看看逻辑里的 kses_init_filters()这个方法
文章插图
超级管理员&非法Nonce情况:
我们用超级管理员身份提交一个评论 , 但是改包 , 把&_wp_unfiltered_html_comment改为空 , 使其通过不了Nonce校验 , 如下图
文章插图
果然进入下图断点
文章插图
紧接着 , 进入如下断点
文章插图
使用wp_filter_post_kses对输入的数据进行过滤
普通用户情况:
此时用普通用户进行评论
文章插图
文章插图
直接调用wp_filter_kses进行过滤
以上思路以及明朗了
超级管理员&合法nonce ->不做任何过滤
超级管理员&不合法nonce ->wp_filter_post_kses
普通用户 –>wp_filter_kses
先来看看普通用户提交和超级管理员无nonce提交时调用的过滤函数有什么区别
推荐阅读
- WordPress 5.4正式发布:加入新区块 界面更简洁
- 为何要清除WordPress网站上的缓存?
- 2019年最吸引攻击炮火的 Web 框架:WordPress 和 Apache Struts
- 什么是CSRF攻击?如何防御CRSF攻击?
- zblogphp好用吗?个人站长使用zblog和wordpress对比后我的选择
- 实用且SEO友好的WordPress插件
- 快速实现wordpress迁移到RadonDB上
- 如何用30分钟搭一个wordpress网站?
- 如何提高WordPress的网站安全
- 淘宝特价版1元抢购经验 淘宝特价版新人活动5.1元