URL Scheme Attack

isnull   ·   发表于 2019-04-23 11:55:33   ·   漏洞文章

URL scheme 简介


URL scheme 是什么?简单的说就是部分 app 应用会注册自定义自己的协议,通过访问这类协议来调用启动 app。url scheme 的工作流程是:app 在系统中注册 url scheme 项,当浏览器或其他支持 url 的应用访问 特定的 url scheme 时,在系统中查找相对应的 url scheme 项,从而启动该应用程序。基本上是各个平台的 app 都有。


例如

mailto:admin@example.com,thunder://xxxxx,tel:+18888888888,sms:18688886666,alipays://platformapi/startapp等等。当然还包括还有常见的 file、dict、ftp,不过这里想说的是各类 app 应用程序的 url scheme。


格式

[scheme]://[host]/[path]?[query]


使用场景

  • 特定后缀名的文件启动程序
  • 网页或者链接中的描点启动程序
  • 案例

    windows 平台下 URL scheme 会在注册表中注册,具体可参考
    在注册表中像这样格式存在的


    snipaste_20181109_192603.png


    例如



    假设 test.exe 是注册的应用程序,%1 是占位符启动参数。通过 url 传递参数给目标程序。双引号是为了避免参数中存在空格。这样的形式就很容易通过拼接参数出现命令注入了。

    HKEY_CLASSES_ROOT 下不仅保存了伪协议的列表,还有文件扩展名的关联数据。事实上 Win32 程序处理本地文件和 url 的打开是类似的,甚至可以使用同一套 Win32 API —— ShellExecute(Ex) 。算上 ANSI 和 Unicode 的版本,一共 4 个函数。


    打开文件

    ShellExecuteW(NULL, L"open", L"c:\\test.txt", NULL, NULL , SW_SHOW );

    打开链接

    ShellExecuteW(NULL, L"open", L"https://www.baidu.com", NULL, NULL , SW_SHOW );

    ShellExecute 可以有利用的两个点:
    传入 url,却被解析成本地路径而变成打开文件甚至运行可执行文件;
    其次是关联命令行里包裹参数 "%1" 的双引号可以被闭合掉的。


    www.baidu.com..\..\..\..\..\..\..\..\..\..\..\windows\system32\calc.exe

    snipaste_20181109_190055.png


    windows 系统在运行框输入,利用多个跳转符,后面的 windows\system32\calc.exe 会被当成文件执行,运行即可弹出计算器,当年 QQ 的远程命令执行漏洞也是这个 exp


    Edge 远程代码执行


    edge(CVE-2018-8495),2018 年 10 月 Edge 的远程代码执行漏洞,利用了 WSHFile 协议,通过参数注入,造成远程代码执行。
    查看 \ HKEY_CLASSES_ROOT\WSHFile\Shell\Open\Command 的值
    snipaste_20181109_193956.png

    WSHFile 是指向了 wscript.exe,wscript.exe 是 windows 的内置的脚本解释器,可以通过 WSHFile 去运行一个脚本。
    具体可看其漏洞分析,最后构造的 exp 如下:


    <a id="q" href='wshfile:test/../../WinSxS/AMD921~1.48_/SyncAppvPublishingServer.vbs" test test;calc;"'>test</a><script>window.onkeydown=e=>{    window.onkeydown=z={};    q.click()}</script>

    snipaste_20181110_163428.png

    这是一个例子,还有更多的例子如 Electron 导致 vscode、网易云命令执行的例子


    Android URL scheme

    android 上的 Intent Scheme URLs 攻击基于 android 浏览器桥梁间接实现 Intend-Based 攻击。可以读取文件或者启动调用的应用程序。

    语法如下:


    <script>location.href = "intent:mydata#Intent;action=myaction;type=text/plain;end"</script>

    等价的 java 语法:


    Intent intent = new Intent("myaction");  intent.setData(Uri.parse("mydata"));  intent.setType("text/plain");


    例如:

    1. <a href="intent:smsto:10000#Intent;action=android.intent.action.SENDTO;end">
    2.   发送短信
    3. </a><br>

    4. <a href="intent:#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end">
    5.   打开相机
    6. </a><br>

    20181110172511.jpg


    使用 Intent Scheme 就可以通过浏览器调用 android 上的应用。

    还有一类就是第三方的 URL Scheme,来启动 android 上的 app。以打开某些网页会启动支付宝到抢红包界面为例


    <html><script>window.location.href='alipays://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=https%3A%2F%2Fqr.alipay.com%2Fc1x05309e4ttz2v7xrwrzcd%3F_s%3Dweb-other'</script></html>


    效果如下

    ec413b7289d2ec6a4cf5492e658b81cb-alipay.gif


    只是这里的 qrcode 失效了,所以领取失败,换成自己的就可以了。
    更进一步的就是之前的支付宝应用克隆,不过它除了伪协议,还利用了 webview 跨域,和 APP 的 setAllowUniversalAccessFromFile URLs 值为 true,导致 File 协议可跨域读取文件。


    总结


    URL scheme 是为了操作系统、浏览器、应用方便交互设计,但操作系统不同、URL scheme 功能不同,会导致存在安全问题。尤其是利用浏览器或者应用程序存在的漏洞,来攻击操作系统,扩大攻击面。


    打赏我,让我更有动力~

    0 条回复   |  直到 2019-4-23 | 1833 次浏览
    登录后才可发表内容
    返回顶部 投诉反馈

    © 2016 - 2024 掌控者 All Rights Reserved.