Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >短网址安全浅谈

短网址安全浅谈

原创
作者头像
腾讯安全应急响应中心
修改于 2018-10-23 10:04:09
修改于 2018-10-23 10:04:09
1.9K0
举报

[ Tencent Blade Team ] 彦修

前言

何谓短网址(Short URL)?顾名思义,就是形式上比较短的网址,当前主要是借助短网址来替代原先冗长的网址,方便传输和分享。短网址服务也就是将长网址转换为短网址的服务,这种服务在方便了广大网民的同时也带来了一定的安全风险。

Tencent Blade Team专门对短网址的安全问题进行过研究,也在KCON 2018上进行过分享过部分成果,本文也是对议题《短网址的攻击与防御》的解读和补充。

特别感谢:lake2、Wester、martinzhou

一、短网址基础

短网址服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短。用户访问缩短后的URL时,通常将会重定向到原来的URL。短网址服务主要起源于一些具有字数限制的微博客服务,但是现在广泛用于短信、邮件等。

很多安全问题是跟安全场景相关的,随着场景的不断变化,安全问题也是变化的。短网址的初衷是在微博这种限制字数的公共平台使用,也就是说它基本是公开的,但是后续在个人短信和邮件之中,其实有部分已经是私密的。 这直接引发了短网址第一个比较大的潜在风险。

在了解短网址风险和漏洞之前,我们首先应该了解下短网址是什么以及如何工作。

短网址服务的基本流程:用户将长网址提交到短网址服务中,之后短网址服务经过URL处理之后,利用转换算法对长网址进行转换,最后分别将长网址和短网址存储到数据库之中。部分短网址服务为了防止出现对短地址进行连续转化或者提供一些展示长网址TITLE的功能,所以会对长网址进行访问。

其实对于短网址服务最核心的问题就是短网址的转换算法。那么常用的短网址算法有哪些呢?我们分析了GitHub上star数量最多的十个短网址服务对应的算法,大致分为三类:进制算法、随机数算法和HASH算法。

下面我利用简单的三个小例子介绍下对应的算法:

(1)进制算法:

算法简述:一个以数字、大小写字母共62个字符的任意进制的算法。

数据库中ID递增,当ID为233,则对应短网址计算过程如下:

①设置序列为“0123456789abcdefghijklmnopqrstuvwxyz”

② 233/36=6

③ 233%36= 17

④依次取上述字符的6位,17位,则为6h

其生成之后的短网址为xx.xx/6h

(2)随机数算法:

算法简述:每次对候选字符进行任意次随机位数选择,拼接之后检查是否重复

若要求位数为2,则其对应短地址为计算过程如下:

①设置字符序列“0123456789abcdefghijklmnopqrstuvwxyz”

②根据字符个数设置最大值为35,最小值为0,取2次随机数假设为:6,17

③依次取上述字符的6位和17位,则为6h

其生成之后的短网址为xx.xx/6h

(3)HASH算法:

算法简述:对id进行hash操作( 可选:利用随机数进行加盐),并检查是否重复

设置ID自增,若ID=233,则其对应短地址为计算过程如下:

①取随机数为盐

②对233进行sha1加密为:aaccb8bb2b4c442a7c16a9b209c9ff448c6c5f35:2

③要求位数为7,直接取上述加密结果的前7位为:aaccb8

其生成之后的短网址为xx.xx/2e8c027

了解完长网址转为短网址的流程之后,我们下边主要简单说明下短网址转化为长网址的流程,用户访问短网址,短网址服务返回一个302或者301的响应,从而跳转到长网址。这个地方,几乎所有短网址服务商会选择302,因为302方便统计和分析用户属性等数据。

二、短网址服务风险

由于短网址服务自身存在的设计缺陷问题,尤其是一般短网址采用6位或者7位字母和数字的集合,可以被很好的预测,从而被针对性的爆破。

而在爆破中最重要的一个步骤就是如何检测当前短网址使用的算法,从而生成该算法对应的字典,下边我们给出一些常见的算法检测过程:

1、进制算法

(1)第三方短网址服务

针对第三方的短网址服务,可以多次输入网址,查看返回短网址是否连续,连续则为进制算法,如下:

此外注意,由于个别为分布式短网址服务,id非单一递增,会出现多个字符规律变化,如:87BNwj、87BO82、87BOqw、87BOGz、87BPpD

(2)自营短网址服务:

对于自营短网址服务可以采用以下两个步骤进行,,

① 直接访问xx.xxx/1及xx.xxx/2低位等后缀,若均存在基本可以判定使用了进制算法进行转换。

② 对存在记录的后缀进行增加或减少尝试,若均存在记录或者规律间隔存在记录则基本认为使用了进制算法。

即:若某短网址存在http://xxx.xx/Abzc4 ,对Abzc4中最后一个单字符{0-Z}共62次变化。若均存在记录或存在a,c,e等有规律间隔情况,则同样可以认为使用了进制算法。

2、hash算法&随机数算法

(1)第三方短网址服务

对于第三方可以多次输入网址,查看返回短网址是否连续,不连续无规律则为HASH算法&随机数算法。如下图:

(2)自营短网址服务

① 直接访问xx.xxx/1及xx.xxx/2低位等后缀,若均不存在则进行步骤2。

② 对存在记录的后缀进行增加或减少尝试,若非均匀间隔存在记录则基本认为使用了进制算法。

即:若某短网址存在http://xxx.xx/Abzc4 ,对Abzc4中最后一个单字符{0-Z}共62次变化。若无明显规律则基本认为为HASH&随机数算法

接下来,我们分享一下短网址的两个攻击场景,第一个是由于部分短网址在传输过程使用了含有敏感权限和敏感信息的长网址,由此造成大量个人信息泄露:,第二个是由于短网址的可预测和可爆破,有时候可能会产生一些想象不到的效果。

案例一:爆破短网址服务获取大量服务、系统敏感信息:

1、获取个人信息

http://xx.xx/auth?contractId=d57f17139247036b72******b5554a830305ec139d

2、获取合同

https://xx.xx/get.action?transaction_id=290414****03784&msg_digest=RUQ2MUQ5NjcxQzc5MjcxQ*******4QTExNTZFNjgzQTJENEExQjc5Nw==

3、重置密码

https://xx.xx/resetPassword?emailType=RESET_PASSWORD&encryptionEmail=***GHOsR%2FMfiNEv8xOC29.&countersign=eyJhbGciOiJIUzUxMiJ9.eyJBQlNPTFVURV9FWFBJUkVfVElNRV9NSUxMUyI6IjE1M******zA1OTMxNjU4OTQiLCJORVdfRU1BSUwiOiJ5YW54aXUwNjE0QGdtYWlsLmNvbSIsIlRPS0VOX1RZUEUiOiJSRVNFVF9QQVNTV09SRCIsIkVNQUlMIjoieWFueGl1MDYxNEBnbWFpbC5jb20ifQ

其实单从上边的爆破出来的链接来看,每一个都极其的难以猜解,但是正是因为使用了短网址,从而把一些非常难猜解的高维度信息降低成了非常容易预测的低维度信息,就像你造了很坚固的房门,但是别人手里却有备用钥匙。

案例二:业务安全攻击链

1、邀请链接直接发送给邀请人,邀请人点击即可完成注册;

2、邀请链接以短网址发送;

3、批量邀请,爆破短网址,批量点击注册,即可完成薅羊毛;

某个应用有老用户邀请新用户的赚赏金活动,邀请链接以短网址形式发送给新用户,新用户点击链接之后,则赏金会放到老用户账户之中。那么在这个活动中,攻击者用户A可以随机选择两个手机号,我们分别用用户B和用户C来代替这两个用户,那么攻击用户A邀请随机选择的这两个手机号,之后直接爆破短网址进行确认,则在B和C不知情的情况下完成了赏金的领取。

三、短网址服务漏洞

其实当短网址出现短网址被猜解、爆破的问题,那么是不是会出现其他的问题,所以我们还对其进行了其他的安全测试

1、SSRF安全问题

远程访问功能在过滤不严谨的情况下会造成SSRF,测试时使用自定义域名绑定一个内网地址之后进行访问,该短网址服务展示了长网址的TITLE,如下成功访问到了内网地址:

2、获取TITLE功能和展示长网址页面,在过滤不严谨的情况下,造成XSS。

部分短网址服务提供了长网址TITLE的展示功能和在当前页展示长网址的功能,在过滤不严谨的情况下也会造成xss。

如上图中cve为在展示长网址页面造成了xss问题。而同时取title并在页面上展示也会造成xss,比如可以构造payload:“</title><script>alert(1)<script><title>“。

3、sql注入问题

进行拼接查询时会造成SQL注入。在测试中我们先进行了and 1=1的测试,发现可以正常读取,如下图:

之后再进行数据库版本的联合注入,如下图:

四、短网址防御实践

对于短网址服务,建议以下措施提升安全性:

1、增加单IP访问频率和单IP访问总量的限制,超过阈值进行封禁。

2、对包含权限、敏感信息的短网址进行过期处理。

3、对包含权限、敏感信息的长网址增加二次鉴权。

五、影响范围

秉承“负责任的漏洞披露过程”,我们在测试过程中发现的短网址安全问题,均已通过对应SRC通知相关厂商,厂商均已快速修复完毕。

精力有限,未能一一测试,还请各厂商自测修复。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你造轮子:这个价值100万的短网址微服务,我送给你
网上已经有产品,用着还不错。可是,作为程序员,从零开始造轮子,开发一个属于自己的短网址服务器,这想法amazing!
程序员小助手
2020/04/08
5960
字节二面:100Wqps短链系统,如何设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?
码猿技术专栏
2023/05/01
4.5K1
字节二面:100Wqps短链系统,如何设计?
短网址(short URL)系统的原理及其实现
作者: 小猿大圣 https://segmentfault.com/a/1190000012088345 背景 提供一个短址服务。 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?
前端教程
2018/03/05
5.3K0
短网址(short URL)系统的原理及其实现
亿级数据判断 bitmap-布隆过滤器
假设我们使用redis缓存了商品信息,当我们请求进来时,首先经过的是redis,当redis不存在时,才会去查找mysql.然后将mysql的数据缓存到redis.
仙士可
2020/10/09
1.4K0
亿级数据判断  bitmap-布隆过滤器
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
8610
如何设计一个短链接系统
永久短网址生成 可以永久使用的短链接推荐
微博、短信、微信在推送信息的时候都有字符的数量限制,如果分享一个长网址,很容易就超出限制,发不出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。
全栈程序员站长
2022/09/02
6.8K0
永久短网址生成 可以永久使用的短链接推荐
HASH碰撞问题一直没真正搞懂?这下不用慌了
哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
架构精进之路
2021/01/20
6.6K1
HASH碰撞问题一直没真正搞懂?这下不用慌了
用 Redis 散列实现短网址生成器|文末福利
Redis 的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
每天晒白牙
2020/08/21
9920
用 Redis 散列实现短网址生成器|文末福利
如何实现一个短链接服务 | 短链接生成原理
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
梦溪
2021/08/09
19.4K3
URL短网址生成算法原理
短网址(Short URL),是在形式上比较短的网址,通过映射关系跳转到原有的长网址。
阳光岛主
2019/02/18
4.6K2
短网址原理及实现
首先,系统把一个长的地址,用一个算法转换成一个短码(或者系统生成一个唯一的id号),然后系统将这个短码和url的映射关系存储到数据库或者缓存中
earthchen
2020/09/24
9950
短网址系统
在微博里发布一条带网址的信息,微博会把里面的网址转化成一个更短的网址。只要访问这个短网址,就相当于访问原始的网址。
Michael阿明
2021/02/20
4.1K0
短网址系统
Go短网址项目实战---上
有些浏览器中的地址(称为 URL)非常长且/或复杂,在网上有一些将他们转换成简短 URL 来使用的服务。我们的项目与此类似:它是具有 2 个功能的 web 服务(web service):
大忽悠爱学习
2022/08/23
5990
Go短网址项目实战---上
【转】系统设计-第08章:短网址设计
在这一章中,我们将解决一个有趣而经典的系统设计面试问题:设计一个像tinyurl一样的URL缩短服务。
保持热爱奔赴山海
2024/10/29
1930
面试必备:如何将一个长URL转换为一个短URL?
前几天整理面试题的时候,有一道试题是《如何将一个很长的URL转换为一个短的URL,并实现他们之间的相互转换?》,现在想起来这是一个绝对不简单的问题,需要考虑很多方面,今天和大家一起学习研究一下!
Java后端技术
2018/08/09
7.7K0
面试必备:如何将一个长URL转换为一个短URL?
常见分布式应用系统设计图解(十三):短网址系统
短网址系统可能是最常见的分布式系统设计问题之一了,本身从业务需求上说,读远多过写,而且数据结构确定且简单,数据量小,还易于使用缓存,因此本身难度在分布式系统的问题里面算是比较低的。另外,这个系统本身 “分布式” 的特性也比较弱,而且从组件图的角度来说,没有多少是 “可画的” ,因此之前也就没有介绍它。不过后来我改变想法了,我觉得还是可以总结总结,特别是可以把一些相关的特殊需求考虑进去。
四火
2022/07/19
5100
常见分布式应用系统设计图解(十三):短网址系统
使用 Serverless 创建一个简单的短网址服务
serverless init flask-starter --name url-shortener
donghui
2021/01/06
1.1K0
使用 Serverless 创建一个简单的短网址服务
PHP实现短网址功能,附代码
使用PHP实现短网址功能,支持短网址生成及跳转功能,暂不支持短网址解析,可以自定义开发反解析功能。实现原理是依据26个小写字母+26个大写字母+0-9数字,组成随机字符串。共计支持500多亿的组合模式,段时间内够用户使用。
申霖
2019/12/27
1.5K0
单点登录与权限管理本质:cookie安全问题
继续介绍「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,前一篇文章介绍了单点登录概念,以CAS协议的基本流程为例讲解了系统间的交互过程,过程中,cookie的设置和传输涉及的比较多,如何保证cookie的安全性,是这篇文章要介绍的。
情情说
2018/04/27
1.3K0
单点登录与权限管理本质:cookie安全问题
挖洞案例-短链接安全之越权
短网址服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短。用户访问缩短后的URL时,通常将会重定向到原来的URL。短网址服务主要起源于一些具有字数限制的微博客服务,但是现在广泛用于短信、邮件等。
用户1467662
2019/11/19
1.6K0
挖洞案例-短链接安全之越权
相关推荐
手把手教你造轮子:这个价值100万的短网址微服务,我送给你
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档