虽然电子商务为我们提供了更加便利的生活,但它目前正面临着互联网上越来越多的威胁。根据Alexa统计(Alexa top 1M e-commerce platforms)的2018年最受欢迎的电子商务平台,电子商务平台Magento Commerce目前占有超过14%的市场份额,成为全球第二大电子商务平台。Magento的客户包括一些知名度很高的大公司,包括惠普,可口可乐和佳能。
FortiGuard Labs团队最近在Magento发现了一个跨站点脚本(XSS)漏洞。此XSS漏洞是由Magento在将其插入动态生成的窗体小部件表单之前没有清理用户提供的数据引起的。虽然此XSS漏洞仅存在于Magento管理员页面上,但它可能允许远程攻击者在受害者的浏览器上执行任意代码,然后控制Magento高权限帐户以访问敏感数据或控制存在漏洞的网站。
此XSS漏洞影响2.1.16之前的Magento Commerce 2.1,2.2.7之前的Magento Commerce 2.2。
分析
编辑Magento网站页面时,有两种模式:WYSIWYG模式和HTML模式。在WYSIWYG模式中,其中一个按钮称为“Insert Widget ...”(参见图1)。图2显示我们可以通过访问链接http://IP/magento/index.php/admin/admin/widget/index/直接调用Insert Widget函数的表单。
图1. WYSIWYG模式下的Insert Widget功能
图2.直接访问Insert Widget函数表单
图2中的表单由Widget.php中的php函数生成,该pho位于/vendor/magento/module-widget/Block/Adminhtml/Widget.php (GitHub link)。它处理用户提供的URL,过滤参数“widget_target_id”的值,并将其插入到脚本标记中,如图3所示。例如,当我们访问链接http://IP/magento/index.php/admin/admin/widget/index/widget_target_id/yzy9952时,widget_target_id的值将被插入到脚本标记中,如图4所示。
图3.生成表单脚本标记的Widget.php
图4. Widget.php生成的表单脚本标记
此功能仅通过使用符号关闭它来清理用户提供的数据,例如“”,“}”和“;”。但是,通过添加另一组符号来关闭当前函数,可以轻松绕过此过程,例如“)});”,并通过添加HTML注释标签“<! - ”来注释掉后面的所有代码。这可在以下示例中看到:http://IP/magento/index.php/admin/admin/widget/index/widget_target_id/yzy9952")});test<!--。
图5.绕过过滤器
此时,攻击者可以在此网页中插入任意代码。我们可以看到,在这个脚本标记的开头,它调用了一个名为require的函数,但require函数并不存在。但是,我们可以创建“require”函数,将代码添加到其中,然后执行它。例如,通过访问以下PoC,我们提供的代码将被执行:http://IP/magento/index.php/admin/admin/widget/index/widget_target_id/yzy9952")});function%20require(){alert(document.domain)}<!--.
图6. PoC
解决方案
我们鼓励所有使用存在漏洞版本的Magento Commerce用户升级到最新版本或立即应用最新的补丁。此外,已部署Fortinet IPS解决方案的机构已通过以下签名受到保护,不受此漏洞的影响:
Adobe.Magento.Widget.XSS
还没有评论,来说两句吧...