用户
搜索

[二进制安全] Scheme介绍及简单利用

  • TA的每日心情
    开心
    2020-7-20 21:20
  • 签到天数: 28 天

    连续签到: 1 天

    [LV.4]经常看看II

    版主

    Rank: 7Rank: 7Rank: 7

    8

    主题

    84

    帖子

    633

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2016-10-9

    i春秋签约作者

    发表于 2020-1-10 16:10:22 16723
    本帖最后由 Mstery夕颜 于 2020-1-10 16:14 编辑

    0x00 介绍

    Scheme是安卓中的一种页面跳转协议,通过自定义的scheme协议,可以跳转app中的各个页面;利用scheme协议,服务器可以告诉app跳转至哪个页面、通过通知栏消息定义跳转页面、通过H5网页跳转页面等

    0x01 使用场景

    1. 客户端根据服务器下发跳转路径跳转到相应页面
    2. H5页面根据具体跳转路径跳转到app内并打开具体的页面,如没有则跳转至下载
    3. app收到服务器下发的通知栏消息,根据消息的跳转路径跳转至相关页面
    4. app根据url跳转至另一个app
    5. 二维码扫码跳转

    0x02 scheme格式

    scheme的完整路径格式:scheme://host:port/path/params   (跟url其实一样)

    举例:xiyan://bbs.ichunqiu.com/xiyan?userid=1

    scheme=xiyan -- 该scheme协议名称
    host=bbs.ichunqiu.com -- 该scheme地址域
    port=80 -- 端口
    path=/xiyan -- 路径
    query=  ?userid=1 -- 参数

    0x03 使用scheme

    在AndroidManifest.xml下的<activity />标签中增加<intent-filter />
    <activity
                android:name=".GoodsDetailActivity"
                android:theme="@style/AppTheme">
                <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
                <intent-filter>
                    <!--协议部分,随便设置-->
                    <data android:scheme="xiyan" android:host="bbs.ichunqiu.com" android:path="/xiyan" android:port="80"/>
                    <!--下面这几行也必须得设置-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.BROWSABLE"/>
                </intent-filter>
            </activity>
    
    获取scheme跳转的参数
    Uri uri = getIntent().getData();
    if (uri != null) {
        // 完整的url信息
        String url = uri.toString();
        Log.e(TAG, "url: " + uri);
        // scheme部分
        String scheme = uri.getScheme();
        Log.e(TAG, "scheme: " + scheme);
        // host部分
        String host = uri.getHost();
        Log.e(TAG, "host: " + host);
        //port部分
        int port = uri.getPort();
        Log.e(TAG, "host: " + port);
        // 访问路劲
        String path = uri.getPath();
        Log.e(TAG, "params: " + params);
        List<String> pathSegments = uri.getPathSegments();
        // Query部分
        String query = uri.getQuery();
        Log.e(TAG, "query: " + query);
        //获取指定参数值
        String goodsId = uri.getQueryParameter("userid");
        Log.e(TAG, "userid: " + userid);
    }
    scheme调用方式

    网页上:

    <a href="xiyan://bbs.ichunqiu.com/xiyan?userid=1">查看用户资料</a>

    0x04 安全隐患

    从上面所说的来看,scheme是需要满足多个条件才会触发的,那么是否还会存在安全隐患呢?答案是肯定的。

    scheme在设置监听的时候实际上并不强制需要指定host/port/path,这就导致了一些黑客,可以利用scheme的特性,欺骗用户使用scheme在app内打开特定的链接,由于是app打开的内容,因此普通用户很难对此产生怀疑。

    0x05 实际案例&利用

    (以下内容转自微信公众号:黑鸟)

    一、短信链接篡改实施诈骗

    在TikTok的主要网站:www.tiktok.com上,有一项功能可以让用户向自己发送SMS短信以下载该应用程序,这也就造成了,TikTok可以将SMS短信发送到任何电话号码。

    希望向受害者发送SMS消息的攻击者可以使用代理工具(例如Burp Suite)捕获HTTP请求。该手机参数中,短信将发送到与电话号码DOWNLOAD_URL参数是会出现在SMS短信中的下载链接:

    正常发送的短信:

    那么,只要更改download_url参数,那么将导致发送已经伪造后的SMS消息,其中包含攻击者选择插入的恶意链接。

    以下屏幕截图演示了包含恶意链接的欺骗性SMS消息。使用以下链接attacker.com进行插入

    包含https://attacker.com链接的诈骗短信,但仍然来自官方的发信号。

    二、应用层链接跳转

    在Android手机上对TikTok应用程序进行逆向时发现它具有指定URL scheme的功能,可以通过浏览器在TikTok应用程序中调跳转到其他链接。

    下图为TikTok APP监听的目标是"https://m.tiktok.com"schema和"musically://"自定义schema

    关于schema上面已经了解过了

    结合上面第一个SMS链接欺骗漏洞,攻击者可以发送包含上述schema的自定义链接。由于自定义链接将包含“ url ”参数,因此当APP打开一个Web视图(浏览器)窗口,并从APP转到通过该参数编写的网页时候,这时任何请求将与用户的cookie一起发送

    例如当点击这个链接后

    如代码所示,图中便是触发链接后将开始解析的代码,Tiktok将打开一个Web视图(浏览器)窗口,并转到http://10.10.10.113:8000 ,即由攻击者控制的Web服务器,从而使攻击者有可能代表用户发送请求。

    0x06 利用手法

    1. 通过scheme的特性,使用scheme跳转的目标为自己创建的网页(比如钓鱼),因为是app打开的,所以用户一般不会怀疑。
    2. apple没有任何限制或者审核这个URL的措施,也就是说如果有两个相同的scheme,那么系统唤醒的应用程序就可能不是你想唤醒的

    0x06 如何避免安全隐患

    限制scheme的host
    限制scheme同名

    本帖被以下淘专辑推荐:

    能找到scheme但是不会进行拼接利用
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册