普通用户提交过滤函数:
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322194A8-11.jpg)
文章插图
超级管理员无nonce提交过滤函数:
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/032219D46-12.jpg)
文章插图
可以看出只是wp_kses中第二个参数不同 , 一个是current_filter() , 一个是’post’
这里不同的 , 对应wp_kses中 , 应该是allowed_html参数值
这里举个普通用户评论的例子 , 普通用户提交评论 , current_filter()方法返回的值是pre_comment_content , 也就是说allowed_html参数值为pre_comment_content 。可见下图动态调试结果
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221955N-13.jpg)
文章插图
对应的 , 超级管理员无nonce提交时 , 这里的allowed_html参数值为”post”
那么allowed_html值不同 , 到底会有什么区别呢?
$allowed_html被传入wp_kses_split方法
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322192540-14.jpg)
文章插图
进一步看wp_kses_split
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322193935-15.jpg)
文章插图
注意到这里$pass_allowed_html = $allowed_html;
现在$allowed_html传给了$pass_allowed_html
我们要看看这两个不同的$allowed_html最终传递到哪里被用到
跟进_wp_kses_split_callback , $allowed_html传给了wp_kses_split2
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221a139-16.jpg)
文章插图
跟进wp_kses_split2 , $allowed_html被传给了wp_kses_attr
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322192940-17.jpg)
文章插图
跟进wp_kses_attr , $allowed_html被传给了wp_kses_allowed_html
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221a142-18.jpg)
文章插图
跟进wp_kses_allowed_html
一路跟踪 , 到了这里 , $allowed_html终于有作用了
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221aO0-19.jpg)
文章插图
回顾一下 ,
超级管理员无nonce提交时 , 这里的allowed_html参数值为”post”
普通用户提交评论时 , allowed_html参数值为”pre_comment_content” 。
首先看超级管理员无nonce提交吗 , allowed_html参数值为”post” , 进入post分支
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221911S-20.jpg)
文章插图
可以看到这里有一个wp_kses_allowed_html方法 , 跟进去看看
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221951D-21.jpg)
文章插图
相当于一个白名单机制 , 再看看白名单上都有什么 , 看看$allowedposttags
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/032219A37-22.jpg)
文章插图
这里’a’标签运行’rel’属性
再看看普通用户提交评论时 , allowed_html参数值为”pre_comment_content”情况 。
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322196159-23.jpg)
文章插图
这里白名单是$allowedtags
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/03221a295-24.jpg)
文章插图
只允许’href’与’title’
看到这里 , 明白wp_filter_post_kses 、wp_filter_ kses两个过滤函数有什么区别了吗?
可以用’rel’属性与不可以用’rel’,有什么区别呢?如何造成这次的csrf呢?看下图
wp-includesformatting.php
![WordPress 5.1 CSRF to RCE 漏洞详解](http://img.jiangsulong.com/220413/0322193T2-25.jpg)
文章插图
可以看到属性值在没有被转义处理的情况下就再次拼接在一起 ,
在a标签最终被拼接时 , title的属性会被封装到双引号中 , 这样我们就可以构造数据使其闭合 , 从而执行js
Payload:
文章插图
被双引号包裹后
文章插图
单鼠标放置时 , js执行
推荐阅读
- WordPress 5.4正式发布:加入新区块 界面更简洁
- 为何要清除WordPress网站上的缓存?
- 2019年最吸引攻击炮火的 Web 框架:WordPress 和 Apache Struts
- 什么是CSRF攻击?如何防御CRSF攻击?
- zblogphp好用吗?个人站长使用zblog和wordpress对比后我的选择
- 实用且SEO友好的WordPress插件
- 快速实现wordpress迁移到RadonDB上
- 如何用30分钟搭一个wordpress网站?
- 如何提高WordPress的网站安全
- 淘宝特价版1元抢购经验 淘宝特价版新人活动5.1元