漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-059796
漏洞标题:e乐充公交卡充值支付漏洞(可实现不花钱充值)
相关厂商:北京亿阳汇智通科技股份有限公司
漏洞作者: 大头鬼
提交时间:2014-05-07 18:23
修复时间:2014-08-05 18:24
公开时间:2014-08-05 18:24
漏洞类型:设计错误/逻辑缺陷
危害等级:高
自评Rank:20
漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-05-07: 细节已通知厂商并且等待厂商处理中
2014-05-10: 厂商已经确认,细节仅向厂商公开
2014-05-13: 细节向第三方安全合作伙伴开放
2014-07-04: 细节向核心白帽子及相关领域专家公开
2014-07-14: 细节向普通白帽子公开
2014-07-24: 细节向实习白帽子公开
2014-08-05: 细节向公众公开
简要描述:
支付宝钱包公交卡充值(e乐充公交卡)支付漏洞:公交卡充值成功后实现支付金额完美退款
详细说明:
1.应用介绍:
e乐充公交卡是亿阳信通旗下子公司亿阳汇智通公司发布的中国首款NFC手机支付APP软件,集公交卡手机充值,余额查询,NFC支付功能为一身。
支付宝钱包8.1.0.43001版本开始支持NFC为公交卡一卡通充值,其最终是调用e乐充公交卡应用,使用支付宝钱包来支付完成金额充值。
e乐充公交卡作为支付宝的一个服务(独立的应用服务),在支付宝客户端上提供下载安装。
测试版本:
apk : com.boco.alipay.activity, 8, 1.0.08, e乐充公交卡
apkmd5: 96a320dd7f311b0fddd9b4223bd10012
证书 :
certmd5: d5eb2cba5245554667e2a38518a4e27d
issuer: C=CH, ST=Beijing, L=Beijing, O=BOCO_HZT, OU=BOCO_HZT, CN=SJYKT
subject: C=CH, ST=Beijing, L=Beijing, O=BOCO_HZT, OU=BOCO_HZT, CN=SJYKT
2.漏洞分析:
支付宝客户端加入了e乐充公交卡服务,e乐充公交卡是调用支付宝接口进行支付,支付成功后,根据返回的支付结果,提示贴公交卡(支付结果为成功),此时服务器端会通过手机的NFC接口向公交卡进行读写数据操作,完成公交充值功能。但成功充值后,可二次利用支付宝的支付结果,来影响软件的交易流程,再次充值,来使e乐充公交卡应用产生交易异常,退还第一次支付的金额到支付宝账号中。
漏洞详情:
上截图为支付宝下载的e乐充公交卡apk反编译后的代码截图,图中的Pay方法中调用的是支付宝接口来执行支付操作,Pay函数的返回值str为支付结果。
例如,支付成功时的str值为:
resultStatus={9000};memo={};result={partner="20881xxxxxxx"&seller_id="208811xxxxxx"&out_trade_no="13140xxxxxx"&subject="北京亿阳汇智通科技股份有限公司"&body="北京市政公交一卡通充值"&total_fee="1.0"¬ify_url="https%3A%2F%2Fwww.hzt360.com%2Fbservice%2FalipayBackgroundResponseOfPay"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&success="true"&sign_type="RSA"&sign="D7ek+Ozo2PzuceSxjOamgH5wDyKcl7RIDhk3qDdID1aAr1jFh9fw+UufW+72PHiz2ibn+GDwkJuPInqSBgdHPPHuimqjDBO5xNx6MQSGeTUe0li8lkJkPxvyGUs0bhmgT39hfcchA/jDabxcpwFdNFj5/IBmfiATi8XMoi6Hemc="}
例如,支付取消时的str值为:
resultStatus={6001};memo={操作已经取消。};result={}
最终,客户端根据Pay函数的返回值str做判断是否成功(包括信息签名校验、resultStatus的值),支付成功则提示将公交卡贴在手机后部,完成对公交卡数据的读写充值操作。但在公交卡数据读写过程中出现异常时,可以通过给出的异常提示对话框,点击撤销按钮,此时会将刚才支付的金额返还给对应的支付宝账号。
经过分析测试发现,可对第一次支付宝支付成功时Pay函数返回的字符串信息进行二次利用,再此进行公交卡充值支付操作,但在支付界面不做真正的支付,而是取消支付,让取消后的Pay函数返回值为第一次支付宝支付成功时Pay函数值,此时客户端判断此次支付成功,提示用户将公交卡贴在手机后部,完成对公交卡数据的读写充值操作,这时数据的读写会产生异常,客户端变弹出提示对话框,点击撤销按钮,此时服务器端会将第一次支付的金额退还到原支付宝账户上,即可实现免费公交卡充值。
漏洞证明:
3.漏洞利用:
①获取第一次支付宝支付成功时Pay函数的返回值,这个可通过Hook来实现。
②通过Hook Pay函数,修改Pay函数的返回值,使得在取消支付时Pay函数的返回值为第一次支付宝支付成功时Pay函数的返回值。
③再次充值支付操作,在支付界面取消支付,撤销充值。
截图如下:
原始账户金额截图
公交卡充值支付宝支付30元后账户余额截图
Hook Pay函数后修改返回值,再次充值支付操作,但在支付界面取消支付:
取消支付截图
此时提示贴卡,进行数据读写,但贴卡后显示交易异常,此时点击撤销按钮:
贴卡异常截图
充值金额退回提示截图
支付宝账单信息
e乐公交卡充值记录
e乐公交卡充退记录
修复方案:
版权声明:转载请注明来源 大头鬼@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:12
确认时间:2014-05-10 00:27
厂商回复:
最新状态:
暂无