cdxy.me
Cyber Security / Data Science / Trading

[01] WordPress Tool "Press This" CSRF DoS

一个典型的CSRF,WP采用了form-get型修复方案。

功能点

WordPress Press This工具 为用户提供一种类似印象笔记的“剪藏”功能。

pic

即先将PressThis的链接存入浏览器书签,然后在看到感兴趣的其他web页面时,直接点击这个书签,就可以在WP的编辑器中引用这个页面。

pic

该功能在Scan模式下还会爬取网页中的资源(如图片等)并置入编辑器界面供作者使用。

pic

漏洞与利用

原Advisory指出:

这个Scan操作并未做CSRF检验,其访问的资源大小也未做限制,攻击者构造链接诱导管理员访问含有超大文件的页面可造成DoS。

提供的PoC如下:

<img src='http://<wp server>/wp-admin/press-this.php?u=http%3A%2F%2F<external server>%2Fbigfile.txt&url-scan-submit=Scan'>

事实上在我4.7.0的测试环境中,Scan功能并未从Server端向图片资源发起请求,而是直接返回了图片的地址,DoS影响的是浏览器端而非服务器,除非服务端和客户端在一台主机上...本地测试?

Patch

  • https://github.com/WordPress/WordPress/commit/263831a72d08556bc2f3a328673d95301a152829

pic

WP为Scan功能添加了_wpnonce参数作为csrftoken,在form中提交并在服务端检查。

修复后的请求参数如下:

GET /wp47/wp-admin/press-this.php?u=https%3A%2F%2Fwww.cdxy.me%2F&url-scan-submit=Scan&_wpnonce=70c450defe&_wp_http_referer=%2Fwp47%2Fwp-admin%2Fpress-this.php

[02] WordPress Cross-Site Scripting (XSS) via Taxonomy Term Names

Patch

pic

出问题的就是这段JS代码。

xbutton = $( '<button type="button" id="' + id + '-check-num-' + key + '" class="ntdelbutton">' + '<span class="remove-tag-icon" aria-hidden="true"></span>' + '<span class="screen-reader-text">' + window.tagsSuggestL10n.removeTerm + ' ' + val + '</span>' + '</button>' );

其中val即未过滤的用户输入,Patch中将其替换为span.html()进行实体编码。

功能点

经测试,找到Patch中js文件加载位置:

  • http://localhost/wp-admin/post-new.php

对应的js文件是tags-box.min.js

在涉及到添加或者修改标签的页面,用户手动输入一个tag时,在输入框下方动态生成一个按钮,用于删除该条tag。

示例:输入一个名为test的标签之后生成的按钮。

pic

PoC

可闭合<span>标签

</span><svg onload=alert('success')>

pic

Ref

  • https://wordpress.org/news/2017/03/wordpress-4-7-3-security-and-maintenance-release/
  • https://wpvulndb.com/wordpresses