您的当前位置:首页正文

[短信验证码安全]请给你的短信验证码接口加上SSL双向验证

来源:要发发知识网

序言

去年年底闲来几天,有位同事专门在网上找一些注册型的app和网站,研究其短信接口是否安全,半天下来找到30来家,一些短信接口由于分析难度原因,没有继续深入,但差不多挖掘到20来个,可以肆意被调用,虽然不能控制短信内容,但可以被恶意消耗,或者用于狂发信息给那些不喜欢的人。

漏洞分析

短信接收方无法约束

由于是注册型接口,接收方往往都是平台内不存在的手机号,所以无法约束。

接口请求方无法约束

调用频次无法约束

一般的,接口开发者可能会想到通过抓取接口请求者的ip,进行频次约束,但实现是,他们拿到只是请求者的公网ip,有可能一个体量很大的局域网用户,接口开发者抓取到的都是他们的同一个公网ip,所以通过ip约束在很多场景下是不能使用的。

漏洞原因

原因其实很简单,接口开发者无法知道哪些请求是合理的,有些请求是不合理或恶意的,因为所有请求者都没有身份信息。

漏洞填补

  • 如果你的注册功能是web页面,最好加上验证码功能,但使用便利性会打折。
  • 如果你的注册功能是手机端,那就上SSL双向验证,中间人既无法分析你的接口,也无法发起请求连接到你接口服务,更不用说请求你的接口。

SSL/TLS双向验证

单向验证

双向验证

客户端证书

客户端证书我们不需要花钱去购买,使用openssl tools来自颁发就可以,服务端一般验证其thumdata是否满足就可以了。

安全的 core短信接口

回到实际干活撸代码阶段,我们可以把短信接口独立出来,做单独一个服务,其提供的只有短信功能的接口,接口必须双向证书验证,使用 kestrel ,我们很容易加入验证客户端的代码逻辑。

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
        .UseKestrel((context, options) =>
        {
            var port = context.Configuration.GetValue<int>("SSL:Port");
            var serverCertFile = context.Configuration.GetValue<string>("SSL:ServerCertFile");
            var serverCertPassword = context.Configuration.GetValue<string>("SSL:ServerCertPassword");
                    
            options.Listen(IPAddress.Any, port, listenOptions =>
            {
                var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions()
                {
                    ServerCertificate = new X509Certificate2(serverCertFile, serverCertPassword),
                    ClientCertificateMode = ClientCertificateMode.RequireCertificate,
                    ClientCertificateValidation = (cer, chain, error) =>
                    {
                        // 你的验证逻辑
                    },
                };
                listenOptions.UseHttps(httpsConnectionAdapterOptions);
            });
        })
        .UseStartup<Startup>();
    }
}

Openssl生成cer、key和pfx

openssl genrsa -out openssl.key 1024
openssl req -new -x509 -key openssl.key -out openssl.cer -days 3650 -subj /CN=localhost
openssl pkcs12 -export -out openssl.pfx -inkey openssl.key -in openssl.cer
好书推荐、视频分享,与您一起进步