WordPress 4.7.2 漏洞复现简记
[Vulnerability Analysis]
[01] WordPress Tool "Press This" CSRF DoS
一个典型的CSRF,WP采用了form-get型修复方案。
功能点
WordPress Press This工具 为用户提供一种类似印象笔记的“剪藏”功能。
即先将PressThis的链接存入浏览器书签,然后在看到感兴趣的其他web页面时,直接点击这个书签,就可以在WP的编辑器中引用这个页面。
该功能在Scan模式下还会爬取网页中的资源(如图片等)并置入编辑器界面供作者使用。
漏洞与利用
原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
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
出问题的就是这段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
的标签之后生成的按钮。
PoC
可闭合<span>
标签
</span><svg onload=alert('success')>
Ref
- https://wordpress.org/news/2017/03/wordpress-4-7-3-security-and-maintenance-release/
- https://wpvulndb.com/wordpresses