文章目录

优雅的在哔哩哔哩评论区发送链接


953 观看次数
1104 字数
12 评论

某一天我高兴的打开B站的某个教学视频,Up主也贴心的提供了链接,没想到。。。

竟然链接都是灰色的,还不能点!
不不,这一定是我的错觉,看看别的

还是一样!不能跳转了,灵魂没有了啊啊啊
然后发现官方发的链接还在!真可恶,一定是加了判断了,而这个判断为了在原有的基础上兼容一定是放在客户端了,我们来分析一下吧
首先我们来提交一个评论

在这里的提交列表我们可以明显的看到这个comment.min.js的存在,接下来格式化并分析它

果然不出所料我找到了这个用于判断的正则表达式列表,接下来我们copy下来重点分析一下
(http(s)?:\/\/)?([a-z0-9A-Z]+.)?(bilibili.(com|tv|cn)|biligame.(com|cn)|(bilibiliyoo|im9).com|biliapi.net|b23.tv|sugs.suning.com|kaola.com)(\$|\/|)([\/.$*?~=#!%@&-A-Za-z0-9_]*)(?![^<>]*>|[^"]*?<\/a)
大体意思就是匹配这些哔哩哔哩允许的域名,并且直接replace成为a标签。

但是仔细观察一下,会发现这个正则表达式有一个明显的漏洞!
所有匹配点号的东西都没有反斜杠!!!
是的你没看错,也不知道哔哩哔哩官方的员工是怎么写的这个东西,反正有时候就达不到应有的过滤效果
这样就造成了一个神马呢?

我们知道,正则表达式的括号代表一个组,问号代表可有可无,竖杠代表两边的都能匹配,我们着重看这一段
([a-z0-9A-Z]+.)?
大概就是这一段可有可无,用来匹配官方发的二级域名,比如space.bilibili.com,前面中括号代表匹配这里面的范围,就是字母和数字,没啥猫病对吧,可是后面问题就来了。这个加号和点号我觉得官方本意就是匹配中间那个点,但是没加反斜杠,意义就变成了:匹配英文数字再加一个任意的东西,于是我们可以做一个这样的域名:
dsbilibili.cn
后面是标准的在正则匹配内的东西,前面就是一个字母加上一个东西,也就是说我们只要注册任意一个选定域名前面加两个字母数字的东西就可以绕过哔哩哔哩的匹配。
然后我还真做了短链接
当然这个漏洞还没完。
我们继续看,发现在每个域名之间的点号还是没有加反斜杠!这样意味着我们还可以通过构造现有域名的二级来绕过。比如b234tv.boxpaper.club。为什么这样可以呢?我们看这个b23.tv,中间的点号代表任意的一个字符,所以只要随便替换一下就是二级域名,当然你不替换当三级我也无话可说。后面有一个(\$|\/|),意思是要么匹配$要么匹配/要么匹配一下空气,反正就是为了协作后面正则工作的,无大碍。然后后面就是([\/.$*?~=#!%@&-A-Za-z0-9_]*),这里面也有点号,也是任意的匹配,所以这样构造出来的二级域名后面就可以加正常的东西了,完全不会匹配失败的。

再进一步,我们把前面和中间的逗号都打上反斜杠,看看会发生神马,漏洞修复了嘛?

Nonono,看起来换成三级域名仍然是匹配到了。这又是为什么呢?
这时候我们就需要focus on这一句话啦
([\/.$*?~=#!%@&-A-Za-z0-9_]*)
这个好像是用来匹配后面的地址的,然鹅这里就有一个点号以及诸多没加反斜杠的东西。。
我们加一下
([\/\.\$\*\?~=#!%@&\-A-Za-z0-9_]*)
啊还没加呢,现在加

奇怪,明明改了呀?欸,我知道了!里面还匹配的点号了!
来把点号去掉
([\/\$\*\?~=#!%@&\-A-Za-z0-9_]*)

嘿嘿这下终于好了吧,别着急,换到官方的链接试试

emmmmm,看来这点号的作用还挺大的,但是去掉不能匹配完整,写上又能绕过,到底怎么办啊。。。
于是我就卡到这里了,正则表达式我还不怎么会啊啊啊。哪位大佬知道可以教教我。

最后来看一下绕过的效果叭!

当然咱也是希望哔哩哔哩官方能第一时间修复这个Bug,毕竟用户体验至上嘛!
本人写正则的能力实在欠缺所以先不弄修复的代码啦!


评论区

12 条评论呢

0.Rorical
2020 April 8th

http://b234tv.rthe.net/

添加新评论