mysql漏洞如何打补丁_WordPress 5.1 CSRF to RCE 漏洞详解
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提交时调用的过滤函数有什么区别
普通用户提交过滤函数:
超级管理员无nonce提交过滤函数:
可以看出只是wp_kses中第二个参数不同,一个是current_filter(),一个是’post’
这里不同的,对应wp_kses中,应该是allowed_html参数值
这里举个普通用户评论的例子,普通用户提交评论,current_filter()方法返回的值是pre_comment_content,也就是说allowed_html参数值为pre_comment_content。可见下图动态调试结果
对应的,超级管理员无nonce提交时,这里的allowed_html参数值为”post”
那么allowed_html值不同,到底会有什么区别呢?
$allowed_html被传入wp_kses_split方法
进一步看wp_kses_split
注意到这里$pass_allowed_html = $allowed_html;
现在$allowed_html传给了$pass_allowed_html
我们要看看这两个不同的$allowed_html最终传递到哪里被用到
跟进_wp_kses_split_callback,$allowed_html传给了wp_kses_split2
跟进wp_kses_split2,$allowed_html被传给了wp_kses_attr
跟进wp_kses_attr,$allowed_html被传给了wp_kses_allowed_html
跟进wp_kses_allowed_html
一路跟踪,到了这里,$allowed_html终于有作用了
回顾一下,
超级管理员无nonce提交时,这里的allowed_html参数值为”post”
普通用户提交评论时, allowed_html参数值为”pre_comment_content”。
首先看超级管理员无nonce提交吗,allowed_html参数值为”post”,进入post分支
可以看到这里有一个wp_kses_allowed_html方法,跟进去看看
相当于一个白名单机制,再看看白名单上都有什么,看看$allowedposttags
这里’a’标签运行’rel’属性
再看看普通用户提交评论时, allowed_html参数值为”pre_comment_content”情况。
这里白名单是$allowedtags
只允许’href’与’title’
看到这里,明白wp_filter_post_kses 、wp_filter_ kses两个过滤函数有什么区别了吗?
可以用’rel’属性与不可以用’rel’,有什么区别呢?如何造成这次的csrf呢?看下图
wp-includesformatting.php
可以看到属性值在没有被转义处理的情况下就再次拼接在一起,
在a标签最终被拼接时,title的属性会被封装到双引号中,这样我们就可以构造数据使其闭合,从而执行js
Payload:
被双引号包裹后
单鼠标放置时,js执行
但是这个wp_rel_nofollow_callback哪里来的呢?
看一下wordpress对comment_content都采用了哪些默认的过滤器
wp-includesdefault-filters.php
上图三个分别是:
wp_rel_nofollow
convert_invalid_entities
balanceTags
看下wp_rel_nofollow
wp_rel_nofollow_callback是在这里被加载并使用的
结语
最后,整理下流程
此次漏洞的流程是:
(超级管理员&不合法nonce) ->(wp_filter_post_kses)->(’rel’属性在白名单中逃逸)->(wordpress加载默认评论内容过滤器wp_rel_nofollow)->(加载wp_rel_nofollow_callback) ->(未过滤并用双引号包裹title值)->(js执行)->(RCE
mysql漏洞如何打补丁_WordPress 5.1 CSRF to RCE 漏洞详解相关推荐
- wordpress漏洞_聊聊 WordPress 5.1.1 CSRF to RCE 漏洞
作者:LoRexxar'@知道创宇404实验室 时间:2019年3月14日 2019年3月13日, RIPS团队公开了一篇关于WordPress 5.1.1的XSS漏洞详情,标题起的很响亮,叫做wor ...
- 微软服务器安全补丁,明明白白打补丁,微软12月安全公告摘要详解
12月14日 今天迎来2011年最后一个微软补丁日(Patch Tuesday),微软一下子为我们送来13枚补丁,涉及到Windows(XP/Vista/Win7).Office.IE浏览器等,总计修 ...
- 【web安全】——命令执行漏洞(RCE)详解
作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭:不要让时代的悲哀 ...
- mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)
Mysql的数据类型主要分为三类:数字类型.字符串(字符)类型.日期和时间类型,由于时间紧迫,根据学习的需要 数字类型暂不做详解,等待有时间了在修改此文档,此文主要介绍mysql 数据类型中的字符串类 ...
- mysql group by having count_mysql中count(), group by, order by使用详解
最近做IM的时候遇到一个问题,同时用到了这三个关键字.就是查询一个人的离线消息详情,我们服务端返回给客户端显示的这个详情包括了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这其中 ...
- mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解
本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...
- mysql text类型 使用方法_MySQL使用TEXT/BLOB类型的知识点详解
一.TEXT和BLOB的区别 TEXT和BLOB家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或字符集,而TEXT类型有字符集或排序规则.说白了如果要储存中文则选择TEXT. 二.默 ...
- MySQL基础篇(04):存储过程和视图,用法和特性详解
本文源码:GitHub·点这里 || GitEE·点这里 一.存储过程 1.概念简介 存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行.存储过程 ...
- mysql拷贝文件安装_Mysql5.7.18的安装与主从复制图文详解
CentOS6.7安装mysql5.7.18 1. 解压到/usr/local目录 # tar -zxvf mysql-5.7.18-linux-glibc2.5-i686.tar.gz -C /u ...
- zip安装mysql没有软件,windows10系统安装mysql-8.0.13(zip安装) 的教程详解
安装环境说明 解压安装包 •解压路径:D:\develop\software •解压后mysql根目录:D:\develop\software\mysql-8.0.13-winx64 原则: 安装目录 ...
最新文章
- 你住的城市7.5亿年前长啥样?这张互动地图能让你看到
- AWS EC2 Run Command特性新增多重云脚本
- oracle11g dataguard完全手册3-failover active dataguard(完)
- abaqus单位怎么设置_ABAQUS-怎样模拟塑料瓶的抗挤压能力?
- 百度痞哥:百度贴吧的回帖为什么没做点赞功能?
- 2017-06-18 前端日报
- (十一)python3 只需3小时带你轻松入门——面向对象
- linux indent命令: 调整C原始代码文件的格式
- 使用opensll的md5对于string进行加密
- how to reference the parent form from the WPF control(Control in ElementHost)
- 存放哪些内容 项目中vuex_房屋安全鉴定中房屋抗震检测内容有哪些
- springmvc默认方法名为映射名_SpringIoC和SpringMVC的快速入门
- java单例默认_Spring bean为什么默认是单例
- 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇
- 一体打印机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 3D视觉创新方案分享:仓储VSLAM/商品三维重建/静态场景重建/表情识别等多个方向...
- Zookeeper 和redis做分布式锁区别
- 斐讯k2p openwrt固件改双WAN口
- 【UnityDragonBones】纸娃娃(一)替换身体部位图片
- 虚拟内存页面置换算法c语言,5虚拟内存,页面置换算法