wordpress任意文件删除漏洞分析
本文内容比较多,建议点击https://blog.formsec.cn/2018/07/03/wordpress%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E5%88%A0%E9%99%A4%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
进行浏览。
0x00 综述
2018年6月28日,国外安全研究组织rips团队发布了一篇WordPress任意文件删除到代码执行的漏洞文章,文章中指出攻击者可以利用此漏洞删除任意文件,比如删除WordPress建站配置文件wp-config.php,通过删除此文件可导致界面进入网站安装页面,通过重装网站后进入管理员后台即可获取网站shell从而控制WordPress网站,故该漏洞的危害很大。唯一缺陷就是需要攻击者拥有操作多媒体文件的功能,一般作者权限就可以触发漏洞。
攻击难度:中。
危害程度:高。
影响的版本: ≤4.9.6
0x01 技术分析
在文件/wp-admin/posts.php
中,当编辑附件时有如下代码:
首先通过wp_get_attachment_metadata
函数获取当前post_id对应内容的metadata
信息,也就是数据库表wp_postmeta
中的信息,然后给metadata
信息中添加一个thumb
的内容,这个thumb
的内容通过POST
直接传递,没有经过处理,最后更新metadata
的信息。
然后在删除媒体内容时,有如下代码:
当前用户有删除内容的权限时,调用了wp_delete_attachment
函数,这里的post_type
认就是attachment
。
然后跟进wp_delete_attachment
函数,在文件/wp-includes/post.php
中
跟进次函数:
同样首先通过wp_get_attachment_metadata
函数获取post_id
对应内容的metadata
信息,然后当thumb
不为空时,到最后unlink
文件:
从meta[‘thumb’]
到thumbfile
,再从thumbfile
进入unlink
函数,没有对文件进行过滤处理,导致直接删除文件。
通过上面的分析,我们首先通过修改媒体文件,给thumb赋值为你想删除的文件,然后再删除此媒体文件,既可以删除任意文件。
0x02 漏洞验证
首先我们注册一个author的作者权限用户,登陆后添加媒体文件,再编辑文件
并且找到修改图像时的wpnonce值
然后发送修改图像的请求,这里我们在网站根目录下新建了一个111111文件,然后修改要删除的文件为111111:
此时已经修改图像,并且图像的metadata中thumb的内容就是../../../../111111
文件路径。
然后我们在删除该文件,首先找到删除文件时的wpnonce:
最后直接发送删除请求:
http://localhost/wordpress-4.7.4/wp-admin/post.php?post=12&action=delete&_wpnonce=d85e71ffa9
同下断点可以看到这里删除的具体文件:
最后成功删除我们新建的111111文件。
那么删除wp-config.php文件同理。
0x03 防护方案
目前官方没有提供修复方案,这里给出临时修复方案。
在/wp-admin/post.php中,当修改图像文件时,在wp_update_attachment_metadata
更新metadata
时对传入的thumb文件进行处理,如图:
0x04 参考链接
https://blog.ripstech.com/2018/wordpress-file-delete-to-code-execution/
Other
FormSec
团队近期在筹建一支CTF战队,目标就是成为国内顶尖的CTF战队,参与国内外CTF赛事。我们可以尽我们所能为CTF战队成员提供一些我们可以提供的福利。目前,战队已经有数位web
、二进制
等大牛,期待有更多的大佬加入!
如有兴趣请联系admin#formsec.cn详聊
往期精彩回顾
铁人三项2018 pwn [aleph1] Writeup
铁人三项2018 pwn [heapmain] Writeup
ISCC 2018 Writeup
- Jquer学习之jQuery(function(){})与(function(){})(jQuery)之间的区别
- 服务端常见性能隐患分享
- ExtJs学习笔记(19)_复杂Form示例
- Linux快速入门01-基础概念
- SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)
- 对php多态的理解
- JavaScript值延迟脚本和异步脚本
- JavaScript之arguments.callee
- JavaScript之面向对象学九(原型式继承和寄生式继承)
- ExtJs学习笔记(18)_ExtJs嵌入FCK示例
- Html与CSS快速入门01-基础概念
- 利用Fck的javascript-API创建fck编辑器
- ASPNET_WEBAPI快速学习02
- ExtJs学习笔记(17)_table布局
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ELF文件格式的详解
- 一个开源的RTOS的Chibios的评测
- CS学习笔记 | 25、邮件防御
- CS学习笔记 | 26、杀毒软件
- Python-pymysql
- 我又踩坑了!如何为HttpClient请求设置Content-Type标头?
- 在CentOS7上安装开源Verilog仿真工具EpicSim
- 【CS学习笔记】27、applet渗透测试手法
- Python-WSGI接口
- CentOS7-Nginx配置Let's-Encrypt-SSL证书
- CentOS7-Nginx编译安装
- 总被审稿人提起的多重假设检验校正是什么?
- Python网络编程
- 读一本书 | systemverilog之内建数据类型
- 实战解读ASP.NET Core身份认证