WebHook,网络钩子,本意是让信息收到更新的时候第一时间知道,让平台主动发送请求到用户预设的接受网络地址,并且不用耗费太多计算的产物,对安全的要求是最多的。
TelegramWebHook,用于PHPLang,JSLang。我的母语就是PHP。
有一天,我在Telegram看到一个担保发布的Bot,号称免费克隆骰子游戏,这勾起了我的好奇(主要是我看他的实现语言是PHP。
我注册了个Bot,看了一下,还不错,突然,一个奇怪的念头在我的脑袋里冒出。
我通过 /getwebhookinfo 查询到了WebHook的地址,访问了过去。没想到! 真的没想到!竟然返回了200(请求成功了)!
这意味着什么?这意味着我可以伪造来自Telegram的请求啊。这样的话,我不就可以盈利了…?说干就干,我截取了一个TelegramRequst,转发给Bot,
结果我立马收到了回应! 成了!我都没想到这么简单。
SO,结束了,并没有,如果这位开发者有经验的话,一定会使用随机生成的WebHookURL,但是偏偏很巧,这位开发者使用了从0到X的顺序排列,以至于我可以“猜”出来然后作弊。
Tips:该开发者和担保使用了FastAdmin产品作为后端产品,其实这个也是有bug的,这都是后话了…
于是我Rep给了开发者,开发者很快的回复了我,并且做了IP限制(结果给他们老板IP限制了),我们又聊了很多安全性的问题和开发难题,并分享了自己的项目。
所以说,我们该怎么预防呢?
首先,就是信任问题,你的这个URL是暴露在公网上的,你就有责任处理好信任问题。计算机学有个叫 零信任 的概念,就是这个的极端,也是极致的安全。

1./getwebhookinfo 是返回了个 ip_adress 是Telegram发送WebHook的服务器IP,可以跟据这个IP手动/自动加白。

2.Telegram官方在 /setwebhook 的时候提示提供了一个 secret_token 的字段的,用官方的话解释说就是
A secret token to be sent in a header “X-Telegram-Bot-Api-Secret-Token” in every webhook request, 1-256 characters. Only characters A-Z, a-z, 0-9, _ and - are allowed. The header is useful to ensure that the request comes from a webhook set by you. |
用人话来讲,就是请求时携带一个密钥,你只要验证密钥就行了。
3.你还可以验证官方请求的时间戳,当然,高级的工具当然会更精细的伪造,我们不论。
4….防守的速度肯定比不上攻击的速度,没有天然的BUG,只有不细心的开发者,让我们一起来维护程序环境吧,记得为您的机器人/产品加上对应的安全防护哦~
发表回复