短链接安全

  • A+
所属分类:安全文章

前言

想必大家也经常收到各种垃圾短信吧,短信中的链接一般都是短链接,类似于下图这样:

短链接安全

为什么这里面的URL为什么这么短?有什么好处?怎么做到的呢?

0x01 短链接概述

1.1 短链接的好处

  1. 短。短信和许多社交平台发布的内容有字数限制,若链接太长直接导致正文减少了。

  2. 简洁。比起一大堆不知所以的参数,短链接更加简洁、友好。

  3. 统计分析。当用户点击链接就会记录此行为然后进行分析的。

  4. 安全。不暴露访问接口及参数。

1.2 短链接原理

短链接一般是通过映射关系,将长长的一串网址,映射到几个字符的短链接上,建立好这种映射关系之后保存到数据库里,用户每次访问短链接的时候,需要到数据库里查询这个短链接对应的源网址,然后返回给用户。

短链接从生成到使用分为以下几步:

  1. 有一个服务,将要发送给你的长URL对应到一个短URL上。例如 www.baidu.com/active/activeInfo->www.t.cn/1

  2. 把短URL拼接到短信等的内容上发送。

  3. 用户点击短URL,浏览器用301/302进行重定向,访问到对应的长URL。

  4. 展示对应的内容。

短链接安全

  • 301: 代表 永久重定向,也就是说第一次请求拿到长链接后,下次浏览器再去请求短链的话,不会向短网址服务器请求了,而是直接从浏览器的缓存里拿,这样在 server 端就无法获取到短网址的点击数了,如果这个链接刚好是某个活动的链接,也就无法分析此活动的效果。所以一般不采用 301。

  • 302: 代表 临时重定向,也就是说每次去请求短链都会去请求短网址服务器(除非响应中用 Cache-Control 或 Expired 暗示浏览器缓存),这样就便于 server端 统计点击数,所以虽然用 302 会给 server 增加一点压力,但在数据异常重要的今天,这点代码是值得的,所以一般使用 302。

0x02 短链接风险

知道了用途及原理之后我们就可以在短链接服务过程中寻找可能存在的缺陷。

2.1 爆破

短链接的核心就是将短URL和长URL映射,一般是由大小写字母+数字构成,部分还存在 .等特殊字符。

若算法使用不当或者未考虑安全风险,导致短链接可预测、可爆破,将可能导致严重信息泄漏。比如:

2.1.1 爆破短网址服务获取大量服务、系统敏感信息

  • 获取个人信息

  • 获取订单、合同、报告等服务详情

  • 重置密码

短链接安全

2.1.2 薅羊毛

  • 批量邀请新用户,爆破短网址,批量点击注册链接,完成拉新薅羊毛;

  • 批量生成助力链接,爆破短网址,批量点击活动链接,完成活动薅羊毛;

2.2 服务端缺陷

由于短链接实现的源地址的映射,即数据库是Key-Value模式,那么若服务端接口存在缺陷,则可能导致SQL注入、XSS、SSRF等常规漏洞。

2.2.1 SQL注入

短链接安全

2.2.2 SSRF

比如部分提供短链接生成服务中在内容中会展示title等信息,会发起请求。若服务端校验不严将导致SSRF漏洞。

短链接安全

2.3 中间环节缺陷

现在各种流程可能都存在安全检测功能,主要分为两种场景:

一、手机中安全软件会自动读取短信中的短链接并检测短链接是否为恶意链接,以此来提醒用户;

二、各社交平台比如微信等在进行跳转的时候会检测跳转的链接是否为恶意链接,以此来判断是否跳转;

上述情况若在检测环节存在缺陷,则可能导致SSRF、XSS等漏洞。

0x03 短链接防护

  • 加强算法,生成不易被破解的KEY;

  • 设置短链接生存周期,过期即失效;

  • 增加访问限制,比如访问频率和访问总量;

  • 源地址不应包含敏感信息;

  • 源地址应做二次鉴权,若特殊情况可结合访问周期进行限制;

参考文章:

  • https://www.douban.com/note/580470543/

  • https://juejin.cn/post/6844903873950269454

  • https://security.tencent.com/index.php/blog/msg/126

  • https://yefan813.github.io/2020/03/23/%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%9F%AD%E9%93%BE%E6%8E%A5%E6%9C%8D%E5%8A%A1/

  • https://github.com/zjcscut/octopus

短链接安全


本文始发于微信公众号(安全泰式柑汁):短链接安全

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: